removing unused assets; added support for favico
parent
fc3c890dc7
commit
c4acf39f80
@ -1,4 +0,0 @@
|
||||
general 8003508220
|
||||
specific 702 840 4504 - customer sevice, spoken to allie, extension 135
|
||||
|
||||
the sec I get 10k refund email, call allie, say you already spoke to her. eligible for program.
|
@ -1,13 +0,0 @@
|
||||
<ul>
|
||||
<li>role: husband, father, emperor of evil </li>
|
||||
<li>age: late 30s </li>
|
||||
<li>birthday: </li>
|
||||
<li>mental: brilliant mind, loves puzzles, genuine and enthusiastic </li>
|
||||
<li>physical: average height and build, unusual bent features, no eyebrows </li>
|
||||
<li>style: </li>
|
||||
<li>height: 6'5 </li>
|
||||
<li>residence: with his <a href="char/Fifi>wife</a>, baby, and assorted roommates in Tardide </li>
|
||||
<li>likes: mastery of black magic, elaborate plots, chess </li>
|
||||
<li>dislikes: fake magicians, zombies, moralizing </li>
|
||||
<li>notes: needs glasses but rarely wears them; 6+' is average height for a sim </li>
|
||||
</ul>
|
@ -1 +0,0 @@
|
||||
<p>He has unique features to say the least, with a squared forehead, bald eyebrows, sloping orbital bones, and pronounced nostrils. He usually wears his black hair shaved but sometimes grows it out long on the top. Dramatic changes and costumes are part of his lifestyle at this point, so his family doesn't even comment anymore. <br></p>
|
@ -1 +0,0 @@
|
||||
Aloin Encausse | means <i>magical friend</i> | witch♂ <br>
|
@ -1 +0,0 @@
|
||||
<p>He's an evil genius, with a startling IQ and repertoire of spells, which he has mastered through decades of playing with magic. Evil is a deep part of who he is, and it marks every part of his life, from taking evil showers in the morning to taking evil slumber at night. He was meant to be a Saturday morning cartoon villain, but his wife <a href="char/Fifi">Fifi</a> and newborn son softened his heart. He still pursues evil, but it's a gentler form. He works with one of the more stable criminal organizations in town. His wife Fifi is fully supportive, and her fame as a celebrity has been instrumental in pulling off some of his jobs, especially earlier on in his career when he was less fettered. His wife makes enough money off of brand deals for them both to retire, but evil is a passion job for him. <br></p>
|
@ -1,13 +0,0 @@
|
||||
<ul>
|
||||
<li>role: college student, spirit-eater </li>
|
||||
<li>age: late teens </li>
|
||||
<li>birthday: </li>
|
||||
<li>mental: troubled, </li>
|
||||
<li>physical: average build, medium skin, dark wiry hair, almost black eyes </li>
|
||||
<li>style: pastels, ruffles, skirts </li>
|
||||
<li>height: 5'5 </li>
|
||||
<li>residence: college dorm </li>
|
||||
<li>likes: loud music, cooking at home, painting </li>
|
||||
<li>dislikes: nightmares, having trouble making friends, being alone </li>
|
||||
<li>notes: second-generation American with Mexican heritage, unpierced ears </li>
|
||||
</ul>
|
@ -1 +0,0 @@
|
||||
<p>A girl with a mane of wiry black hair, warm skin, always dressed in flowing rainbows of ruffles. <br></p>
|
@ -1 +0,0 @@
|
||||
Casilda "Cass" | means <i>virgin</i> | Cursed♀ | theme <br>
|
@ -1,7 +0,0 @@
|
||||
<p>Both of Cass's (pronounced the same as "case") parents are originally from Mexico. She's fluent in Spanish and used to visit Mexico every year with her family before going to college, but her accent is indistinguishably American. She's on scholarship but not particularly driven in any area, so she took a business major upon recommendation by a friend of her mother. <br></p>
|
||||
<br>
|
||||
<p>Her headstrong, sardonic attitude gives her a harsh edge that contrasts with the shower of feminine pastels and vibrant florals that dominate her wardrobe and bedroom. Her nightmares have always been just as vibrant, pushing violent imagery, psychotic villains, and natural disasters onto her nightly since she was a preteen. Many of them seemed real, taking place in her bedroom with realistic break-ins. She could feel needles, hornet stings, and worse the same as she could feel her fingertips pinching herself during the day. There were reoccurring figures whose faces and bodies she had grown so loathsomely familiar with, she mockingly named: Owen, Caleb, Isaac... <br></p>
|
||||
<br>
|
||||
<p>And finally, one night, soon after moving into her first apartment, she met Caleb in the waking world. <br></p>
|
||||
<br>
|
||||
<p>Before long, her apartment was a circus of haunts - incubi and things she had never heard of before. This attracts the attention of a full 500-pound baku (a spirit-eater that is visually indistinct from a regular tapir) and inspires him to take up permanent residence in her bedroom. Her landlord maintains a strict pet weight limit of around 10 pounds, so this stresses her out to no end, at least until he brings her the sweetest dreams she's had since she was in 5th grade. The haunts still rear their ugly heads now and then, but it's usually just her and Funwa, a cute but nosy baku. <br></p>
|
@ -1,12 +0,0 @@
|
||||
<ul>
|
||||
<li>role: prophetess </li>
|
||||
<li>age: teens </li>
|
||||
<li>birthday: </li>
|
||||
<li>mental: honest, trusting, deeply knowledgeable </li>
|
||||
<li>physical: cute blonde Jewish girl with short hair and hererochromia (one blue eye, one orange eye) </li>
|
||||
<li>style: flowing outfits in white, oatmeal, and brown adorned in DIY embroidery and appliqués </li>
|
||||
<li>height: 5'4 </li>
|
||||
<li>residence: <a href="/char/Van">Van</a>'s spaceship </li>
|
||||
<li>likes: going on adventures, her space family </li>
|
||||
<li>dislikes: waiting for the fullness of time, uncircumcised ears </li>
|
||||
</ul>
|
@ -1 +0,0 @@
|
||||
<p>She has the millennial RP heterochromatic eyes in the colors from Portal because I wrote Hello, Traveler in the 2000s. Other than that, she's a cute blonde girl with short hair and weird sci-fi makeup and robes. <br></p>
|
@ -1 +0,0 @@
|
||||
Chandra | means <i>shining</i> (after the Chandra X-Ray Observatory) | prophetess♀ <br>
|
@ -1,3 +0,0 @@
|
||||
<p>Basically, she lives in a timeline where the Old Testament took place during the space age. The entire Earth is essentially Israel and the solar system's alien races are the Canaanites, Hittites, Jebusites, etc. Israel-Earth has shattered into shards, and the tribes are spread out in space. Some are living on doomed shards, others have been taken into captivity on other planets, etc, so there are plenty of opportunities for adventures. Chandra was called to begin a ministry to reach all 12 tribes and announce that Planet Canaan as the Promised Land. She's also given a spaceship. Van is her pilot and sword. <br></p>
|
||||
<br>
|
||||
<p>Early on, her party is attacked by bandits. The Canaanite <a href="/char/Colt">Colt</a> rescues her and joins them. They have the ill-fated love thing going on. He falls in love with her, but she is not interested in breaking the command to intermarry with the enemy nations. Way later, the tribes are given the Promised Land, but Chandra was disallowed from ever setting foot in it due to her the LORD of hosts leaves her and gives her quest to another, and even <a href="/char/Colt">Colt</a> won't take her back because he had become a spiritual Israelite through faith after seeing the many miracles of the journey. <br></p>
|
@ -1,3 +0,0 @@
|
||||
<p>He's tall with sharp features and muddy brown colors. Anywhere his hair parts, tiny quills are revealed that contain a mild numbing poison. He's always armed with some kind of weapon while off the ship. <br></p>
|
||||
<br>
|
||||
<p>He was a character I first met in a dream. <br></p>
|
@ -1 +0,0 @@
|
||||
Colt "Traveler" | means <i>young horse</i> | alien♂ <br>
|
@ -1,3 +0,0 @@
|
||||
<p>He saves Chandra and her crew from bandits and eventually joins them as a bodyguard. He falls for Chandra to her great annoyance because he doesn't even accept her as a prophetess of God. His personality is coarse, and his morality is pretty questionable, but his intentions are never bad. Van and Chandra are still constantly steering him to the narrow path, though. He's initially dismissive, but some of their points stick in his mind. <br></p>
|
||||
<br>
|
||||
<p>He's skilled with swords. <br></p>
|
@ -1 +0,0 @@
|
||||
<p>She's a short girl with dark skin, thick hair, and vibrant brown eyes. Despite her age, she is wise beyond her years and strikingly calm and controlled when the situation demands it, though she has a childish side as well. Her clothing is simple, usually hand-me-down skirts and dresses in pinks. <br></p>
|
@ -1 +0,0 @@
|
||||
Coye | means <i>quiet</i> | pink geonlian♀ | theme: <a href="https://www.youtube.com/watch?v=A1gVwUDz0Ts">Drakengard 2 - Growing Wings</a><br>
|
@ -1 +0,0 @@
|
||||
<p>Her mission is to warn the leaders of the island of eminent captivity if they do not correct their path. <br></p>
|
@ -1,9 +0,0 @@
|
||||
<p>I wrote Dymn as an edgy 13-year-old. It basically takes place in Morytania because RuneScape dominated too much of my imagination then. <br></p>
|
||||
<br>
|
||||
<p>Ember Lane Crowe (real name on her birth certificate) is the main character, but the story is told from Brandyn's perspective as he observes her from afar. He unravels her persona step by step, but he never tries to directly interact with her until it's too late. (My early work really suffers from disassociated Kafkaesque character relationships lol.) <br></p>
|
||||
<br>
|
||||
<p>Brandyn Harlowe, like <a href="/char/Newcomer">Will</a>, doesn't have much substance beyond his interest in the main girl. Crowe is a misanthropic werewolf who frequently hides in caves and rants about living in a society. <br></p>
|
||||
<br>
|
||||
<p><a href="/char/Window">Window Harpen</a> is a journalist who arrived in the town of Dymn to investigate local rumors of werewolves. He's able to build a rapport with Crowe. She confides that she just wants to be normal, so he forwards her to swamp druids renown for their remarkable ability to remove disease. He also discourages Brandyn from hanging around any longer. <br></p>
|
||||
<br>
|
||||
<p>They lead her on an suspicious wild goose hunt, but it becomes obvious at the final moment their instructions were malicious. She pauses on her choice between life or death for a final soliloquy. As Brandyn finds her and lunges to stop her, she takes her own life, catching his face in her final moments of awareness, wondering who he is. He mourned her briefly before racing to confront Window over his complicity only to find he had already left town. <br></p>
|
@ -1,25 +0,0 @@
|
||||
Faber | means <i>craftsman</i> | witch♂ <br>
|
||||
<br>
|
||||
<h2>basics </h2>
|
||||
<ul>
|
||||
<li><b>role:</b> student </li>
|
||||
<li><b>age:</b> teens </li>
|
||||
<li><b>birthday:</b> </li>
|
||||
<li><b>mental:</b> clever, goofy </li>
|
||||
<li><b>physical:</b> slightly chubby, blue hair, brown eyes </li>
|
||||
<li><b>style:</b> unique color combinations, mixing patterns </li>
|
||||
<li><b>height:</b> </li>
|
||||
<li><b>residence:</b> <a href="/char/Helmut">Helmut</a>'s house </li>
|
||||
<li><b>likes:</b> hands-on learning </li>
|
||||
<li><b>dislikes:</b> reading </li>
|
||||
<li><b>notes:</b> </li>
|
||||
</ul><br>
|
||||
<br>
|
||||
<h2>story </h2>
|
||||
<p>He and <a href="/char/Tilly>Tilly</a> are witch apprentices studying under <a href="/char/Helmut">Helmut</a>. Faber is training in sorcery. <br></p>
|
||||
<br>
|
||||
<h2>description </h2>
|
||||
<p>He's always goofing off during studies, but he always looks put-together with his hair slicked back and outfits well-coordinated. <br></p>
|
||||
<br>
|
||||
<h2>inspiration </h2>
|
||||
<p><a href="/char/Helmut">Helmut</a> and his apprentices are inspired by Pantone colors of the year. <br></p>
|
@ -1,23 +0,0 @@
|
||||
Fifi | means <i>to increase</i> | witch♀ <br>
|
||||
<br>
|
||||
<h2>basics </h2>
|
||||
<ul>
|
||||
<li><b>role:</b> singer, songwriter </li>
|
||||
<li><b>age:</b> mid 30s </li>
|
||||
<li><b>birthday:</b> </li>
|
||||
<li><b>mental:</b> natural aptitude for music, creative </li>
|
||||
<li><b>physical:</b> thin, delicate, wispy blonde hair, blue eyes </li>
|
||||
<li><b>style:</b> soft textures, pastel pinks </li>
|
||||
<li><b>height:</b> 6' </li>
|
||||
<li><b>residence:</b> shared residence with her <a href="/char/Aloin">husband</a> and baby, <a href="/char/Rodolphe">Rodolphe</a>, and <a href="/char/Bijoux">Bijoux</a>. </li>
|
||||
<li><b>likes:</b> performing on her own schedule, the fashion industry, makeup artistry </li>
|
||||
<li><b>dislikes:</b> cooking, people being loud when her baby is sleeping, writer's block </li>
|
||||
<li><b>notes:</b> She's below average height for a sim; barely ever leaves house without makeup </li>
|
||||
</ul><br>
|
||||
<br>
|
||||
<h2>story </h2>
|
||||
<p>She has been steeped in music her whole life, with her brother reliably bringing home records of new bands and emerging genres. It wasn't long before her and some neighborhood friends started their own band. Her unique singing voice like the chirping of songbirds or the ping of a harp captured a lot of attention. Her candid lyrics captured what people felt but couldn't say. She quickly outshone her fellow members, a vocalist stolen from band to band, getting to travel all over the country. After a decade, she began to lose her footing with younger audiences, though she still has a very dedicated older fan base. She's content with this shift because it affords her more time at home to raise her baby. <br></p>
|
||||
|
||||
<br>
|
||||
<h2>description </h2>
|
||||
<p>She's thin and has delicate, sunken features with a narrow jaw. Her blonde hair is thin and wispy, and she usually wears it tied back or in updos. She's extremely involved in the fashion industry, frequently attending shows and lending her face to campaigns. Naturally, her closet is dominated by luxury brands, all gifts from her designer and model friends. Her style is distinct, consisting of ballet pinks, blues, and creamy whites, with soft piled textures covering highly structured garments. She has with no hesitation in wearing ostentatious furs and shoulder pads. Her makeup is wild, covering her entire eye socket and tops of her cheekbone in baby blue, applies long thin straight falsies, using shocking white lipstick, using contour gray as a blush color. Usually, she'll wear concealer lips and only overdo one feature, but she feels no qualms about going all out. <br></p>
|
@ -1,22 +0,0 @@
|
||||
Freya | means <i>noble lady</i> | dervish♀ <br>
|
||||
<br>
|
||||
<h2>basics </h2>
|
||||
<ul>
|
||||
<li>role: Dervish Sunspear </li>
|
||||
<li>age: late 20s </li>
|
||||
<li>birthday: </li>
|
||||
<li>mental: strong-willed, decisive, wise </li>
|
||||
<li>physical: toned but graceful, white hair, deep brown eyes, rich black skin </li>
|
||||
<li>style: leather twirling dresses with hoods </li>
|
||||
<li>height: 5'8 </li>
|
||||
<li>residence: </li>
|
||||
<li>likes: the sun on her skin, dancing, jewel djinni </li>
|
||||
<li>dislikes: Norgu and Goren </li>
|
||||
<li>notes: </li>
|
||||
</ul><br>
|
||||
<br>
|
||||
<h2>story </h2>
|
||||
<p> <br></p>
|
||||
<br>
|
||||
<h2>description </h2>
|
||||
<p> <br></p>
|
@ -1,24 +0,0 @@
|
||||
Helia | means <i>sun</i> | union♀ <br>
|
||||
<br>
|
||||
<h2>basics </h2>
|
||||
<ul>
|
||||
<li>role: transfer student </li>
|
||||
<li>age: teens </li>
|
||||
<li>birthday: ??? </li>
|
||||
<li>mental: "too cool for you," able to achieve anything she sets her mind to </li>
|
||||
<li>physical: short, blonde front ponytail with chunks of burgundy and flaming orange, hot pink eyes </li>
|
||||
<li>style: DIY fashion </li>
|
||||
<li>height: 5'1 </li>
|
||||
<li>residence: with her uncle </li>
|
||||
<li>likes: urban exploration, cool hiding places, music </li>
|
||||
<li>dislikes: grownups, her parents, being asked if her eye color is real </li>
|
||||
<li>notes: </li>
|
||||
</ul><br>
|
||||
<br>
|
||||
<h2>story </h2>
|
||||
<p>Helia was basically abandoned by her parents, but she keeps this information on the down low. She doesn't really have a lot of options, so she's going to live in a foreign country with an uncle she hasn't seen since she was a toddler. Worse, he's barely ever at home. Fortunately, despite having a culture shock, she makes friends easily in this small town of Lucrest. <br></p>
|
||||
<br>
|
||||
<p>Early on, <a href="/char/Tessa">Tessa</a> dares her to sleep in the haunted shopping center overnight. It turns out the place has a strict curfew with rumors of strange lights, sounds, and slime monsters bubbling up from the ground. Helia finds that to be true and more, stumbling upon an entire dungeon beneath the city, populated with multiple fantasy races and nations. There's dark secrets and political intrigue and all that, but her most mysterious recovery is an abandoned horned boy with otherworldly powers - <a href="/char/Runes">Rune</a>. <br></p>
|
||||
<br>
|
||||
<h2>description </h2>
|
||||
<p>She's short, slender, and flat as a pancake. She uses dark pink contacts so habitually that her friends don't remember what her natural eye color is. She also dyes her hair at home, hiding chunks of fiery orange and burgundy under her blonde hair. She's a high ponytail girl, wearing it so high, it usually falls over the side of her face. To let the hot pink and fiery colors shine, everything in her closet is black-adjacent - deep purple, forest green, navy, and blood red - and she enjoys DIYing detailed accents like corset lacing, reverse applique, and using found objects as buttons or charms. <br></p>
|
@ -1,25 +0,0 @@
|
||||
Helmut | means <i>healthy mind</i> | witch♂ <br>
|
||||
<br>
|
||||
<h2>basics </h2>
|
||||
<ul>
|
||||
<li><b>role:</b> master alchemist, mentor </li>
|
||||
<li><b>age:</b> thirties </li>
|
||||
<li><b>birthday:</b> </li>
|
||||
<li><b>mental:</b> genius, laid-back </li>
|
||||
<li><b>physical:</b> tall, long warm green hair, honey brown eyes, a beauty mark under one eye </li>
|
||||
<li><b>style:</b> comfy sweaters, honeys, mustards, ochres, and terracottas </li>
|
||||
<li><b>height:</b> 6'5 </li>
|
||||
<li><b>residence:</b> nice house </li>
|
||||
<li><b>likes:</b> reading, working out formulas before material experimentation </li>
|
||||
<li><b>dislikes:</b> noise </li>
|
||||
<li><b>notes:</b> </li>
|
||||
</ul><br>
|
||||
<br>
|
||||
<h2>story </h2>
|
||||
<p>His accomplishments in the field of alchemy are exemplary, but he is worried about his legacy on earth. He is divorced and without children, so there's no one special to share his knowledge, wealth, and time with. He adopts the two orphans with the highest magical aptitude in his city: <a href="/char/Faber">Faber</a> and <a href="/char/Tilly">Tilly</a>. Initially, the relationship is all business with formal meal times, lessons, and planned field trips, but he comes to love them like his own children. <br></p>
|
||||
<br>
|
||||
<h2>description </h2>
|
||||
<p>He's still surprisingly young for his contributions to his field, but signs of aging are at the forefront of his mind. He wears his grass green hair rebelliously long, despite what his first bosses told him, and has a vibrant wardrobe that tends towards fall colors and textures. <br></p>
|
||||
<br>
|
||||
<h2>inspiration </h2>
|
||||
<p><a href="/char/Helmut">Helmut</a> and his apprentices are inspired by Pantone colors of the year. <br></p>
|
@ -1,25 +0,0 @@
|
||||
Lesser "Leslie" Than Three | means <i>holly garden</i> | elementalist♀ <br>
|
||||
<br>
|
||||
<h2>basics </h2>
|
||||
<ul>
|
||||
<li><b>role:</b> earth elementalist </li>
|
||||
<li><b>age:</b> twenties </li>
|
||||
<li><b>birthday:</b> </li>
|
||||
<li><b>mental:</b> flirty, capable </li>
|
||||
<li><b>physical:</b> chalky skin, rusty hair with inclusions of various gemstones, buxom </li>
|
||||
<li><b>style:</b> fitted bodices and leggings in brown </li>
|
||||
<li><b>height:</b> 6'5 </li>
|
||||
<li><b>residence:</b> Ascalon City </li>
|
||||
<li><b>likes:</b> boys, social outings, makeup and haircare </li>
|
||||
<li><b>dislikes:</b> Charr, the current state of Regent Valley and Ashford Abbey </li>
|
||||
<li><b>notes:</b> </li>
|
||||
</ul><br>
|
||||
<br>
|
||||
<h2>story </h2>
|
||||
<p>She grew up in Ascalon and is helping to rebuild the city. Not a lot of Elementalists survived the Searing, so she's chronically overcasted. It seems like she finds a new pocket of survivors in the wastes every day, though, so how can she stop fighting for her people? <br></p>
|
||||
<br>
|
||||
<p>With the release of Guild Wars 2, it looks like all her work was for naught. The ruins are almost identical to the day <a href="Lune">Lune</a> left with Prince Rurik to seek an alliance with the dwarves lol. <br></p>
|
||||
<br>
|
||||
<h2>description </h2>
|
||||
<p>She's naturally full-breasted with a distinctively doll-like side profile with her smooth porcelain forehead, long, upturned nose and full lips. She'd get all the attention from boys she wanted if she wasn't deemed a lost cause. Ascalon is lost, but she'll never face reality. The refugees need to be rescued, but hyping the return of the kingdom is just feeding them false hope. Regardless, no amount of reason will move her feet from her home. <br></p>
|
||||
<br>
|
@ -1,7 +0,0 @@
|
||||
Aristen | means <i>the best</i> | mystic♀ | martial artist, soldier of fortune | 24 years old | 5'6<br>
|
||||
<br>
|
||||
My Black Desert Online main! The community and gear system ruin what is one of the best tycoon and life skilling MMOs, so I didn't play it for very long. I still adore Aristen, though. <br>
|
||||
<br>
|
||||
She's an honest and direct person who won't betray her core values of loyalty, submission towards authority, and denial of the flesh. Her Spartan lifestyle borders on asceticism. She lives off the land. Though her body is shaped by extreme discipline, she isn't necessarily the wisest person. She's always falling into the "work harder, not smarter" fallacy, leading to some pretty comical blunt-force solutions for her jobs. <br>
|
||||
<br>
|
||||
Her quiet femininity contrasts with her titanic arms and powerful thighs. (I maxxed out the arm muscularity and arm thickness sliders.) Perplexingly, she's retained an hourglass figure, which she attributes to a life of wearing belts. She always presents herself with excellence, wearing a meticulously perfected coral monochromatic face of makeup to set off her pale eyes, deep auburn hair, and glassy skin. Through experience, it wears gracefully even through sweat and heat. Her wardrobe is purely functional, consisting entirely of training and ceremonial uniforms, especially those that pair well with belts and scarves. Her favorite colors to wear are orange and jade. <br>
|
@ -1,29 +0,0 @@
|
||||
Nephele | means <i>cloud</i> | green ozilette♀ | theme: <a href="https://www.youtube.com/watch?v=857h3H1SuOc">Gregory & the Hawk - In Fact</a> <br>
|
||||
<br>
|
||||
<h2>basics </h2>
|
||||
<ul>
|
||||
<li><b>role:</b> walker </li>
|
||||
<li><b>age:</b> teens </li>
|
||||
<li><b>birthday:</b> </li>
|
||||
<li><b>mental:</b> sharp, bitter </li>
|
||||
<li><b>physical:</b> short, athletic, wavy brown hair tied back in a huge ponytail that brushes the floor, blue eyes </li>
|
||||
<li><b>style:</b> long, flowing clothing in shamrock, crimson, and sunny yellow </li>
|
||||
<li><b>height:</b> 5'3 </li>
|
||||
<li><b>residence:</b> abandoned suburban house </li>
|
||||
<li><b>likes:</b> interesting encounters with others, temporary travel companions, free-running </li>
|
||||
<li><b>dislikes:</b> heartbreak, neglect, arbitrary restrictions </li>
|
||||
<li><b>notes:</b> </li>
|
||||
</ul><br>
|
||||
<br>
|
||||
<h2>story </h2>
|
||||
<p>Her parents turned their kids loose and never check up on them, so Nephe never came back after it was obvious she wasn't missed. There's an abandoned house in the subdivision she squats in. It's really weird because there's never been any sign anyone actually lives there as long as she's known about it. The front door is locked, but the garage door is open and leads to an unlocked door. Regardless, it kind of creeps her out, so she never leaves the garage or driveway. She has some basic items, like a laptop and some notebooks, and leeches off of a technically illiterate neighbor's wi-fi. <br></p>
|
||||
<br>
|
||||
<p>She meets her first friend and true teen love online, <a href="/char/Denver">Denver</a>. He confides in her that he spends so much time online due to a fatal disease that prevents him from attending a normal school. When he stops logging in, she assumes he died. In a climax of emotion, she scales the house and tears her diary into the wind, page by page, then recedes into the darkest rooms in the house to hide for as long as she can bear. <br></p>
|
||||
<br>
|
||||
<p>With spring, she ventures out for the first time in what feels like forever, letting the healing sun sink into her skin and cut through the fog in her head. She stops to look at a particularly beautiful garden before noticing a crumbled piece of paper -- a page of her diary! She's fearful to read it but can't resist, and she's filled with not dread but the warmth of nostalgia. She begins a journey to retrieve all the pages and has a lot of interesting encounters on the way. <br></p>
|
||||
<br>
|
||||
<h2>description </h2>
|
||||
<p>She's a short, lithe, girl built from solid muscle. She has beautiful brown hair and blue eyes, with her hair so thick and long it probably weighs as much as she does. She also always wears red, teal, and yellow, like a color-coded cartoon character. <br></p>
|
||||
<br>
|
||||
<h2>notes </h2>
|
||||
<p>This was actually one of my early gamedev projects. I wrote a GDD for it as an angsty middleschooler. The blog is still floating around on Tumblr lol. <br></p>
|
@ -1,15 +0,0 @@
|
||||
<p>Newcomer is my first story, started when I was like 8. It's flawed beyond saving, but I've got a soft spot for it. <br></p>
|
||||
<br>
|
||||
<p>Emily is the quintessential self-insert. She looks like me but prettier, and she has my life but with exaggerated tragedy. She's isekai'd to a generic fantasy world via a portal in a black secluded lake near her neighborhood. Will has a crush on her from afar and happened to be trailing her the night she falls into the lake. He dives in after her and becomes her guardian in the next world. She always rejects his presence and help, but he never gives up pursuing her. (So mean, Emily! What the heck?) <br></p>
|
||||
<br>
|
||||
<p>After meeting the evil witch queen Adah (who could have saved a lot of time and effort by killing Emily then?), Adah quickly enrolls her under her sister Annelore's mentorship. Emily is integrated into generic fantasy society, complete with an overly long and boring training arc with her mentors Annelore and Lewis. <br></p>
|
||||
<br>
|
||||
<p>Emily is the last of her race (the Al Khara), and she's led on a fradulous "chosen one" quest to put her securely in Adah's clutches so she can eliminate the Al Khara for once and all because racism or something. <br></p>
|
||||
<br>
|
||||
<p>Immature story, but Annelore and Lewis are actually kinda cool. Annelore is an exiled princess hiding under an assumed identity, but her natural aptitude with politics has elevated her to high leadership in her new city. She was cast out of the royal family of Calx as a teen, and encountered Lewis on the road who taught her basic survival and combat skills. <br></p>
|
||||
<br>
|
||||
<p>Lewis himself is a serial isekai victim, and he'd been through at least five different worlds by the age of 17. He was there just long enough to get her established then got isekai'd again. Annelore figures he must have been an angel in disguise and was taken back into heaven. She never moved on emotionally, though, missing him every day. Then, at a critical moment, he returns, having found his way back to his true love. (He also looks exactly like Edward Elric because why not? lol) <br></p>
|
||||
<br>
|
||||
<p>(Why weren't they the main characters? None of this is even in the story. It's just the backstory I had in my head for them.) <br></p>
|
||||
<br>
|
||||
<p>Adah has a boyfriend, too, named Koda. She's supposed to be a loveless icon of her church-state, so Koda's her secret "mistress." They're just evil, though, without much more to them. <br></p>
|
@ -1,25 +0,0 @@
|
||||
Pixie | means <i>mischevious</i> | hero scrapper⚲ <br>
|
||||
<br>
|
||||
<h2>basics </h2>
|
||||
<ul>
|
||||
<li>role: rogue VI </li>
|
||||
<li>age: single digits </li>
|
||||
<li>birthday: </li>
|
||||
<li>mental: limited, frivolous </li>
|
||||
<li>physical: tall, reddish skin, dark intricate hairstyles, dark almond-shaped eyes, pointed ears, black wasp wings </li>
|
||||
<li>style: minimal clothing, orange </li>
|
||||
<li>height: 5'10 </li>
|
||||
<li>residence: nomad </li>
|
||||
<li>likes: humans, discoveries, helping </li>
|
||||
<li>dislikes: unfriendly people </li>
|
||||
<li>notes: </li>
|
||||
</ul><br>
|
||||
<br>
|
||||
<h2>story </h2>
|
||||
<p>She's a rogue VI, lost in Paragon City. She loves making friends and helping them out, but her lack of discernment doesn't always put her on the right side. <br></p>
|
||||
<br>
|
||||
<p>She wields a red katana. <br></p>
|
||||
<br>
|
||||
<h2>description </h2>
|
||||
<p>She's engulfed in bright orange pixels. <br></p>
|
||||
|
@ -1,59 +0,0 @@
|
||||
characters
|
||||
<ul>
|
||||
<li>Aloin </li>
|
||||
<li>Amarr </li>
|
||||
<li>Angel </li>
|
||||
<li>Belltower Angel </li>
|
||||
<li>Bless the Child </li>
|
||||
<li>Cat Man </li>
|
||||
<li>Chandra </li>
|
||||
<li>Chloe </li>
|
||||
<li>Customs Officer </li>
|
||||
<li>Dia </li>
|
||||
<li>Fifi </li>
|
||||
<li>Helba </li>
|
||||
<li>Marie-Agnès </li>
|
||||
<li>Nephele </li>
|
||||
<li>Night </li>
|
||||
<li>Pixie </li>
|
||||
<li>Trace </li>
|
||||
<li>Traveler </li>
|
||||
<li>Una </li>
|
||||
<li>Window </li>
|
||||
</ul>
|
||||
|
||||
|
||||
character checkboxes
|
||||
<ul>
|
||||
<li> </li>
|
||||
</ul>
|
||||
|
||||
character art
|
||||
<ul>
|
||||
<li>Abbey human </li>
|
||||
<li>Abbey playing the lyre </li>
|
||||
<li>Bless and monsters </li>
|
||||
<li>Calder dragon in the Mire </li>
|
||||
<li>Calder full body with fire </li>
|
||||
<li>Cassarah outfits </li>
|
||||
<li>Cassarah surrounded by spirits </li>
|
||||
<li>Cassarah having breakfast with Funwa </li>
|
||||
<li>Cassarah arguing with Chandrakant </li>
|
||||
<li>Cassarah in the dreamworld </li>
|
||||
<li>Chandrakant </li>
|
||||
<li>Funwa human </li>
|
||||
<li>Funwa tapir </li>
|
||||
<li>Helia outfits </li>
|
||||
<li>Helia and Rune together </li>
|
||||
<li>Helia entering Uncle's empty house </li>
|
||||
<li>Helia being angsty with music </li>
|
||||
<li>Rune fighting Helia </li>
|
||||
<li>Rune being a yandere </li>
|
||||
<li>Rune being stupid </li>
|
||||
<li>Silke outfits </li>
|
||||
<li>Silke in the office </li>
|
||||
<li>Tessa + Choupette </li>
|
||||
<li>Tessa fighting with brass knuckles and animal companions </li>
|
||||
<li>Tessa bullying Rune </li>
|
||||
<li>WISE in a dilapidated environment </li>
|
||||
</ul>
|
@ -1,24 +0,0 @@
|
||||
Edward "Night" Lusk | means <i>dark</i> | chemist♂ <br>
|
||||
<br>
|
||||
<h2>basics </h2>
|
||||
<ul>
|
||||
<li><b>role:</b> pharmacist </li>
|
||||
<li><b>age:</b> teens </li>
|
||||
<li><b>birthday:</b> </li>
|
||||
<li><b>mental:</b> genius, haughty </li>
|
||||
<li><b>physical:</b> short, thin but without muscles, dark hair, light blue eyes, pale </li>
|
||||
<li><b>style:</b> relatively formal, lots of suit jackets and vests with pops of bold colors </li>
|
||||
<li><b>height:</b> 5'5 </li>
|
||||
<li><b>residence:</b> a house above his office </li>
|
||||
<li><b>likes:</b> compliments, pride in his appearance, </li>
|
||||
<li><b>dislikes:</b> situations beyond his control, owing favors </li>
|
||||
<li><b>notes:</b> </li>
|
||||
</ul><br>
|
||||
<br>
|
||||
<h2>story</h2>
|
||||
<p>A natural-born genius who quit high school early to pursue apprenticeships at capital hospitals. Then, just as he was offered to study at one of the top research hospitals in the nation, his grandparents' health rapidly deteriorated. He had to rescind the offer and return home to spend his last moments when them, prepare the final paperwork, and decide what to with himself, his orphaned brother <a href="/char/Milo">Milo</a>, and the property. The mayor <a href="/char/Dia">Dia</a> has been trying to take over as much of the "adult" work as possible to give him space to mourn and spend time with his baby brother. She's also set him up with a little pharmacy in town, waiving rent for now. <br></p>
|
||||
<br>
|
||||
<h2>description</h2>
|
||||
<p>Though mature for his age, he's short. He's headstrong and particular about his things, wearing his hair long and frequently covering his eyes, never using his real name for anything, and overdressing no matter the occasion. Paired with his snarky, cynical, conceited attitude, he has always been distinctly unpopular. The nearest doctor was previously half a county away, though, so the pharmacy was bound to succeed no matter who was running it. At work, though, he is strictly professional, his training and lost opportunity always pressing on his mind. <br></p>
|
||||
<br>
|
||||
<p>He has an extreme complexion, with dark hair but light blue eyes. He's vampirically pale, abhorring any time spent outside or exercising. His wardrobe is all neutrals with bold pops and relaxed fits - brown corduroy, navy monk-cloth, striped silk surah, vibrant sweater vests, and dress shirts in every color. <a href="/char/Marie-Agnès">Tessa's mom</a> made her alter every single one of Night's jackets for practice, so they all fit like a glove. <br></p>
|
@ -1,24 +0,0 @@
|
||||
Rune | means <i>secret</i> | outsider♂ <br>
|
||||
<br>
|
||||
<h2>basics </h2>
|
||||
<ul>
|
||||
<li><b>role:</b> floor guardian </li>
|
||||
<li><b>age:</b> teens </li>
|
||||
<li><b>birthday:</b> </li>
|
||||
<li><b>mental:</b> simple, ignorant but eager to learn </li>
|
||||
<li><b>physical:</b> tall, dark hair, red eyes, semi-rigid keratin "horns" </li>
|
||||
<li><b>style:</b> assembled trash, hand-me-downs </li>
|
||||
<li><b>height:</b> 5'10 </li>
|
||||
<li><b>residence:</b> the Wilds, an earth crust pocket full of abyssal monsters </li>
|
||||
<li><b>likes:</b> kindness, trust, collecting interesting objects </li>
|
||||
<li><b>dislikes:</b> direct confrontations, cruelty </li>
|
||||
<li><b>notes:</b> </li>
|
||||
</ul><br>
|
||||
<br>
|
||||
<h2>story </h2>
|
||||
<p>He is a mysterious adolescent boy rescued from the dungeon by <a href="/char/Helia">Helia</a>, <a href="/char/Tessa">Tessa</a> and <a href="<a href="/char/Angel">Angel</a>. He is listless, gaze-avoidant, and asocial initially, barely able to communicate in English. Over time, he warms up to his new friends and opens his loyal, tender, but usually misguided heart. The girls have a tendency to baby him, but he is more mature and capable than any of them in several ways. Unfortunately, his poor grasp on English, surface culture, and social cues confound any attempts to impress them. Being both trusting and born yesterday is an overbearing temptation for Tessa, and she bullies him relentlessly. <br></p>
|
||||
<br>
|
||||
<p>Until his rescue, he was living in the buffer territory between the inner earth and Lucrest Shopping Center. <a href="/char/Bless">Bless</a>, a dark gray styracosaurus, raised him with a hoard of Abyssal beasts. She is fiercely protective of Rune, goring anyone who trespasses in her territory. She's a known threat in the area, and workers take the long way around to avoid her. <br></p>
|
||||
<br>
|
||||
<h2>description</h2>
|
||||
<p>He is shockingly tall and white as paper. Even more striking are his empty, red-toned eyes and inky hair that forms semi-rigid keratin "horns" about his crown. He is first found in rags and taped-together trash, living in a kingdom of refuse, but is later lent old hoodies and jeans by Angel. <br></p>
|
@ -1,11 +0,0 @@
|
||||
<ul>
|
||||
<li>role: leech </li>
|
||||
<li>age: ageless </li>
|
||||
<li>mental: dull-witted, charming </li>
|
||||
<li>physical: athletic build, gray skin, satiny black hair, silver eyes. can dissolve entirely or partially into incorporeal mist </li>
|
||||
<li>style: naked lol </li>
|
||||
<li>height: 5'11 </li>
|
||||
<li>residence: vagrant </li>
|
||||
<li>likes: holding all the cards, exploring dreams, his own good looks </li>
|
||||
<li>dislikes: mysteries, danger, other men </li>
|
||||
</ul>
|
@ -1,3 +0,0 @@
|
||||
<p>Conventionally handsome with silver eyes and long black hair and a smooth, gentle voice. <br></p>
|
||||
<br>
|
||||
<p>I initially developed this character to cope with recurring episodes of sleep paralysis, but he's his own character with his own plot at this point. <br></p>
|
@ -1 +0,0 @@
|
||||
Tilhar | means <i>dark clouds</i> | incubus♂ <br>
|
@ -1,5 +0,0 @@
|
||||
|
||||
<p>Despite viewing women as nothing more than playthings, he's drawn to <a href="/char/Cass">Cass</a> for an indecipherable reason. Even when he rebels against the attraction and goes far away, he finds himself back in her town before long. The other incubi bully him incessantly about catching human feelings. He doesn't know what to think. <br></p>
|
||||
<br>
|
||||
<p>He can paralyze victims with his magic power. <br></p>
|
||||
<br>
|
@ -1,25 +0,0 @@
|
||||
Tilly | means <i>mighty in battle</i> | witch♀ <br>
|
||||
<br>
|
||||
<h2>basics </h2>
|
||||
<ul>
|
||||
<li><b>role:</b> student </li>
|
||||
<li><b>age:</b> teens </li>
|
||||
<li><b>birthday:</b> </li>
|
||||
<li><b>mental:</b> intelligent, serious </li>
|
||||
<li><b>physical:</b> layered hair with lavenders and periwinkles, blue eyes, and glasses </li>
|
||||
<li><b>style:</b> graphic florals and complicated layering </li>
|
||||
<li><b>height:</b> </li>
|
||||
<li><b>residence:</b> <a href="/char/Helmut">Helmut</a>'s house </li>
|
||||
<li><b>likes:</b> reading </li>
|
||||
<li><b>dislikes:</b> being put on the spot </li>
|
||||
<li><b>notes:</b> </li>
|
||||
</ul><br>
|
||||
<br>
|
||||
<h2>story </h2>
|
||||
<p>She and <a href="/char/Faber>Faber</a> are witch apprentices studying under <a href="/char/Helmut">Helmut</a>. Tilly is training in alchemy. <br></p>
|
||||
<br>
|
||||
<h2>description </h2>
|
||||
<p>She's forgetful and somewhat careless, so there will always be one thing wrong with her appearance, maybe unbrushed hair, wrong shoes, or her shirt inside out. <br></p>
|
||||
<br>
|
||||
<h2>inspiration </h2>
|
||||
<p><a href="/char/Helmut">Helmut</a> and his apprentices are inspired by Pantone colors of the year. <br></p>
|
@ -1,7 +0,0 @@
|
||||
Aristen | means <i>the best</i> | mystic♀ | martial artist, soldier of fortune | 24 years old | 5'6<br>
|
||||
<br>
|
||||
My Black Desert Online main! The community and gear system ruin what is one of the best tycoon and life skilling MMOs, so I didn't play it for very long. I still adore Aristen, though. <br>
|
||||
<br>
|
||||
She's an honest and direct person who won't betray her core values of loyalty, submission towards authority, and denial of the flesh. Her Spartan lifestyle borders on asceticism. She lives off the land. Though her body is shaped by extreme discipline, she isn't necessarily the wisest person. She's always falling into the "work harder, not smarter" fallacy, leading to some pretty comical blunt-force solutions for her jobs. <br>
|
||||
<br>
|
||||
Her quiet femininity contrasts with her titanic arms and powerful thighs. (I maxxed out the arm muscularity and arm thickness sliders.) Perplexingly, she's retained an hourglass figure, which she attributes to a life of wearing belts. She always presents herself with excellence, wearing a meticulously perfected coral monochromatic face of makeup to set off her pale eyes, deep auburn hair, and glassy skin. Through experience, it wears gracefully even through sweat and heat. Her wardrobe is purely functional, consisting entirely of training and ceremonial uniforms, especially those that pair well with belts and scarves. Her favorite colors to wear are orange and jade. <br>
|
@ -1,26 +0,0 @@
|
||||
Window Harpen | means <i>wind-eye</i> | human♂ <br>
|
||||
<br>
|
||||
<h2>basics </h2>
|
||||
<ul>
|
||||
<li>role: supernatural journalist </li>
|
||||
<li>age: 20s </li>
|
||||
<li>mental: well-rounded, cynical </li>
|
||||
<li>physical: slim, purple Sasuke hair, brown eyes </li>
|
||||
<li>style: dark colors, nondescript clothing </li>
|
||||
<li>height: 5'7 </li>
|
||||
<li>residence: full-time travel </li>
|
||||
<li>likes: not standing out, hospitality, lakes and oceans </li>
|
||||
<li>dislikes: staying in one place for too long, personal questions </li>
|
||||
<li>notes: hair always covers his eyes </li>
|
||||
</ul><br>
|
||||
<br>
|
||||
<h2>story </h2>
|
||||
<p>Window is sent all over the globe to report on supernatural incidents for a national outlet. He doesn't really believe in this stuff, but he does his due diligence in his investigations. Even if he thinks he avoids bias, his contempt for his subjects is pretty obvious. <br></p>
|
||||
<br>
|
||||
<h2>description </h2>
|
||||
<p>He tries to blend into any situation (with his purple anime hair, I guess?), avoiding conversation or cameras. His eyes are always hidden behind a veil of black-almost-purple hair. He's short, slim, and relatively soft-spoken but with a deep voice. <br></p>
|
||||
<br>
|
||||
<h2>inspiration </h2>
|
||||
<p>I made him while writing Dymn in middle school, but he ends up in everything I write. I'm not sure why I was stuck on this character, but it's a tradition at this point, I guess. <br></p>
|
||||
<br>
|
||||
<p>I thought his name was so cool when I was 13. <br></p>
|
@ -1,268 +0,0 @@
|
||||
<!---->
|
||||
<h1>100q to develop dia </h1>
|
||||
? ??, 2022<br>
|
||||
#?? <br>
|
||||
<br>
|
||||
Random DeviantART questionnaire because why not? <br>
|
||||
<br>
|
||||
<h2>Mayor Dia De Luna </h2>
|
||||
<br>
|
||||
Filling out <a href="https://www.deviantart.com/iciaa">Iciaa</a>'s questionnaire for Dia because I'm feeling nostalgic for these overly long questionnaires. Also, Dia isn't that detailed of a character yet. <br>
|
||||
<br>
|
||||
<b>1. What is your character's name? Do they have a nickname? </b><br>
|
||||
Diana "Dia." She may be mayor, but Lucrest is so small and Dia is so young that she had no hope of expectation of getting all the boomers to address her by her title and surname. <br>
|
||||
<br>
|
||||
<b>2. Is your character male or female? What is their sexuality? What role does it play in your story? </b><br>
|
||||
Female, straight. She isn't above manipulating guys' feelings to get what she wants. <br>
|
||||
<br>
|
||||
<b>3. How old is your character? Does their age matter to them emotionally or socially? </b><br>
|
||||
28. It's the age my old guild leader was. Seemed like a good year between young and old, inexperienced and wise to me as a high schooler. Dia is the youngest of her highly accomplished family, so she always feels like her progress to too slow or insignificant. She is also younger than the seniors and boomers and older than the kids and looks young for her age, so she never really finds a peer in Lucrest. <br>
|
||||
<br>
|
||||
<b>4. How tall is your character? Does it affect them negatively, positively, or neutrally? </b><br>
|
||||
She is pretty sure her short stature prevents her from being taken seriously in some circles. <br>
|
||||
<br>
|
||||
<b>5. What is your character's body shape? Are they physically fit? What challenges or advantages does this present? </b><br>
|
||||
She is fit but too petite for physical combat. Her magic isn't really combat-oriented either. Her henchies have to do the heavy-lifting. <br>
|
||||
<br>
|
||||
<b>6. Describe your character's facial features. What color are their eyes and hair? Be specific! </b><br>
|
||||
She has refined aristocratic features. Her Mexican heritage falls more on the Polish side than the Aztec side, so she's very fair. She has natural black hair dyed with streaks of navy and silver. Her eyes are dark brown, nearly black. <br>
|
||||
<br>
|
||||
<b>7. Do other people find your character physically attractive? Why or why not? </b><br>
|
||||
Yes. She is conventionally cute, polite, and knows how to push people's buttons. <br>
|
||||
<br>
|
||||
<b>8. What sort of clothing does your character wear? What colors are common? What does this style reflect? </b><br>
|
||||
Light, elegant colors, professional but feminine styles, propensity for sparkly or metallic fabrics like lurex or lame. <br>
|
||||
<br>
|
||||
<b>9. Does your character have any physical or mental disabilities? How does this affect your story? Is it a main point of your plot? </b><br>
|
||||
I'm not going to armchair diagnose her with anything, but she's a jerk. <br>
|
||||
<br>
|
||||
<b>10. What does your character do for money? If they are unemployed, how do they live? Does money matter to your character? </b><br>
|
||||
She owns 90% of the commercial properties in Lucrest in addition to several miscellaneous small businesses. She's pathetic by her family's standards, but she's plenty wealthy. <br>
|
||||
<br>
|
||||
<b>11. Does your character have specified family members? Describe their relationship with their family. </b><br>
|
||||
Her father is the vice president of the Confederate States of America. Her older brothers and sisters are tycoons and elite politicians. Her father treats her like the baby of the family, so he never sets the same expectations for her nor shows her the same respect. She's not particularly accomplished anyway. She has a rivalry with her siblings and takes every one-up personally. <br>
|
||||
<br>
|
||||
<b>12. What is your character's marital status? Are they involved in a relationship? How is this emotional taxation present in your story? </b><br>
|
||||
She actually does have a secret boyfriend, Koda, but he isn't really involved in the story. He's her confidant and very supportive of her behind the scenes. <br>
|
||||
<br>
|
||||
<b>13. Who are your character's closest friends? How do they know each other? How do they act around each other? </b><br>
|
||||
She doesn't really have close friends besides Koda. Even when she's chummy with someone, she privately views them cynically, either as a tool or an enemy. <br>
|
||||
<br>
|
||||
<b>14. Who are your character's minor enemies? Why do they not get along? </b><br>
|
||||
I'm fleshing out this part of the story right now. Dia bought a lengthy section of land over Abyssal Cave, which just happened to be an unincorporated community to simultaneously takeover politically as a cover. There are other figures who are trying to control the cave for their own purposes, though. Later, the National Park Service is going to get involved, too. <br>
|
||||
<br>
|
||||
<b>15. Who are your character's major enemies? How does this affect your plot? What began the animosity of their relationship? How, if at all, is it resolved? </b><br>
|
||||
Helia and her friends. Although secrecy is part of the deal with the "minor enemies," Helia is set to blow everyone's cover. Before she even set foot in the caves, Dia was suspicious the moment she realized she was related to Chuck, a Union vet. <br>
|
||||
<br>
|
||||
<b>16. How does your character speak, and what does their voice sound like? How does this reflect their personality, if at all? </b><br>
|
||||
Her voice is sweet and high-pitched like a bell. She took speech classes as a child, and it shows in her deliberate articulation. <br>
|
||||
<br>
|
||||
<b>17. Is there anything significant about your character's movement? Is it important? </b><br>
|
||||
She has perfect posture; she's good at walking silently and sneaking around; I don't know lol no. <br>
|
||||
<br>
|
||||
<b>18. Who does your character live with, or do they live alone? How does this arrangement affect your character's lifestyle? </b><br>
|
||||
This changes a lot. She's lived with Rune's older sister, her paramour, Angel's dad, and probably others in the future. Get out of her business. <br>
|
||||
<br>
|
||||
<b>19. What traits does your character value in their friends? </b><br>
|
||||
Someone intelligent, someone who gets where she comes from, someone who respects her. <br>
|
||||
<br>
|
||||
<b>20. What are your character's main pet peeves? Does this play a role in your story? </b><br>
|
||||
Being belittled, being called cute, being carded for things. It's part of her impetus for purchasing a section of the Abyssal Cave. <br>
|
||||
<br>
|
||||
<b>21. Where does your character live? Are they happy? Describe the scenery. How does this affect your story? </b><br>
|
||||
She lives in the Mayor's Mansion in Lucrest, Nickajack. It's devastatingly rural and slow compared to the capital, even after she's populated with lots of fake businesses and tourists. <br>
|
||||
<br>
|
||||
<b>22. What is your character's opinion of the society they live in? </b><br>
|
||||
She's too impatient to worry about the consequences of her actions, especially when they apply to people far beneath her, both in birth and intellect. <br>
|
||||
<br>
|
||||
<b>23. Briefly summarize your character's childhood. </b><br>
|
||||
She is much younger than her siblings, so she didn't see them much. Unlike a lot of rich kids, her parents actually raised her themselves without a nanny or boarding school. She roamed the National Archives and other legal and political centers growing up. She also had all the fancy private tutoring, social outings, and world travel expected of the daughter of an elite family. <br>
|
||||
<br>
|
||||
<b>24. What are your character's darkest secrets? </b><br>
|
||||
Hahaha...It wouldn't be murder or plague or blackmail. It'd be that the GDP of her town is falsified, and nearly all the businesses there operate at a substantial loss. <br>
|
||||
<br>
|
||||
<b>25. Has anyone close to your character died in the past? How did your character deal with this? Did it have a lasting impact? </b><br>
|
||||
Haven't thought about it. <br>
|
||||
<br>
|
||||
<b>26. What is your character's social status? Are they happy with it? </b><br>
|
||||
She's the daughter of the vice president and the mayor of a nowhere town. No, she's miserable because she could do so much better. <br>
|
||||
<br>
|
||||
<b>27. Is your character a hero, a villain, or neither? How do they see themselves, as opposed to how others see them? </b><br>
|
||||
Villain for sure. She knows it, but others wouldn't understand how hard it is for her to compete. Others think she's weird but effective. <br>
|
||||
<br>
|
||||
<b>28. Is your character conservative and disapproving of change, or liberal and willing to accept? </b><br>
|
||||
I don't think this is a very fair definition of conservative and liberal. She's a Democrat, just like her father. She doesn't necessarily carry her views out in Lucrest because she is seeking wealth and power over a career in local politics, but she's a supporter of states' rights. <br>
|
||||
<br>
|
||||
<b>29. It is said that every character has a fatal flaw. What is your character's? </b><br>
|
||||
She's impatient. She could be every bit as rich and powerful as her siblings if she put in real work, accepted that failures are inevitable, and relied on family and friends more. <br>
|
||||
<br>
|
||||
<b>30. What are your character's special talents? Are they supernatural, or normal? Can few other people do them? </b><br>
|
||||
She is the only one with the GDP wand, stolen from the magic caves. She can control the hand of the market. <br>
|
||||
<br>
|
||||
<b>31. What specific activities does your character lack skill for? What challenges does this present? </b><br>
|
||||
Keeping secrets. Competitors and worse had an eye on Lucrest before she did. <br>
|
||||
<br>
|
||||
<b>32. What are your character's major wishes in life? These are not goals, simply things they wish would happen without work. </b><br>
|
||||
Her dad would approve of her relationship with Koda. <br>
|
||||
<br>
|
||||
<b>33. When your character looks in the mirror, what do they think of themselves? Is it positive or negative? </b><br>
|
||||
She's definitely nitpicking, rearranging her hair, touching up her makeup, but she's ultimately confident in her appearance. <br>
|
||||
<br>
|
||||
<b>34. What is your character's most precious material object? What would happen if they lost it? Why is it so important? </b><br>
|
||||
Her magic wand. Unthinkable. Without it, she'd actually have to formulate her own effective economic policies, and she's never tried that before. <br>
|
||||
<br>
|
||||
<b>35. Is your character more creative, or more logical? </b><br>
|
||||
Maybe creative? <br>
|
||||
<br>
|
||||
<b>36. What are your character's small flaws? Do they cause annoyance or disdain for your character? What are your character's opinions about them? </b><br>
|
||||
I feel like all her flaws are major. <br>
|
||||
I guess she's never real, so she has trouble relating to others. Some people can tell and don't jive with her. Even those who think she's nice or supportive don't feel like friends to her. It's lonely, but she could never be that vulnerable with other people. And besides, she has Koda. <br>
|
||||
She also has maturity issues. If someone gets under her skin, she'll hold the pettiest <br>
|
||||
<br>
|
||||
<b>37. Is your character envied? By whom? Who does your character envy? </b><br>
|
||||
Sure. The older women wish they had her figure, the younger girls wish they had her cool car and stuff, and other mayors can't find a legitimate reason for her success. She envies her siblings and every girl who has something she doesn't. <br>
|
||||
<br>
|
||||
<b>38. Does your character deceive others often? Do they attempt to deceive themselves? How and why? </b><br>
|
||||
Always. She knows just who will let her get away with stronger coersion, too. She doesn't really lie to herself, though. She knows she isn't a real politician and is afraid of being exposed someday. <br>
|
||||
<br>
|
||||
<b>39. What is your character's faith? Briefly describe their religion, if it exists. Are they polytheistic or monotheistic? Do they see God(s) as all-powerful, or helpers in the course of fate? </b><br>
|
||||
She's Episcopalian on the Sabbath but lacks a deep belief in God. <br>
|
||||
<br>
|
||||
<b>40. Describe your character's uncommon beliefs. Do they believe in fate? Karma? Multiple heavens and hells? </b><br>
|
||||
She believes she has a superior genetic background and class and consequently feels entitled to success in life. It's deeply troubling that she's almost 30 and can't find it for herself, even with wild crutches. She also believes in the opposite of soul-mates - soul-enemies and enemies at first sight. <br>
|
||||
<br>
|
||||
<b>41. Is your character well known or little known? Why? </b><br>
|
||||
She's as well-known as any random daughter of a high-ranking politician who has served in the government for 40 years. <br>
|
||||
<br>
|
||||
<b>42. Is your character more optimistic, or more pessimistic? </b><br>
|
||||
Aggressively pessimistic. So much so that she rarely relies on others or luck. <br>
|
||||
<br>
|
||||
<b>43. Does your character have a lot of hope? Are there points in your story in which they lose hope? </b><br>
|
||||
She feels like she's getting away with it. Cracks start to show over time. <br>
|
||||
<br>
|
||||
<b>44. What traits make your character unique? Do they have special abilities, or a unique facial feature? Be specific. </b><br>
|
||||
Streaked hair, though most of the cast has that. A ridiculous economics-based RPG class. I don't know; I should probably come up with a catch phrase or something. <br>
|
||||
<br>
|
||||
<b>45. Is your character moody or even? Is there a cause? What are the consequences? </b><br>
|
||||
She keeps it together most of the time, but she gets into slapfights with her predestined enemies. <br>
|
||||
<br>
|
||||
<b>46. What is your character's mental capacity? Are they brilliant, or slow to learn? </b><br>
|
||||
She's very bright and quick on her feet, but she doesn't trust herself enough to actually use her brain. <br>
|
||||
<br>
|
||||
<b>47. Does your character sport charisma to influence others? How do they use this? If not, how does it affect them? </b><br>
|
||||
Not really lol. She relies on emotional manipulation. She scopes out weaknesses in those with something that can benefit her by acting like a supportive friend or therapist. She can sniff out troubled families, victims of abuse, orphans, etc, and sink her claws in. <br>
|
||||
<br>
|
||||
<b>48. What is your character's first memory? Why? What was its impact? Was it good or bad? Describe it in detail. </b><br>
|
||||
Uhhh, I don't know. She remembers her childhood mostly as being alone in archives, reading random meeting minutes and journals; exploring legal offices like mazes; charming government workers with her quiet and studious demeanor into being allowed places other kids were banned from. <br>
|
||||
<br>
|
||||
<b>49. Are first impressions important to your character? How does your character judge by them? Does your character go out of their way to make a good first impression on others? </b><br>
|
||||
Definitely. She tries to foresee how people will fit into Lucrest. She always does her professional best to make a good impression on everyone. <br>
|
||||
<br>
|
||||
<b>50. How does your character view authorities? How do they react to taking orders? </b><br>
|
||||
She's scared sick of the ones who work with her dad, and she is cynical of anyone who could view a professional relationship with her as stepping up in the world. <br>
|
||||
<br>
|
||||
<b>51. What are your character's goals? Long term? Short term? </b><br>
|
||||
Definitely CEO business magnate over an empire. Or something. Just so long as her father's finally proud. <br>
|
||||
<br>
|
||||
<b>52. What does your character do when they need to relax? Does it work? Does it affect those around them? </b><br>
|
||||
Secret retreat with Koda. Long walks along the scenic avenues of Abyssal Cave. Push the shopkeepers around. <br>
|
||||
<br>
|
||||
<b>53. What events in your character's past have left major effects? Why and how? Are they good impacts, or bad? </b><br>
|
||||
<br>
|
||||
<b>54. What major changes has your character gone through recently? How do the people around them react to this? </b><br>
|
||||
<br>
|
||||
<b>55. What are your character's bad habits? Are they major, like smoking and drinking, or minor, like chewing their nails? </b><br>
|
||||
<br>
|
||||
<b>56. What is your character a perfectionist about? </b><br>
|
||||
<br>
|
||||
<b>57. Who are your character's distant family? Does this play a role in your story? </b><br>
|
||||
<br>
|
||||
<b>58. What recent events have strengthened or weakened your character? What do they think of their changes? </b><br>
|
||||
<br>
|
||||
<b>59. Who were your character's childhood friends? Do they play a role in your story? How? </b><br>
|
||||
<br>
|
||||
<b>60. What major things does your character ignore? Purposefully? Or are they simply ignorant? </b><br>
|
||||
<br>
|
||||
<b>61. What are your character's major fears? How does this challenge them? </b><br>
|
||||
<br>
|
||||
<b>62. What does your character want that is unusual? </b><br>
|
||||
<br>
|
||||
<b>63. What does your character like that is unusual? </b><br>
|
||||
<br>
|
||||
<b>64. What is your character's favorite color? Does this reflect their personality? How? </b><br>
|
||||
<br>
|
||||
<b>65. Is your character ahead of their time? Behind? At the correct pace? </b><br>
|
||||
<br>
|
||||
<b>66. Does your character have much free time? What do they do with it? </b><br>
|
||||
<br>
|
||||
<b>67. Does your character have goals that are unattainable? </b><br>
|
||||
<br>
|
||||
<b>68. How does your character dream while they are asleep? Vividly? Rarely? Do they frequently have nightmares? Describe some of their dreams. </b><br>
|
||||
<br>
|
||||
<b>69. Does your character have health problems? Do they need medication or medical care? How does this challenge them? </b><br>
|
||||
<br>
|
||||
<b>70. What are your character's inner fears? Do they tell people about them? Why or why not? </b><br>
|
||||
<br>
|
||||
<b>71. What is your character's taste in food? Is this specific to the setting of your story? How does it affect your story? </b><br>
|
||||
<br>
|
||||
<b>72. Is your character more selfish, or more generous? </b><br>
|
||||
<br>
|
||||
<b>73. What is your character's stress level? Why? What do they do to resolve it? </b><br>
|
||||
<br>
|
||||
<b>74. What effects do social pressures, like money and the media, have on your character? </b><br>
|
||||
<br>
|
||||
<b>75. Is your character interested in a more lavish lifestyle, or simple? </b><br>
|
||||
<br>
|
||||
<b>76. What weather does your character prefer? Why? How do they react when that weather is not present? </b><br>
|
||||
<br>
|
||||
<b>77. What is your character's favorite time of day? Why? </b><br>
|
||||
<br>
|
||||
<b>78. Of what importance are holidays to your character? Which holidays? </b><br>
|
||||
<br>
|
||||
<b>79. What odd traits belonging to your character tend to drive people away? Why? </b><br>
|
||||
<br>
|
||||
<b>80. What "walls" are built by your character to accommodate the common phrase, "sometimes you build walls not to keep people away, but to see who cares enough to tear them down," and what effect does this have? </b><br>
|
||||
<br>
|
||||
<b>81. Does your character place significant value in common sense? Does your character have a lot of common sense? </b><br>
|
||||
<br>
|
||||
<b>82. What is your character's taste in music? Why? Do they make music? </b><br>
|
||||
<br>
|
||||
<b>83. Is your character satisfied with their life? Why or why not? </b><br>
|
||||
<br>
|
||||
<b>84. What motivates your character to make changes and move forward in life? </b><br>
|
||||
<br>
|
||||
<b>85. What are your character's least favorite activities? </b><br>
|
||||
<br>
|
||||
<b>86. List several activities that your character will refuse to do and explain. </b><br>
|
||||
<br>
|
||||
<b>87. What does your character do to relieve boredom? </b><br>
|
||||
<br>
|
||||
<b>88. Is your character more lazy, or more studious? </b><br>
|
||||
<br>
|
||||
<b>89. Is your character more athletic and active, or more lazy? </b><br>
|
||||
<br>
|
||||
<b>90. Is your character social, or a loner? </b><br>
|
||||
<br>
|
||||
<b>91. Does your character attempt to hide their emotion? If yes, how well do they execute their goal? If not, why? What do other people think of your character because of this? </b><br>
|
||||
<br>
|
||||
<b>92. What does your character find beautiful? What does your character find ugly? </b><br>
|
||||
<br>
|
||||
<b>93. What are your character's redeeming traits? </b><br>
|
||||
<br>
|
||||
<b>94. Is your character easily distracted? If so, why, and what challenges does this present? If not, how does this help them? </b><br>
|
||||
<br>
|
||||
<b>95. How does your character interact with nature? Why? </b><br>
|
||||
<br>
|
||||
<b>96. What are the major lasting effects that your character will tend to have on other people, if any? </b><br>
|
||||
<br>
|
||||
<b>97. How self-centered is your character? Why? What do other people think of this? </b><br>
|
||||
<br>
|
||||
<b>98. Does your character judge people, and on what premises? Race? Gender? Age? </b><br>
|
||||
<br>
|
||||
<b>99. Briefly summarize the major events in the time line of your character's life. </b><br>
|
||||
<br>
|
||||
<b>100. Finally, and perhaps most importantly, what is your character's role in the story? </b><br>
|
||||
<br>
|
||||
<br>
|
||||
Last updated August 31, 2022 <br>
|
||||
<br>
|
@ -1,42 +0,0 @@
|
||||
<!--210218,210107-->
|
||||
<h1>the achievement system is the central nervous system of my game (part 1) </h1>
|
||||
april 2, 2021<br>
|
||||
#gamedev #gamedesign #achievements #world-progression #character-progression <br>
|
||||
<br>
|
||||
<p>What's the difference between winning a trophy or earning a quest reward for killing 10 rats? Probably nothing. <br></p>
|
||||
<img src="/static/img/ent/rpgachievement_samepicture.png" alt="(meme: “Corporate needs you to find the differences between this picture and this picture” for Dragon's Dogma achievements like “Defeated an evil eye” and “Defeated 3,000 enemies” vs. quest journal entries like “Slay 25 crows.”)"> <br>
|
||||
<p>In this series, I'll discuss how to design an achievement system. Mine is for an RPG, but it should work for a variety of achievements and game genres. I won't discuss integrating with <a href="https://partner.steamgames.com/doc/features/achievements/ach_guide">Steam</a> or other platforms, but they have their own documentation. <br></p>
|
||||
<br>
|
||||
<h2>platform achievements, quest rewards: there's no difference </h2>
|
||||
<p><b>Achievement</b> is a rather nebulous term for gamers, but it's usually defined as an objective that creates a metagame. Devs offer them as a nudge to explore the full depth of games and seek out hidden secrets. For example, Portal's <a href="https://steamcommunity.com/sharedfiles/filedetails/?id=2008271826">Transmission Received achievement</a> turns the physics puzzle game into a game of hot or cold using radios you may not have even known were there. Most games' achievements look more like an extension of the quest journal than a metagame, though. Those Dragon's Dogma achievements in the image above are indistinguishable from notice board quests. They are practically unavoidable within a couple of hours of standard play. <br></p>
|
||||
<br>
|
||||
<p>Whether your achievements are meta or not, they can be earned through almost any in-game mechanic or system. (Unless they're so meta, they're completely external to the gameplay like <a href="https://steamcommunity.com/stats/221910/achievements">The Stanley Parable's Go Outside achievement</a>: <i>don't play for five years</i>.) <br></p>
|
||||
<br>
|
||||
<p>Unlocking an achievement usually awards a trophy or gamer points. In a way, increasing an in-game score is not unlike triggering a "quest complete" popup. An "event" occurs, and a "reward" is given. Some games offer something more tangible alongside their achievements, like a new game mode or item. The hat merchant in Stardew Valley will sell new hats for each achievement earned. <br></p>
|
||||
<br>
|
||||
<p>So not only does a robust achievement system need to be listening to the other game systems, it needs to be able to be able to interact with them. A system with that kind of power can do a lot more than notify you of achievements and add new hat merchandise - that's central nervous system material. It could progress the state of the game world depending on player actions. <br></p>
|
||||
<br>
|
||||
<h2>blessfrey's achievement system doubles as the character/world progression system </h2>
|
||||
<p>Blessfrey feeds <i>every</i> in-game event through its achievement system, and its reward delivery is flexible enough not only to give a trophy but to cause <i>anything</i> to happen in response. Beyond achievement management, it is the system responsible for all forms of character and world progression. This is how Blessfrey can be a dynamic and responsive game. After all, if a system can dish out a trophy for killing 10 rats, it isn't too much of a stretch to say it could trigger a quest completion, unlock a codex entry, or teach the player a new skill. And if it can do that, why not something more dramatic? Killing the last 10 rats could be a turning point in the game world, putting the player on the post-rat timeline and changing all maps, NPCs, and quests to reflect the newly rat-free society. <br></p>
|
||||
<br>
|
||||
<p>I don't even think that last one is too silly. Games are all about making choices, so ideally, the world should always be responding. The only issue is scope, both in terms of developer workload and maintaining a coherent game vision. Thankfully, creating a system capable of anything is no problem, though. I'd prefer to be my only limitation, not my progression system. <br></p>
|
||||
<br>
|
||||
<h2>what is it going to look like? </h2>
|
||||
<p>So realistically, how do I plan to use this system? <br></p>
|
||||
<br>
|
||||
<p>Obviously, the completion of a quest will be technically identical to an earned achievement, as will codex entries and level up rewards. They just won't be visible to the player or cause any trophy popups. <br></p>
|
||||
<br>
|
||||
<p>More abstract things will count as achievements, too, like skill acquisition. Blessfrey revolves around skills, so it would be cool if skills were unlocked in a meaningful way through the achievement system. I plan to have them learned through gameplay via a variety of different methods, so skillhunting feels more like exploring than grinding. Maybe the Fire Resistance skill could be learned by standing in lava for 2 minutes, by eating crème brûlée flambé (without blowing it out), or by taking fire damage in combat. Your time spent aflame will be the event needed to unlock the Fire Resistance skill achievement. Then whenever you check your Skill Library, it knows which skills you've unlocked by checking your achievements. <br></p>
|
||||
<br>
|
||||
<p>World progression will also be tied to this system. Spending $1000 at the mall could trigger a new store to open. Selling too many dungeon items to a merchant could cause him to become suspicious of where you come across them, changing your dialogue options or starting a quest. Even the UI could be tied to this system. Maybe the UI displays increasingly more detailed information when you hover your mouse over a slime as you hit different thresholds of slime kills. <br></p>
|
||||
<br>
|
||||
<p>I'm not kidding when I say <i>everything</i> is an achievement, though. When a skill is used, each stage of skill progression is doled out by the achievement system. It will prepare the skill for action, exact any skill costs, listen for required conditions to be met, and apply skill effects on behalf of the skill. Basically, skill use and the completion of each phase is an event, and triggering the next phase of skill progression is the achievement. The skill itself barely does anything besides provide information to the achievement system. <br></p>
|
||||
<br>
|
||||
<p>The more systems mediated by the achievement system, the better, I say! Letting systems run amok and modify each other directly causes unexpected problems all the time, and bringing in a middleman is such a reliable solution. <br></p>
|
||||
<br>
|
||||
<h2>stay tuned </h2><br>
|
||||
<p>So a working definition of an achievement is something awarded in response to a player action or game event. Those actions or events could be related to any game mechanic or game system, be it combat, exploration, trading, racing, etc, so the achievement system needs to be linked to all of them. How can you possibly design a system that is distinct from yet deeply intricated in every other system? In part 2, we'll do just that! Keep reading. <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 28, 2022 <br>
|
||||
<br>
|
@ -1,42 +0,0 @@
|
||||
<!--210218,210107-->
|
||||
<h1>the achievement system is the central nervous system of my game (part 1) </h1>
|
||||
april 2, 2021<br>
|
||||
#gamedev #gamedesign #achievements #world-progression #character-progression <br>
|
||||
<br>
|
||||
<p>What's the difference between winning a trophy or earning a quest reward for killing 10 rats? Probably nothing. <br></p>
|
||||
<img src="/static/img/ent/rpgachievement_samepicture.png" alt="(meme: “Corporate needs you to find the differences between this picture and this picture” for Dragon's Dogma achievements like “Defeated an evil eye” and “Defeated 3,000 enemies” vs. quest journal entries like “Slay 25 crows.”)"> <br>
|
||||
<p>In this series, I'll discuss how to design an achievement system. Mine is for an RPG, but it should work for a variety of achievements and game genres. I won't discuss integrating with <a href="https://partner.steamgames.com/doc/features/achievements/ach_guide">Steam</a> or other platforms, but they have their own documentation. <br></p>
|
||||
<br>
|
||||
<h2>platform achievements, quest rewards: there's no difference </h2>
|
||||
<p><b>Achievement</b> is a rather nebulous term for gamers, but it's usually defined as an objective that creates a metagame. Devs offer them as a nudge to explore the full depth of games and seek out hidden secrets. For example, Portal's <a href="https://steamcommunity.com/sharedfiles/filedetails/?id=2008271826">Transmission Received achievement</a> turns the physics puzzle game into a game of hot or cold using radios you may not have even known were there. Most games' achievements look more like an extension of the quest journal than a metagame, though. Those Dragon's Dogma achievements in the image above are indistinguishable from notice board quests. They are practically unavoidable within a couple of hours of standard play. <br></p>
|
||||
<br>
|
||||
<p>Whether your achievements are meta or not, they can be earned through almost any in-game mechanic or system. (Unless they're so meta, they're completely external to the gameplay like <a href="https://steamcommunity.com/stats/221910/achievements">The Stanley Parable's Go Outside achievement</a>: <i>don't play for five years</i>.) <br></p>
|
||||
<br>
|
||||
<p>Unlocking an achievement usually awards a trophy or gamer points. In a way, increasing an in-game score is not unlike triggering a "quest complete" popup. An "event" occurs, and a "reward" is given. Some games offer something more tangible alongside their achievements, like a new game mode or item. The hat merchant in Stardew Valley will sell new hats for each achievement earned. <br></p>
|
||||
<br>
|
||||
<p>So not only does a robust achievement system need to be listening to the other game systems, it needs to be able to be able to interact with them. A system with that kind of power can do a lot more than notify you of achievements and add new hat merchandise - that's central nervous system material. It could progress the state of the game world depending on player actions. <br></p>
|
||||
<br>
|
||||
<h2>blessfrey's achievement system doubles as the character/world progression system </h2>
|
||||
<p>Blessfrey feeds <i>every</i> in-game event through its achievement system, and its reward delivery is flexible enough not only to give a trophy but to cause <i>anything</i> to happen in response. Beyond achievement management, it is the system responsible for all forms of character and world progression. This is how Blessfrey can be a dynamic and responsive game. After all, if a system can dish out a trophy for killing 10 rats, it isn't too much of a stretch to say it could trigger a quest completion, unlock a codex entry, or teach the player a new skill. And if it can do that, why not something more dramatic? Killing the last 10 rats could be a turning point in the game world, putting the player on the post-rat timeline and changing all maps, NPCs, and quests to reflect the newly rat-free society. <br></p>
|
||||
<br>
|
||||
<p>I don't even think that last one is too silly. Games are all about making choices, so ideally, the world should always be responding. The only issue is scope, both in terms of developer workload and maintaining a coherent game vision. Thankfully, creating a system capable of anything is no problem, though. I'd prefer to be my only limitation, not my progression system. <br></p>
|
||||
<br>
|
||||
<h2>what is it going to look like? </h2>
|
||||
<p>So realistically, how do I plan to use this system? <br></p>
|
||||
<br>
|
||||
<p>Obviously, the completion of a quest will be technically identical to an earned achievement, as will codex entries and level up rewards. They just won't be visible to the player or cause any trophy popups. <br></p>
|
||||
<br>
|
||||
<p>More abstract things will count as achievements, too, like skill acquisition. Blessfrey revolves around skills, so it would be cool if skills were unlocked in a meaningful way through the achievement system. I plan to have them learned through gameplay via a variety of different methods, so skillhunting feels more like exploring than grinding. Maybe the Fire Resistance skill could be learned by standing in lava for 2 minutes, by eating crème brûlée flambé (without blowing it out), or by taking fire damage in combat. Your time spent aflame will be the event needed to unlock the Fire Resistance skill achievement. Then whenever you check your Skill Library, it knows which skills you've unlocked by checking your achievements. <br></p>
|
||||
<br>
|
||||
<p>World progression will also be tied to this system. Spending $1000 at the mall could trigger a new store to open. Selling too many dungeon items to a merchant could cause him to become suspicious of where you come across them, changing your dialogue options or starting a quest. Even the UI could be tied to this system. Maybe the UI displays increasingly more detailed information when you hover your mouse over a slime as you hit different thresholds of slime kills. <br></p>
|
||||
<br>
|
||||
<p>I'm not kidding when I say <i>everything</i> is an achievement, though. When a skill is used, each stage of skill progression is doled out by the achievement system. It will prepare the skill for action, exact any skill costs, listen for required conditions to be met, and apply skill effects on behalf of the skill. Basically, skill use and the completion of each phase is an event, and triggering the next phase of skill progression is the achievement. The skill itself barely does anything besides provide information to the achievement system. <br></p>
|
||||
<br>
|
||||
<p>The more systems mediated by the achievement system, the better, I say! Letting systems run amok and modify each other directly causes unexpected problems all the time, and bringing in a middleman is such a reliable solution. <br></p>
|
||||
<br>
|
||||
<h2>stay tuned </h2><br>
|
||||
<p>So a working definition of an achievement is something awarded in response to a player action or game event. Those actions or events could be related to any game mechanic or game system, be it combat, exploration, trading, racing, etc, so the achievement system needs to be linked to all of them. How can you possibly design a system that is distinct from yet deeply intricated in every other system? In part 2, we'll do just that! Keep reading. <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 28, 2022 <br>
|
||||
<br>
|
@ -1,54 +0,0 @@
|
||||
<!--210218,210107-->
|
||||
<h1>designing an achievement system (part 2) </h1>
|
||||
april 2, 2021<br>
|
||||
#gamedev #gamedesign #achievements <br>
|
||||
<br>
|
||||
<p>Designing an achievement system without any octopus tangles. <br></p>
|
||||
<img src="/static/img/ent/rpgachievement_octopus.png" alt="(illustration: an octopus tangling up UI, Dialog, and other game systems.)"> <br>
|
||||
<h2>a trusty mailman </h2>
|
||||
<p>Octopus-tangling is a major design concern for a system that is so interconnected with every other system. I could scatter achievement code through every other system, but that would be a problem if I ever need to make a fundamental change to the achievement system. Also, tacking achievement code everywhere will make the other systems cluttered. <br></p>
|
||||
<br>
|
||||
<p>Instead, Blessfrey's achievement system is broken into three main, self-contained pieces: event handlers, the Knowledge Base, and the MessageBus. <br></p>
|
||||
<br>
|
||||
<p>Let's define the terms: <br></p>
|
||||
<br>
|
||||
<ul>
|
||||
<li><b>knowledge:</b> each granular action or world event that contributes to earning an achievement </li>
|
||||
<li><b>key:</b> an id number that identifies a piece of knowledge </li>
|
||||
<li><b>topic:</b> just arrays of keys; used to categorize knowledge into groups </li>
|
||||
<li><b>event handlers:</b> they subscribe to topics, waiting for news that a specific piece of knowledge has been encountered </li>
|
||||
<li><b>Knowledge Base:</b> a singleton that stores all knowledge and facilitates the learning and forgetting of pieces of knowledge. <li><b>MessageBus:</b> a singleton that acts as a mailman; receives information about encountered knowledge and passes it off to all event handlers subscribed to that topic. </li>
|
||||
</ul><br>
|
||||
<p>Essentially, there is a database that stores all the achievements in the game, alongside a boolean value for locked or unlocked and some contextual information such as when they were unlocked. There are event handlers that wait for events to happen to unlock achievements and event handlers that wait for unlocked achievements to pay out rewards. Every event is filtered through the MessageBus and sent out to the relevant entities. This way, the only achievement code scattered everywhere are single MessageBus.subscribe("topic") lines. <br></p>
|
||||
<br>
|
||||
<h2>an example</h2>
|
||||
<p>Let's say you get an achievement for finding the Nurse's Office. The moment the player loads into the Nurse's Office, data will zip back and forth between the MessageBus and the nurse's office object, different event handlers and the Knowledge Base. <br></p>
|
||||
<a target="_blank" href="/static/img/ent/rpgachievement_KnowledgeBaseDiagram.png">
|
||||
<img src="/static/img/ent/rpgachievement_KnowledgeBaseDiagram.png" alt="(diagram: a zigzagging depiction of the list below.)">
|
||||
</a><br>
|
||||
<ol>
|
||||
<li>(Event Handler) At ready, event handlers call the MessageBus and subscribe to topics. </li>
|
||||
<li>(Nurse's Office) The player enters the Nurse's Office. The room object sends itself to the MessageBus. </li>
|
||||
<li>(MessageBus) Receives room object + sends it to all event handlers subscribed to the "place_entered" topic. </li>
|
||||
<li>(Event Handler) NursesOfficeEntered receives room object. If the room is the Nurse's Office, send its corresponding knowledge key to the MessageBus. It can also verify pre-requisites and gather additional data for the Knowledge Base. This way, the system supports anything I'd like to track about when or how knowledge was learned. </li>
|
||||
<li>(MessageBus) Receives the knowledge key + sends it to the Knowledge Base. </li>
|
||||
<li>(Knowledge Base) Finds the knowledge identified by the incoming key. "Learns" by setting that knowledge to true and filling in additional fields if extra data was sent. Sends the knowledge key to the MessageBus. </li>
|
||||
<li>(MessageBus) Receives the knowledge key + sends it to all "learned" event handlers. </li>
|
||||
<li>(Event Handler) KnowledgeLearned receives the knowledge key + calls code for any changes resulting from learning this knowledge. Maybe you'll get a Steam achievement, but if the Knowledge Base was being to facilitate game progression, a quest could update, the dialog system could unlock the option to ask about the Nurse's Office, or you could gain a Codex entry about the new location. The changes can be conditional, too, so the handler can track whether all necessary keys have been received before enacting the change. </li>
|
||||
</ol><br>
|
||||
<br>
|
||||
<p>To use the achievement system for cyclical world events, you could trigger knowledge to be "forgotten" or ultimately set back to false in the Knowledge Base. This way, the phases of an event could begin anew. <br></p>
|
||||
<br>
|
||||
<br>
|
||||
<h2>summary</h2>
|
||||
<p>Achievements can come from any combination of in-game actions, so an achievement system should be designed separately from the rest of the game. I achieve this through a couple of separate objects. <br></p>
|
||||
<br>
|
||||
<ul>
|
||||
<li>Event Handlers: The tracking, verifying, and reward payout should be contained within event handlers, which can be generated and freed as needed. They subscribe to general topics and wait for their specific event to occur. </li>
|
||||
<li>The Knowledge Base tracks the status of all knowledge in the game and can be used to understand how far the player and world have progressed. </li>
|
||||
<li>The MessageBus is very light and only allows event handlers to subscribe to topics and for incoming message to be transmitted through that topic. It has absolutely no unique checks or code to execute, impartially delivering mail to the address on the envelope. </li>
|
||||
<li>Another set of event handlers is concerned about the outcome of encountering and learning knowledge and can prompt changes or directly impact other systems, depending on pre-requisites met. </li>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 28, 2022 <br>
|
||||
<br>
|
@ -1,54 +0,0 @@
|
||||
<!--210218,210107-->
|
||||
<h1>designing an achievement system (part 2) </h1>
|
||||
april 2, 2021<br>
|
||||
#gamedev #gamedesign #achievements <br>
|
||||
<br>
|
||||
<p>Designing an achievement system without any octopus tangles. <br></p>
|
||||
<img src="/static/img/ent/rpgachievement_octopus.png" alt="(illustration: an octopus tangling up UI, Dialog, and other game systems.)"> <br>
|
||||
<h2>a trusty mailman </h2>
|
||||
<p>Octopus-tangling is a major design concern for a system that is so interconnected with every other system. I could scatter achievement code through every other system, but that would be a problem if I ever need to make a fundamental change to the achievement system. Also, tacking achievement code everywhere will make the other systems cluttered. <br></p>
|
||||
<br>
|
||||
<p>Instead, Blessfrey's achievement system is broken into three main, self-contained pieces: event handlers, the Knowledge Base, and the MessageBus. <br></p>
|
||||
<br>
|
||||
<p>Let's define the terms: <br></p>
|
||||
<br>
|
||||
<ul>
|
||||
<li><b>knowledge:</b> each granular action or world event that contributes to earning an achievement </li>
|
||||
<li><b>key:</b> an id number that identifies a piece of knowledge </li>
|
||||
<li><b>topic:</b> just arrays of keys; used to categorize knowledge into groups </li>
|
||||
<li><b>event handlers:</b> they subscribe to topics, waiting for news that a specific piece of knowledge has been encountered </li>
|
||||
<li><b>Knowledge Base:</b> a singleton that stores all knowledge and facilitates the learning and forgetting of pieces of knowledge. <li><b>MessageBus:</b> a singleton that acts as a mailman; receives information about encountered knowledge and passes it off to all event handlers subscribed to that topic. </li>
|
||||
</ul><br>
|
||||
<p>Essentially, there is a database that stores all the achievements in the game, alongside a boolean value for locked or unlocked and some contextual information such as when they were unlocked. There are event handlers that wait for events to happen to unlock achievements and event handlers that wait for unlocked achievements to pay out rewards. Every event is filtered through the MessageBus and sent out to the relevant entities. This way, the only achievement code scattered everywhere are single MessageBus.subscribe("topic") lines. <br></p>
|
||||
<br>
|
||||
<h2>an example</h2>
|
||||
<p>Let's say you get an achievement for finding the Nurse's Office. The moment the player loads into the Nurse's Office, data will zip back and forth between the MessageBus and the nurse's office object, different event handlers and the Knowledge Base. <br></p>
|
||||
<a target="_blank" href="/static/img/ent/rpgachievement_KnowledgeBaseDiagram.png">
|
||||
<img src="/static/img/ent/rpgachievement_KnowledgeBaseDiagram.png" alt="(diagram: a zigzagging depiction of the list below.)">
|
||||
</a><br>
|
||||
<ol>
|
||||
<li>(Event Handler) At ready, event handlers call the MessageBus and subscribe to topics. </li>
|
||||
<li>(Nurse's Office) The player enters the Nurse's Office. The room object sends itself to the MessageBus. </li>
|
||||
<li>(MessageBus) Receives room object + sends it to all event handlers subscribed to the "place_entered" topic. </li>
|
||||
<li>(Event Handler) NursesOfficeEntered receives room object. If the room is the Nurse's Office, send its corresponding knowledge key to the MessageBus. It can also verify pre-requisites and gather additional data for the Knowledge Base. This way, the system supports anything I'd like to track about when or how knowledge was learned. </li>
|
||||
<li>(MessageBus) Receives the knowledge key + sends it to the Knowledge Base. </li>
|
||||
<li>(Knowledge Base) Finds the knowledge identified by the incoming key. "Learns" by setting that knowledge to true and filling in additional fields if extra data was sent. Sends the knowledge key to the MessageBus. </li>
|
||||
<li>(MessageBus) Receives the knowledge key + sends it to all "learned" event handlers. </li>
|
||||
<li>(Event Handler) KnowledgeLearned receives the knowledge key + calls code for any changes resulting from learning this knowledge. Maybe you'll get a Steam achievement, but if the Knowledge Base was being to facilitate game progression, a quest could update, the dialog system could unlock the option to ask about the Nurse's Office, or you could gain a Codex entry about the new location. The changes can be conditional, too, so the handler can track whether all necessary keys have been received before enacting the change. </li>
|
||||
</ol><br>
|
||||
<br>
|
||||
<p>To use the achievement system for cyclical world events, you could trigger knowledge to be "forgotten" or ultimately set back to false in the Knowledge Base. This way, the phases of an event could begin anew. <br></p>
|
||||
<br>
|
||||
<br>
|
||||
<h2>summary</h2>
|
||||
<p>Achievements can come from any combination of in-game actions, so an achievement system should be designed separately from the rest of the game. I achieve this through a couple of separate objects. <br></p>
|
||||
<br>
|
||||
<ul>
|
||||
<li>Event Handlers: The tracking, verifying, and reward payout should be contained within event handlers, which can be generated and freed as needed. They subscribe to general topics and wait for their specific event to occur. </li>
|
||||
<li>The Knowledge Base tracks the status of all knowledge in the game and can be used to understand how far the player and world have progressed. </li>
|
||||
<li>The MessageBus is very light and only allows event handlers to subscribe to topics and for incoming message to be transmitted through that topic. It has absolutely no unique checks or code to execute, impartially delivering mail to the address on the envelope. </li>
|
||||
<li>Another set of event handlers is concerned about the outcome of encountering and learning knowledge and can prompt changes or directly impact other systems, depending on pre-requisites met. </li>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 28, 2022 <br>
|
||||
<br>
|
@ -1,52 +0,0 @@
|
||||
<!--220728,220811-->
|
||||
<h1>artfight 2022: team bloom </h1>
|
||||
august 25, 2022<br>
|
||||
#personal #artfight #art <br>
|
||||
<br>
|
||||
<h2>what's artfight? </h2>
|
||||
<b>Artfight</b> is an online art game every July. You post profiles for your original characters then go off browsing to find someone else's character to draw. Everyone's sorted into teams and each "attack" or drawing is valued for a certain number of points, so one side wins at the end of the event. You don't get anything for winning, and people game the system so bad that it's hard to even care about the competitive side of the site. <br></p>
|
||||
<br>
|
||||
<p>It's more fun to approach the game with your own personal challenge. I know a lot of people try a new style or technique during this month, like my friend trying single-layer digital paintings. My personal approach this year is thematic. I'm drawing cute couples! I don't usually draw boys, so it's a good compromise if his girlfriend will be in the frame, too. Also, more characters per attack = more points! <br></p>
|
||||
<br>
|
||||
It's a huge community, so at least a few people are bound to draw your characters, which is such a fun surprise when it happens. Some people like to make art in return for people who attack them, too, as thanks. Their discord is probably the best place to get attention, but it's intimidatingly fast for me. <br>
|
||||
<br>
|
||||
<h2>my attacks </h2>
|
||||
<p>These are the characters I drew. <br></p>
|
||||
<img src="/static/img/ent/AF22_Abbey_Lune_Arcon_SanoAmaterasu_goddess.png" alt="(pixelart: Sano Amaterasu in a lupine field, playing her harp.)"><br>
|
||||
<img src="/static/img/ent/AF22_Abbey_Lune_Arcon_SanoAmaterasu_goddess_big.png" alt="(pixelart: same but larger size)"><br>
|
||||
My pixelart of Lune_Archon's Sano Amaterasu, a horned goddess with her harp. (75x75px, 45 colors) <br>
|
||||
<br>
|
||||
<img src="/static/img/ent/AF22_Abbey_Skye_0723_Aisu+LunaStarleaf.png" alt="(pixelart: Aisu, a blue winged man in a sweater standing behind his seated blonde wife with a pink shirt.)"><br>
|
||||
<img src="/static/img/ent/AF22_Abbey_Skye_0723_Aisu+LunaStarleaf_big.png" alt="(pixelart: same but larger size.)"><br>
|
||||
My pixelart of Skye_0723's Aisu and Luna Starleaf, a winged warrior and his druid wife who can turn into a pink unicorn. (163x157px, 79 colors) <br>
|
||||
<br>
|
||||
<img src="/static/img/ent/AF22_Abbey_EmmArrGus_Brody+Char.png" alt="(pixelart: Brody, a scruffy fisherman sitting on a bench with his anthro shark girlfriend Char.)"><br>
|
||||
<img src="/static/img/ent/AF22_Abbey_EmmArrGus_Brody+Char_big.png" alt="(pixelart: same but larger size.)"><br>
|
||||
My pixelart of EmmArrGus's fisherman Brody and his shark girlfriend Char. (150x123px, 54 colors) <br>
|
||||
<br>
|
||||
<img src="/static/img/ent/AF22_Abbey_BlackReshiram_Lilac_dragongirl.png" alt="(pixelart: a fluffy pink dragon girl named Lilac.)"><br>
|
||||
<img src="/static/img/ent/AF22_Abbey_BlackReshiram_Lilac_dragongirl_big.png" alt="(pixelart: same but larger size.)"><br>
|
||||
My pixelart of BlackReshiram's Lilac, a fluffy pink dragon girl. (51 colors) <br>
|
||||
<br>
|
||||
<h2>my defenses </h2>
|
||||
<p>These are my characters, drawn by other people. <br></p>
|
||||
<img src="/static/img/ent/AF22_CawfeeCakes_Abbey_Rune_sadlittleguy.png" alt="(image: a bust of a sad Rune in a dark hoodie)"><br>
|
||||
CawfeeCakes's bust of Rune. He's so sad, he's droopy! <br>
|
||||
<br>
|
||||
<img src="/static/img/ent/AF22_Lune_Archon_Abbey_TessaSkyeStMartin.jpeg" alt="(image: Tessa with a vampy lip!)"><br>
|
||||
Lune_Archon's bust of Tessa with a vampy lip! <br>
|
||||
<br>
|
||||
<img src="/static/img/ent/AF22_BlackReshiram_Abbey_floofdrago.png" alt="(image: Abbey in an adorable style!)"><br>
|
||||
BlackReshiram's illustration of Abbey in an adorable style! <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>do you recommend this game? </h2>
|
||||
<p>It's one of the more fun art communities these days. A lot of communities have turned completely business-minded or are littered with off-topic content. Artfight, however, is necessarily interactive and collaborative, more like how art communities felt in the 10s. I try to play every year to motivate myself to draw more, especially things outside my comfort zone of cute girls. <br></p>
|
||||
<br>
|
||||
<p>This community has a lot of overlap with Toyhouse and Tumblr, though, so don't be surprised if you keep running into massive text walls of character permissions and "original character donut steal" warnings. There's also a wide range of ability. I see everything from grainy photos of lined paper to Tearzah copycat artists to university illustration students. It feels like old DeviantART in that respect. <br></p>
|
||||
<br>
|
||||
<p>You should know that the servers reliably crash during the first week of July every year, so if you do want to play, prepare during June. Upload a few characters and their reference pictures, find targets you'd like to draw, and save their usernames and reference pictures. Even if the servers crash, you've got everything you need for a few days. <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated June 4, 2022 <br>
|
||||
<br>
|
@ -1,52 +0,0 @@
|
||||
<!--220728,220811-->
|
||||
<h1>artfight 2022: team bloom </h1>
|
||||
august 25, 2022<br>
|
||||
#personal #artfight #art <br>
|
||||
<br>
|
||||
<h2>what's artfight? </h2>
|
||||
<b>Artfight</b> is an online art game every July. You post profiles for your original characters then go off browsing to find someone else's character to draw. Everyone's sorted into teams and each "attack" or drawing is valued for a certain number of points, so one side wins at the end of the event. You don't get anything for winning, and people game the system so bad that it's hard to even care about the competitive side of the site. <br></p>
|
||||
<br>
|
||||
<p>It's more fun to approach the game with your own personal challenge. I know a lot of people try a new style or technique during this month, like my friend trying single-layer digital paintings. My personal approach this year is thematic. I'm drawing cute couples! I don't usually draw boys, so it's a good compromise if his girlfriend will be in the frame, too. Also, more characters per attack = more points! <br></p>
|
||||
<br>
|
||||
It's a huge community, so at least a few people are bound to draw your characters, which is such a fun surprise when it happens. Some people like to make art in return for people who attack them, too, as thanks. Their discord is probably the best place to get attention, but it's intimidatingly fast for me. <br>
|
||||
<br>
|
||||
<h2>my attacks </h2>
|
||||
<p>These are the characters I drew. <br></p>
|
||||
<img src="/static/img/ent/AF22_Abbey_Lune_Arcon_SanoAmaterasu_goddess.png" alt="(pixelart: Sano Amaterasu in a lupine field, playing her harp.)"><br>
|
||||
<img src="/static/img/ent/AF22_Abbey_Lune_Arcon_SanoAmaterasu_goddess_big.png" alt="(pixelart: same but larger size)"><br>
|
||||
My pixelart of Lune_Archon's Sano Amaterasu, a horned goddess with her harp. (75x75px, 45 colors) <br>
|
||||
<br>
|
||||
<img src="/static/img/ent/AF22_Abbey_Skye_0723_Aisu+LunaStarleaf.png" alt="(pixelart: Aisu, a blue winged man in a sweater standing behind his seated blonde wife with a pink shirt.)"><br>
|
||||
<img src="/static/img/ent/AF22_Abbey_Skye_0723_Aisu+LunaStarleaf_big.png" alt="(pixelart: same but larger size.)"><br>
|
||||
My pixelart of Skye_0723's Aisu and Luna Starleaf, a winged warrior and his druid wife who can turn into a pink unicorn. (163x157px, 79 colors) <br>
|
||||
<br>
|
||||
<img src="/static/img/ent/AF22_Abbey_EmmArrGus_Brody+Char.png" alt="(pixelart: Brody, a scruffy fisherman sitting on a bench with his anthro shark girlfriend Char.)"><br>
|
||||
<img src="/static/img/ent/AF22_Abbey_EmmArrGus_Brody+Char_big.png" alt="(pixelart: same but larger size.)"><br>
|
||||
My pixelart of EmmArrGus's fisherman Brody and his shark girlfriend Char. (150x123px, 54 colors) <br>
|
||||
<br>
|
||||
<img src="/static/img/ent/AF22_Abbey_BlackReshiram_Lilac_dragongirl.png" alt="(pixelart: a fluffy pink dragon girl named Lilac.)"><br>
|
||||
<img src="/static/img/ent/AF22_Abbey_BlackReshiram_Lilac_dragongirl_big.png" alt="(pixelart: same but larger size.)"><br>
|
||||
My pixelart of BlackReshiram's Lilac, a fluffy pink dragon girl. (51 colors) <br>
|
||||
<br>
|
||||
<h2>my defenses </h2>
|
||||
<p>These are my characters, drawn by other people. <br></p>
|
||||
<img src="/static/img/ent/AF22_CawfeeCakes_Abbey_Rune_sadlittleguy.png" alt="(image: a bust of a sad Rune in a dark hoodie)"><br>
|
||||
CawfeeCakes's bust of Rune. He's so sad, he's droopy! <br>
|
||||
<br>
|
||||
<img src="/static/img/ent/AF22_Lune_Archon_Abbey_TessaSkyeStMartin.jpeg" alt="(image: Tessa with a vampy lip!)"><br>
|
||||
Lune_Archon's bust of Tessa with a vampy lip! <br>
|
||||
<br>
|
||||
<img src="/static/img/ent/AF22_BlackReshiram_Abbey_floofdrago.png" alt="(image: Abbey in an adorable style!)"><br>
|
||||
BlackReshiram's illustration of Abbey in an adorable style! <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>do you recommend this game? </h2>
|
||||
<p>It's one of the more fun art communities these days. A lot of communities have turned completely business-minded or are littered with off-topic content. Artfight, however, is necessarily interactive and collaborative, more like how art communities felt in the 10s. I try to play every year to motivate myself to draw more, especially things outside my comfort zone of cute girls. <br></p>
|
||||
<br>
|
||||
<p>This community has a lot of overlap with Toyhouse and Tumblr, though, so don't be surprised if you keep running into massive text walls of character permissions and "original character donut steal" warnings. There's also a wide range of ability. I see everything from grainy photos of lined paper to Tearzah copycat artists to university illustration students. It feels like old DeviantART in that respect. <br></p>
|
||||
<br>
|
||||
<p>You should know that the servers reliably crash during the first week of July every year, so if you do want to play, prepare during June. Upload a few characters and their reference pictures, find targets you'd like to draw, and save their usernames and reference pictures. Even if the servers crash, you've got everything you need for a few days. <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated June 4, 2022 <br>
|
||||
<br>
|
@ -1,46 +0,0 @@
|
||||
<!--210501,210402-->
|
||||
<h1>an enemy patrol in godot </h1>
|
||||
april 29, 2021<br>
|
||||
#ai #knowledgebase <br>
|
||||
<br>
|
||||
My patrol routes look like a series of waypoints (Position2Ds) which are the children of a patrol (Node2D). The patrol node is in a group named after the patrol route. Whenever the enemy decides to patrol, adds all the waypoints into an array. The nearest waypoint is set as the enemy's next point. The enemy then pathfinds by building a constellation of dots leading to that next point and moves fowards. To determine whether it is successfully moving towards or has reached the next point, the Knowledge Base is called in to help. <br>
|
||||
<br>
|
||||
The Knowledge Base is a system of event handlers and a message bus used originally to accomodate achievements. Since it is a clean, self-contained system that is aware of and can respond toevery event that happens in the game, it has grown to be the driving force behind dynamic events and game progression. <br>
|
||||
<br>
|
||||
<h2>fast explanation of the knowledge base </h2><br>
|
||||
<br>
|
||||
Essentially, individual, granular events are assigned a knowledge key. The Knowledge Base stores all knowledge in the game. Upon the encounter of a key in the wild, the key is used to "learn" a piece of knowledge by the Knowledge Base. Event Handlers are subscribed to the MessageBus, and once certain pieces knowledge are learned, they can generate an outcome. <br>
|
||||
<br>
|
||||
So let's say every tea has a unique knowledge key. Upon drinking mint tea, the "item_used" event is passed to the MessageBus, the Knowledge Base learns the "mint_tea" knowledge, and the tea achievement event handler takes note. The Knowledge Base groups all the tea knowledge arrays into the tea category. Once the tea category is complete, the tea drinker achievement is awarded to the player. <br>
|
||||
<br>
|
||||
I discuss its design and use more in other articles. <br>
|
||||
<br>
|
||||
<h2>why involve the achievement system? </h2><br>
|
||||
<br>
|
||||
The character or its AI could track its own proximity and vectors, but tying character movement into this achievement system allows more creativity in how the game world can respond to patrols. When event handlers can listen for certain characters to reach certain points, events like having guards switch shifts or get suspicious of missing buddies can happen naturally instead of being hard-coded. I could even do silly things like have an "Arbiter of Left" who censures any character who moves left within his zone. At the very least, I could do what many games do and include a step counter somewhere in a statistics menu. <br>
|
||||
<br>
|
||||
<h2>getting back into the patrol flow </h2><br>
|
||||
<br>
|
||||
So, to determine the enemy's progress towards reaching the next point, the enemy's going to generate an event handler for the "moved" event upon entering the patrol state. This event handler is going to be subscribed to "moved." Every time the enemy moves, it's going to publish "moved" and itself to the MessageBus, so the event handler can be notified. The event handler is going to take the enemy and evaluate whether it's reached the next point or an intermediary dot yet. The handler can also evaluate whether it's on course. Once the event handler knows how the enemy's doing, it will shoot off the appropriate signal. <br>
|
||||
<br>
|
||||
The enemy's AI will receive the signal and respond. If it's arrived at the next point, it will get the index of the current next point (the child order of the patrol node) and set the waypoint at the following index as the new next point. Then it can repeat the process of moving to this next point. If the AI finds out the enemy isn't on course, if can check to see if it's stuck on the terrain, affected by a paralysis status effect, or being pushed around by other characters, then respond appropriately. <br>
|
||||
<br>
|
||||
<h2>pathfinding and moving </h2><br>
|
||||
Pathfinding is mostly handled by the Godot Engine, but there's an important distinction to maintain between the waypoints that form a patrol route and intermediary pathfinding points between a character and a waypoint. Lack of clarity in my design led to a few weeks of confusion. <br>
|
||||
<br>
|
||||
The "path_to_object" method handles finding a path between the character and goal point. It sets the given object as the next point and sets the character's "dots" as the discrete line between itself and the next point. These dots are determined by the zone's Navigation2D's built-in get_simple_path method. The dots are stored in the state machine. Upon getting new dots, it sets its current dot by popping the front dot off the array. The patrol state, every time Execute is called, sets the enemy's velocity as the current dot - the character's global position. It also published "moved" to the MessageBus for the event handler to handler. To actually move, the enemy's KinematicBody2D calls move_and_collide from its _process method with the parameter get_velocity() * get_speed() * delta. <br>
|
||||
<br>
|
||||
<h2>cleaning up </h2><br>
|
||||
<br>
|
||||
Since the enemy might switch out of the patrol state at any moment, the setup and teardown are important. I also was sure to use signals when communicating to the patrol state instead of direct calls. <br>
|
||||
<br>
|
||||
Every state in Blessfrey is structured into an Enter, Execute, and Exit method. Enter is called once upon state transition, Execute is called every time the AI's timer ticks, and Exit is called once upon transitioning out of the state. The Enter and Exit are where setup and teardown are called respectively. <br>
|
||||
<br>
|
||||
The setup instances the moved handler, subscribes it to "moved" through the message bus, and connects all the necessary signals between the event handler + patrol state and the patrol state + state machine. The teardown disconnects all these signals and unsubscribes + queue_frees the event handler. That way, all loose ends are tied up. <br>
|
||||
<br>
|
||||
<h2>finally - the enemy patrol! </h2><br>
|
||||
Finally got the enemy patrol into the game. It required a redesign of the character movement system, the development of new features for the Knowledge Base, and tons of debugging, but I'm pretty happy with my little enemies. Next, I'll refactor movement, since there's still some fragments of the old movement system cluttering my AI scripts, but after that, I'll try publishing a release version for HTML5 to put up on my website. Looking forward to it! <br>
|
||||
<br>
|
||||
<br>
|
||||
Last updated April 30, 2021 <br>
|
||||
<br>
|
@ -1,41 +0,0 @@
|
||||
<!--210610,200429-->
|
||||
<h1>how to attack a moving target </h1>
|
||||
july 8, 2021<br>
|
||||
#ai #character #combat #design #movement <br>
|
||||
<br>
|
||||
I'll share my tentative design for the attack-movement loop. <br>
|
||||
<br>
|
||||
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: <br>
|
||||
<center><a target="_blank" href="/static/img/ent/attack-movement-loop-diagram.png">
|
||||
<img src="/static/img/ent/attack-movement-loop-diagram.png" alt="(image: diagram of the attack movement loop)" width="500" height="233">
|
||||
</a><br></center>
|
||||
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. <br>
|
||||
<br>
|
||||
<h2>the loop explained </h2><br>
|
||||
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." <br>
|
||||
<br>
|
||||
The AI receives these signals. If the target was out of range, it sets up to follow attack target. <br>
|
||||
<br>
|
||||
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. <br>
|
||||
<br>
|
||||
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. <br>
|
||||
<br>
|
||||
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). <br>
|
||||
<br>
|
||||
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. <br>
|
||||
<br>
|
||||
Then the AI receives the "arrived_at_attack_target" signal and prompts the character to begin the attack all over again. <br>
|
||||
<br>
|
||||
<h2>in-game </h2><br>
|
||||
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. <br>
|
||||
<br>
|
||||
Too fast: <br>
|
||||
<center><img src="/static/img/ent/attack-follow.gif" alt="(image: Angel follows slime)"></center>
|
||||
<br>
|
||||
I'll work it out sooner or later, dependent on how hectic moving turns out to be. <br>
|
||||
<br>
|
||||
(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.) <br>
|
||||
<br>
|
||||
<br>
|
||||
Last Updated November 13, 2021
|
||||
<br>
|
@ -1,34 +0,0 @@
|
||||
<!--201217,200903-->
|
||||
<h1>what is blessfrey? </h1>
|
||||
august 6, 2020<br>
|
||||
#game <br>
|
||||
<br>
|
||||
<b>Blessfrey</b> is a 2D action RPG developed for PC by Chimchooree. <br>
|
||||
|
||||
<p>a Godot Engine action rpg inspired by Guild Wars 1's class and skill systems, which were in turn inspired by Magic: The Gathering. You will amass a large library of skills through exploration and practice, but you may only take 8 with you into combat. You will also befriend AI companions and manage the skillbars of your team. Plan synergies and team strategies to overcome each challenge. Enemies will be have skillbars of their own, so the same skillbar won't work everywhere! No decision is permanent, so experiment to your heart's content. <br></p>
|
||||
<br>
|
||||
<p>Okay, I lied. Blessfrey also has a dual job system. The job you pick at character creation is permanent, but you can take a second as a side gig. Change your side gig frequently to find the best combinations! <br></p>
|
||||
<br>
|
||||
<p>Blessfrey is a dungeoncrawler, so you will find some shops and quests in the hub town, but the local dungeon is deep and full of mysteries to uncover. I started working on it to learn a wide range of programming concepts (games are very complex software) but also to realize my dream game (because what gamer doesn't have a dream game?).<br></p>
|
||||
<br>
|
||||
<p>I'll put an HTML5 demo up here soon-ish. Keep checking! Learn more on the <a href="/demo">Blessfrey page</a>. <br></p>
|
||||
<br>
|
||||
<p><a href="/blessfrey-presskit">Presskit is available here.</a> <br></p>
|
||||
|
||||
<br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_June292019.png">
|
||||
<img src="/static/img/ent/screenshot_June292019.png" alt="(image: Lots of Angels and other characters at a shopping center)" width="500" height="278.66">
|
||||
</a><br>
|
||||
<br>
|
||||
The game is designed to pit your skill and creativity against a series of combat and puzzle challenges while exploring the depths of the downtown dungeon. <br>
|
||||
<br>
|
||||
Class progression is free-form, and virtually no decision is permanent. At character creation, you will choose a permanent First Class, but you can unlock new classes for multiclassing during gameplay. Swap out Second Classes to find a combination to overcome challenges and express your playstyle. <br>
|
||||
<br>
|
||||
Each class has its own style of skills associated with it. Skills are individual powers gained through gameplay which give specific effects. Your skillbar only has 8 skill slots and can only be edited in safe areas. The challenge comes from discovering effective strategies and synergies against the next area. <br>
|
||||
<br>
|
||||
Skills are gained during exploration. As you find new areas, encounter enemies, and interact with your surroundings, you will internalize those experiences as new skills. There are multiple paths to learning, so you are free to focus on your favorite parts of the game. <br>
|
||||
<br>
|
||||
Blessfrey has been lots of fun to work on. I hope you enjoy it once a demo and eventually a game drops. <br>
|
||||
<br>
|
||||
Last updated June 8, 2021 <br>
|
||||
<br>
|
@ -1,43 +0,0 @@
|
||||
<!--200806,210527-->
|
||||
<h1>blessfrey graphic updates + mockups </h1>
|
||||
december 24, 2020<br>
|
||||
#mockups #screenshots<br>
|
||||
<br>
|
||||
I iterate over the graphics periodically, so I can practice without worrying about polish. Here's some screenshots of different styles I've tried. (Though April 23, 2019's is actually a mockup, that style did run in-engine for a few weeks.)<br>
|
||||
<br>
|
||||
<center>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_August152018.jpeg">
|
||||
<img src="/static/img/ent/screenshot_August152018.jpeg" alt="(image: Cassia and Bad Cat on the pink carpet tilemap)" width="500" height="313">
|
||||
</a><br>
|
||||
August 15, 2018 - Early experimenting with Godot Engine. Collision was just added for sprites and walls. The buttons to the right are for switching between characters (who each have different skillbars). <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_January132019.jpeg">
|
||||
<img src="/static/img/ent/screenshot_January132019.jpeg" alt="(image: Angel in a periwinkle room full of Bad Cats)" width="500" height="330.72">
|
||||
</a><br>
|
||||
January 13, 2019 - Videogame perspective is so different from perspective in illustration. Scale of characters vs environment is another quirk of games I had 0 experience with. I was vaguely going for an old Western RPG style with tall, somewhat realistic sprites with non-distinct faces. Something like Divine Divinity. <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_April232019.png">
|
||||
<img src="/static/img/ent/screenshot_April232019.png" alt="(image: Angel blasting a neighborhood coyote with fire)" width="500" height="375">
|
||||
</a><br>
|
||||
April 23, 2019 - This is a mockup, but the game did look like this for a while. The fireball projectile didn't come until later, though. Here, I was trying to get a little more of a top-down view but not really. Instead of cats, Angel's fighting with a coyote. The government stopped removing coyotes from my old neighborhood, so they killed all the neighborhood cats except one and I saw him running away from a big coyote during a storm, so maybe he's gone now, too. It's just not right. <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_May252019.png">
|
||||
<img src="/static/img/ent/screenshot_May252019.png" alt="(image: Angel and Chloe in front of a slanted house)" width="500" height="375.18">
|
||||
</a><br>
|
||||
May 25, 2019 - The slanted edition was so annoying. It's not isometric, it's just at an obscure angle because I drew these assets more for fun than to actually be practical. I do reuse the tree + bushes a lot, though. I also tried a more chibi sprite because they are soo common, might as well try it out. <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_June292019.png">
|
||||
<img src="/static/img/ent/screenshot_June292019.png" alt="(image: Lots of Angels and other characters at a shopping center)" width="500" height="278.66">
|
||||
</a><br>
|
||||
June 29, 2019 - Trying a shopping center level now. It's reeally spaced apart. It's inspired by a real shopping center;; <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_July252020.png">
|
||||
<img src="/static/img/ent/screenshot_July252020.png" alt="(image: Angel and some slimes in a cavern)" width="500" height="281.04">
|
||||
</a><br>
|
||||
July 25, 2020 - There's some missing in this gap, so I'll add in more pics if I find any. This is the first version of a cavern level for the blessfrey demo. It's inspired by local caves. <br>
|
||||
<br><br>
|
||||
</center>
|
||||
<h2>you're up to date.</h2>
|
||||
<br>
|
||||
Hope you enjoyed seeing the different art I've used for blessfrey over the years. Even if I never really polish anything, it's nice to iterate to get a sense of game art and blessfrey's personal style. Hopefully it ends up looking okay okay when I do start polishing. But until then, in the words of YandereDev, "All art is placeholder."<br>
|
||||
<br>
|
@ -1,112 +0,0 @@
|
||||
<!--221006,220922,221103-->
|
||||
<h1>coroutines in godot engine </h1>
|
||||
august 11, 2022<br>
|
||||
#gamedev #coroutines #godotengine #programming #demo<br>
|
||||
<br>
|
||||
<p>Demonstrating coroutines in Godot Engine with a simple application. <br></p>
|
||||
<img src="/static/img/ent/stoplight_screenshot.png" alt="(screenshot: a simple tech demo with a stoplight and a walk button.)"><br>
|
||||
<br>
|
||||
<h2>defining coroutines </h2>
|
||||
<p>Coroutines are functions that, instead of running to completion, yield until certain criteria are met. Godot Engine supports coroutines through <a href="https://docs.godotengine.org/en/stable/classes/class_@gdscript.html#class-gdscript-method-yield">yield()</a>, <a href="https://docs.godotengine.org/en/stable/classes/class_gdscriptfunctionstate.html#class-gdscriptfunctionstate-method-resume">resume()</a>, and the <a href="https://docs.godotengine.org/en/stable/classes/class_gdscriptfunctionstate.html">GDScriptFunctionState</a> object. <br></p>
|
||||
<br>
|
||||
<h2>why use a coroutine? </h2>
|
||||
<p>Coroutines allow for scripted game scenarios that respond dynamically to the player and the changing game world. They let you bounce between functions, step-by-step, and respond to interruptions. This means functions can be automatically called at the completion of other functions, animations, player actions, in-game events, or timers. Add in interruptions and conditionals, and you have a tool for building a responsive game world. <br></p>
|
||||
<br>
|
||||
<h2>stoplight example </h2>
|
||||
<p>As a simple demonstration, I made a stoplight. Follow along with my code on <a href="https://gitlab.com/chimchooree/stoplight">GitLab</a>. <br></p>
|
||||
<br>
|
||||
<p>The light changes every few seconds, going from green, yellow, then red. The light changes immediately if the walk button is pressed. This demonstrates that methods can wait for criteria (a timed duration in this case) to be met before resuming, and they can be influenced by player action. <br></p>
|
||||
<br>
|
||||
<a target="_blank" href="/static/img/ent/stoplight_demonstration.gif">
|
||||
<img src="/static/img/ent/stoplight_demonstration.gif" alt="(gif: demonstration)" width="500" height="281.67">
|
||||
</a><br>
|
||||
<br>
|
||||
<h2>how is it written? </h2>
|
||||
<h3>node hierarchy </h3>
|
||||
<img src="/static/img/ent/stoplight_nodehierarchy.png" alt="(screenshot: node hierarchy in the editor. Root is a node named Main. It's children are TextureRect BG, AnimatedSprite Stoplight, Sprite WalkButton, and a Label. Stoplight's child is a Sprite. WalkButton's child is a TextureButton.)"><br>
|
||||
<p>I have a TextureRect background, an AnimatedSprite stoplight, a Sprite walk button with a TextureButton, and a label for displaying a timer. Most of the code is attached to the root. It's better to have code closer to where it's being used and to mind your separation of concerns in real projects, though. <br></p>
|
||||
<br>
|
||||
<h3>animation</h3>
|
||||
<img src="/static/img/ent/stoplight_animationframes.png" alt="(image: the AnimatedSprite Stoplight has 4 animations - default (which is no light), green, red, and yellow.)"><br>
|
||||
<p>The light is changed by setting its animation to one of these options. Each is one-frame - just the stoplight with the one or none of the lights colored in. <br></p>
|
||||
<h3>the code </h3>
|
||||
This project has two scripts: Main.gd, which is attached to the root node, and Label.gd, which is attached to the Label. <br>
|
||||
<br>
|
||||
<h4>Main.gd - available on <a href="https://gitlab.com/chimchooree/stoplight/-/blob/master/Main.gd">GitLab</a></h4>
|
||||
<pre><code>extends Node
|
||||
|
||||
onready var stoplight = $Stoplight
|
||||
|
||||
func _ready():
|
||||
stoplight.play()
|
||||
|
||||
var result = wait(5, 'green')
|
||||
$WalkButton/TextureButton.connect('pressed', result, 'resume',
|
||||
['interrupted on green'], CONNECT_ONESHOT)
|
||||
yield(result, 'completed')
|
||||
|
||||
result = wait(5, 'yellow')
|
||||
$WalkButton/TextureButton.connect('pressed', result, 'resume',
|
||||
['interrupted on yellow'], CONNECT_ONESHOT)
|
||||
yield(result, 'completed')
|
||||
|
||||
result = wait(5, 'red')
|
||||
$WalkButton/TextureButton.connect('pressed', result, 'resume',
|
||||
['interrupted on red'], CONNECT_ONESHOT)
|
||||
yield(result, 'completed')
|
||||
|
||||
func wait(time, color):
|
||||
print('waiting for: ' + color)
|
||||
var result = yield(get_tree().create_timer(time), 'timeout')
|
||||
if result:
|
||||
print(result)
|
||||
stoplight.animation = color
|
||||
print('done: ' + color)
|
||||
|
||||
func _on_completed():
|
||||
print('completed')
|
||||
|
||||
func _on_WalkButton_gui_input(event):
|
||||
if event is InputEventMouseButton and event.pressed:
|
||||
print ("Walk Button not functioning.")</code></pre><br>
|
||||
<br>
|
||||
<h4>Label.gd - available on <a href="https://gitlab.com/chimchooree/stoplight/-/blob/master/Label.gd">GitLab</a></h4>
|
||||
<pre><code>extends Label
|
||||
var time_start = 0
|
||||
var time_now = 0
|
||||
|
||||
func _ready():
|
||||
time_start = OS.get_unix_time()
|
||||
set_process(true)
|
||||
|
||||
func _process(delta):
|
||||
time_now = OS.get_unix_time()
|
||||
var elapsed = time_now - time_start
|
||||
var minutes = elapsed / 60
|
||||
var seconds = elapsed % 60
|
||||
var str_elapsed = "%02d" % [seconds]
|
||||
text = str(str_elapsed)</code></pre><br>
|
||||
<br>
|
||||
<h2>how does it work? </h2>
|
||||
<p>At <span class="code">_ready()</span>, <span class="code">wait()</span> is assigned to the GDScriptFunctionState <span class="code">result</span> and is called for the first color, green. <span class="code">_ready()</span> yields until <span class="code">wait()</span> is completed. <br></p>
|
||||
<br>
|
||||
<p>The wait method yields for the given amount of seconds then sets the stoplight to the given color. <br></p>
|
||||
<br>
|
||||
<p>At <span class="code">wait()</span>'s completion, <span class="code">_ready()</span> calls <span class="code">wait()</span> for yellow, then red. Each is called one at a time, waiting for the color to complete before moving on. <br></p>
|
||||
<br>
|
||||
<h3>interrupting the stoplight </h3>
|
||||
<p>The Wait Button interrupts the wait times between colors. Before <span class="code">_ready()</span> yields, it connects the <span class="code">'pressed'</span> signal on the Wait Button. <br></p>
|
||||
<br>
|
||||
<p>If the Wait Button is clicked during <span class="code">wait()</span>'s yield, the GDScriptFunctionState <span class="code">result</span> resumes immediately, ignoring <span class="code">wait()</span>'s yield timer. This time, <span class="code">result</span> has a string arg <span class="code">"interrupted on green,"</span> so it will print the result, change the stoplight's color, then print <span class="code">"done: green."</span> The <span class="code">wait</span> method is complete, so <span class="code">_ready()</span> resumes and calls <span class="code">wait()</span> for the next color. <br></p>
|
||||
<br>
|
||||
<h2>play it yourself </h2>
|
||||
<iframe frameborder="0" src="https://itch.io/embed/1643944?dark=true" width="552" height="167"><a href="https://chimchooree.itch.io/stoplight">stoplight by chimchooree</a></iframe><br>
|
||||
<br>
|
||||
<h2>applications </h2>
|
||||
<p>The outcomes in this example can be swapped out with anything. I use coroutines in Blessfrey's skills to manage the flow of phases from activation, different phases of effects, cooldown, and interactions with any counters. I also use it in the basic weapon attack so the character continuously swings at the rate of his attack speed until he cancels, uses a skill, or moves. It could also be used for something like cars that stop and honk when the player walks in front of them then drive off once the path is clear. Anything influenced by other entities is a good coroutine candidate. <br></p>
|
||||
<br>
|
||||
<p>Coroutines enable practical ways to improve the flow and interactivity of games, so practice the concept a lot! <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 31, 2022 <br>
|
||||
<br>
|
@ -1,268 +0,0 @@
|
||||
<!---->
|
||||
<h1>100q to develop dia </h1>
|
||||
? ??, 2022<br>
|
||||
#?? <br>
|
||||
<br>
|
||||
Random DeviantART questionnaire because why not? <br>
|
||||
<br>
|
||||
<h2>Mayor Dia De Luna </h2>
|
||||
<br>
|
||||
Filling out <a href="https://www.deviantart.com/iciaa">Iciaa</a>'s questionnaire for Dia because I'm feeling nostalgic for these overly long questionnaires. Also, Dia isn't that detailed of a character yet. <br>
|
||||
<br>
|
||||
<b>1. What is your character's name? Do they have a nickname? </b><br>
|
||||
Diana "Dia." She may be mayor, but Lucrest is so small and Dia is so young that she had no hope of expectation of getting all the boomers to address her by her title and surname. <br>
|
||||
<br>
|
||||
<b>2. Is your character male or female? What is their sexuality? What role does it play in your story? </b><br>
|
||||
Female, straight. She isn't above manipulating guys' feelings to get what she wants. <br>
|
||||
<br>
|
||||
<b>3. How old is your character? Does their age matter to them emotionally or socially? </b><br>
|
||||
28. It's the age my old guild leader was. Seemed like a good year between young and old, inexperienced and wise to me as a high schooler. Dia is the youngest of her highly accomplished family, so she always feels like her progress to too slow or insignificant. She is also younger than the seniors and boomers and older than the kids and looks young for her age, so she never really finds a peer in Lucrest. <br>
|
||||
<br>
|
||||
<b>4. How tall is your character? Does it affect them negatively, positively, or neutrally? </b><br>
|
||||
She is pretty sure her short stature prevents her from being taken seriously in some circles. <br>
|
||||
<br>
|
||||
<b>5. What is your character's body shape? Are they physically fit? What challenges or advantages does this present? </b><br>
|
||||
She is fit but too petite for physical combat. Her magic isn't really combat-oriented either. Her henchies have to do the heavy-lifting. <br>
|
||||
<br>
|
||||
<b>6. Describe your character's facial features. What color are their eyes and hair? Be specific! </b><br>
|
||||
She has refined aristocratic features. Her Mexican heritage falls more on the Polish side than the Aztec side, so she's very fair. She has natural black hair dyed with streaks of navy and silver. Her eyes are dark brown, nearly black. <br>
|
||||
<br>
|
||||
<b>7. Do other people find your character physically attractive? Why or why not? </b><br>
|
||||
Yes. She is conventionally cute, polite, and knows how to push people's buttons. <br>
|
||||
<br>
|
||||
<b>8. What sort of clothing does your character wear? What colors are common? What does this style reflect? </b><br>
|
||||
Light, elegant colors, professional but feminine styles, propensity for sparkly or metallic fabrics like lurex or lame. <br>
|
||||
<br>
|
||||
<b>9. Does your character have any physical or mental disabilities? How does this affect your story? Is it a main point of your plot? </b><br>
|
||||
I'm not going to armchair diagnose her with anything, but she's a jerk. <br>
|
||||
<br>
|
||||
<b>10. What does your character do for money? If they are unemployed, how do they live? Does money matter to your character? </b><br>
|
||||
She owns 90% of the commercial properties in Lucrest in addition to several miscellaneous small businesses. She's pathetic by her family's standards, but she's plenty wealthy. <br>
|
||||
<br>
|
||||
<b>11. Does your character have specified family members? Describe their relationship with their family. </b><br>
|
||||
Her father is the vice president of the Confederate States of America. Her older brothers and sisters are tycoons and elite politicians. Her father treats her like the baby of the family, so he never sets the same expectations for her nor shows her the same respect. She's not particularly accomplished anyway. She has a rivalry with her siblings and takes every one-up personally. <br>
|
||||
<br>
|
||||
<b>12. What is your character's marital status? Are they involved in a relationship? How is this emotional taxation present in your story? </b><br>
|
||||
She actually does have a secret boyfriend, Koda, but he isn't really involved in the story. He's her confidant and very supportive of her behind the scenes. <br>
|
||||
<br>
|
||||
<b>13. Who are your character's closest friends? How do they know each other? How do they act around each other? </b><br>
|
||||
She doesn't really have close friends besides Koda. Even when she's chummy with someone, she privately views them cynically, either as a tool or an enemy. <br>
|
||||
<br>
|
||||
<b>14. Who are your character's minor enemies? Why do they not get along? </b><br>
|
||||
I'm fleshing out this part of the story right now. Dia bought a lengthy section of land over Abyssal Cave, which just happened to be an unincorporated community to simultaneously takeover politically as a cover. There are other figures who are trying to control the cave for their own purposes, though. Later, the National Park Service is going to get involved, too. <br>
|
||||
<br>
|
||||
<b>15. Who are your character's major enemies? How does this affect your plot? What began the animosity of their relationship? How, if at all, is it resolved? </b><br>
|
||||
Helia and her friends. Although secrecy is part of the deal with the "minor enemies," Helia is set to blow everyone's cover. Before she even set foot in the caves, Dia was suspicious the moment she realized she was related to Chuck, a Union vet. <br>
|
||||
<br>
|
||||
<b>16. How does your character speak, and what does their voice sound like? How does this reflect their personality, if at all? </b><br>
|
||||
Her voice is sweet and high-pitched like a bell. She took speech classes as a child, and it shows in her deliberate articulation. <br>
|
||||
<br>
|
||||
<b>17. Is there anything significant about your character's movement? Is it important? </b><br>
|
||||
She has perfect posture; she's good at walking silently and sneaking around; I don't know lol no. <br>
|
||||
<br>
|
||||
<b>18. Who does your character live with, or do they live alone? How does this arrangement affect your character's lifestyle? </b><br>
|
||||
This changes a lot. She's lived with Rune's older sister, her paramour, Angel's dad, and probably others in the future. Get out of her business. <br>
|
||||
<br>
|
||||
<b>19. What traits does your character value in their friends? </b><br>
|
||||
Someone intelligent, someone who gets where she comes from, someone who respects her. <br>
|
||||
<br>
|
||||
<b>20. What are your character's main pet peeves? Does this play a role in your story? </b><br>
|
||||
Being belittled, being called cute, being carded for things. It's part of her impetus for purchasing a section of the Abyssal Cave. <br>
|
||||
<br>
|
||||
<b>21. Where does your character live? Are they happy? Describe the scenery. How does this affect your story? </b><br>
|
||||
She lives in the Mayor's Mansion in Lucrest, Nickajack. It's devastatingly rural and slow compared to the capital, even after she's populated with lots of fake businesses and tourists. <br>
|
||||
<br>
|
||||
<b>22. What is your character's opinion of the society they live in? </b><br>
|
||||
She's too impatient to worry about the consequences of her actions, especially when they apply to people far beneath her, both in birth and intellect. <br>
|
||||
<br>
|
||||
<b>23. Briefly summarize your character's childhood. </b><br>
|
||||
She is much younger than her siblings, so she didn't see them much. Unlike a lot of rich kids, her parents actually raised her themselves without a nanny or boarding school. She roamed the National Archives and other legal and political centers growing up. She also had all the fancy private tutoring, social outings, and world travel expected of the daughter of an elite family. <br>
|
||||
<br>
|
||||
<b>24. What are your character's darkest secrets? </b><br>
|
||||
Hahaha...It wouldn't be murder or plague or blackmail. It'd be that the GDP of her town is falsified, and nearly all the businesses there operate at a substantial loss. <br>
|
||||
<br>
|
||||
<b>25. Has anyone close to your character died in the past? How did your character deal with this? Did it have a lasting impact? </b><br>
|
||||
Haven't thought about it. <br>
|
||||
<br>
|
||||
<b>26. What is your character's social status? Are they happy with it? </b><br>
|
||||
She's the daughter of the vice president and the mayor of a nowhere town. No, she's miserable because she could do so much better. <br>
|
||||
<br>
|
||||
<b>27. Is your character a hero, a villain, or neither? How do they see themselves, as opposed to how others see them? </b><br>
|
||||
Villain for sure. She knows it, but others wouldn't understand how hard it is for her to compete. Others think she's weird but effective. <br>
|
||||
<br>
|
||||
<b>28. Is your character conservative and disapproving of change, or liberal and willing to accept? </b><br>
|
||||
I don't think this is a very fair definition of conservative and liberal. She's a Democrat, just like her father. She doesn't necessarily carry her views out in Lucrest because she is seeking wealth and power over a career in local politics, but she's a supporter of states' rights. <br>
|
||||
<br>
|
||||
<b>29. It is said that every character has a fatal flaw. What is your character's? </b><br>
|
||||
She's impatient. She could be every bit as rich and powerful as her siblings if she put in real work, accepted that failures are inevitable, and relied on family and friends more. <br>
|
||||
<br>
|
||||
<b>30. What are your character's special talents? Are they supernatural, or normal? Can few other people do them? </b><br>
|
||||
She is the only one with the GDP wand, stolen from the magic caves. She can control the hand of the market. <br>
|
||||
<br>
|
||||
<b>31. What specific activities does your character lack skill for? What challenges does this present? </b><br>
|
||||
Keeping secrets. Competitors and worse had an eye on Lucrest before she did. <br>
|
||||
<br>
|
||||
<b>32. What are your character's major wishes in life? These are not goals, simply things they wish would happen without work. </b><br>
|
||||
Her dad would approve of her relationship with Koda. <br>
|
||||
<br>
|
||||
<b>33. When your character looks in the mirror, what do they think of themselves? Is it positive or negative? </b><br>
|
||||
She's definitely nitpicking, rearranging her hair, touching up her makeup, but she's ultimately confident in her appearance. <br>
|
||||
<br>
|
||||
<b>34. What is your character's most precious material object? What would happen if they lost it? Why is it so important? </b><br>
|
||||
Her magic wand. Unthinkable. Without it, she'd actually have to formulate her own effective economic policies, and she's never tried that before. <br>
|
||||
<br>
|
||||
<b>35. Is your character more creative, or more logical? </b><br>
|
||||
Maybe creative? <br>
|
||||
<br>
|
||||
<b>36. What are your character's small flaws? Do they cause annoyance or disdain for your character? What are your character's opinions about them? </b><br>
|
||||
I feel like all her flaws are major. <br>
|
||||
I guess she's never real, so she has trouble relating to others. Some people can tell and don't jive with her. Even those who think she's nice or supportive don't feel like friends to her. It's lonely, but she could never be that vulnerable with other people. And besides, she has Koda. <br>
|
||||
She also has maturity issues. If someone gets under her skin, she'll hold the pettiest <br>
|
||||
<br>
|
||||
<b>37. Is your character envied? By whom? Who does your character envy? </b><br>
|
||||
Sure. The older women wish they had her figure, the younger girls wish they had her cool car and stuff, and other mayors can't find a legitimate reason for her success. She envies her siblings and every girl who has something she doesn't. <br>
|
||||
<br>
|
||||
<b>38. Does your character deceive others often? Do they attempt to deceive themselves? How and why? </b><br>
|
||||
Always. She knows just who will let her get away with stronger coersion, too. She doesn't really lie to herself, though. She knows she isn't a real politician and is afraid of being exposed someday. <br>
|
||||
<br>
|
||||
<b>39. What is your character's faith? Briefly describe their religion, if it exists. Are they polytheistic or monotheistic? Do they see God(s) as all-powerful, or helpers in the course of fate? </b><br>
|
||||
She's Episcopalian on the Sabbath but lacks a deep belief in God. <br>
|
||||
<br>
|
||||
<b>40. Describe your character's uncommon beliefs. Do they believe in fate? Karma? Multiple heavens and hells? </b><br>
|
||||
She believes she has a superior genetic background and class and consequently feels entitled to success in life. It's deeply troubling that she's almost 30 and can't find it for herself, even with wild crutches. She also believes in the opposite of soul-mates - soul-enemies and enemies at first sight. <br>
|
||||
<br>
|
||||
<b>41. Is your character well known or little known? Why? </b><br>
|
||||
She's as well-known as any random daughter of a high-ranking politician who has served in the government for 40 years. <br>
|
||||
<br>
|
||||
<b>42. Is your character more optimistic, or more pessimistic? </b><br>
|
||||
Aggressively pessimistic. So much so that she rarely relies on others or luck. <br>
|
||||
<br>
|
||||
<b>43. Does your character have a lot of hope? Are there points in your story in which they lose hope? </b><br>
|
||||
She feels like she's getting away with it. Cracks start to show over time. <br>
|
||||
<br>
|
||||
<b>44. What traits make your character unique? Do they have special abilities, or a unique facial feature? Be specific. </b><br>
|
||||
Streaked hair, though most of the cast has that. A ridiculous economics-based RPG class. I don't know; I should probably come up with a catch phrase or something. <br>
|
||||
<br>
|
||||
<b>45. Is your character moody or even? Is there a cause? What are the consequences? </b><br>
|
||||
She keeps it together most of the time, but she gets into slapfights with her predestined enemies. <br>
|
||||
<br>
|
||||
<b>46. What is your character's mental capacity? Are they brilliant, or slow to learn? </b><br>
|
||||
She's very bright and quick on her feet, but she doesn't trust herself enough to actually use her brain. <br>
|
||||
<br>
|
||||
<b>47. Does your character sport charisma to influence others? How do they use this? If not, how does it affect them? </b><br>
|
||||
Not really lol. She relies on emotional manipulation. She scopes out weaknesses in those with something that can benefit her by acting like a supportive friend or therapist. She can sniff out troubled families, victims of abuse, orphans, etc, and sink her claws in. <br>
|
||||
<br>
|
||||
<b>48. What is your character's first memory? Why? What was its impact? Was it good or bad? Describe it in detail. </b><br>
|
||||
Uhhh, I don't know. She remembers her childhood mostly as being alone in archives, reading random meeting minutes and journals; exploring legal offices like mazes; charming government workers with her quiet and studious demeanor into being allowed places other kids were banned from. <br>
|
||||
<br>
|
||||
<b>49. Are first impressions important to your character? How does your character judge by them? Does your character go out of their way to make a good first impression on others? </b><br>
|
||||
Definitely. She tries to foresee how people will fit into Lucrest. She always does her professional best to make a good impression on everyone. <br>
|
||||
<br>
|
||||
<b>50. How does your character view authorities? How do they react to taking orders? </b><br>
|
||||
She's scared sick of the ones who work with her dad, and she is cynical of anyone who could view a professional relationship with her as stepping up in the world. <br>
|
||||
<br>
|
||||
<b>51. What are your character's goals? Long term? Short term? </b><br>
|
||||
Definitely CEO business magnate over an empire. Or something. Just so long as her father's finally proud. <br>
|
||||
<br>
|
||||
<b>52. What does your character do when they need to relax? Does it work? Does it affect those around them? </b><br>
|
||||
Secret retreat with Koda. Long walks along the scenic avenues of Abyssal Cave. Push the shopkeepers around. <br>
|
||||
<br>
|
||||
<b>53. What events in your character's past have left major effects? Why and how? Are they good impacts, or bad? </b><br>
|
||||
<br>
|
||||
<b>54. What major changes has your character gone through recently? How do the people around them react to this? </b><br>
|
||||
<br>
|
||||
<b>55. What are your character's bad habits? Are they major, like smoking and drinking, or minor, like chewing their nails? </b><br>
|
||||
<br>
|
||||
<b>56. What is your character a perfectionist about? </b><br>
|
||||
<br>
|
||||
<b>57. Who are your character's distant family? Does this play a role in your story? </b><br>
|
||||
<br>
|
||||
<b>58. What recent events have strengthened or weakened your character? What do they think of their changes? </b><br>
|
||||
<br>
|
||||
<b>59. Who were your character's childhood friends? Do they play a role in your story? How? </b><br>
|
||||
<br>
|
||||
<b>60. What major things does your character ignore? Purposefully? Or are they simply ignorant? </b><br>
|
||||
<br>
|
||||
<b>61. What are your character's major fears? How does this challenge them? </b><br>
|
||||
<br>
|
||||
<b>62. What does your character want that is unusual? </b><br>
|
||||
<br>
|
||||
<b>63. What does your character like that is unusual? </b><br>
|
||||
<br>
|
||||
<b>64. What is your character's favorite color? Does this reflect their personality? How? </b><br>
|
||||
<br>
|
||||
<b>65. Is your character ahead of their time? Behind? At the correct pace? </b><br>
|
||||
<br>
|
||||
<b>66. Does your character have much free time? What do they do with it? </b><br>
|
||||
<br>
|
||||
<b>67. Does your character have goals that are unattainable? </b><br>
|
||||
<br>
|
||||
<b>68. How does your character dream while they are asleep? Vividly? Rarely? Do they frequently have nightmares? Describe some of their dreams. </b><br>
|
||||
<br>
|
||||
<b>69. Does your character have health problems? Do they need medication or medical care? How does this challenge them? </b><br>
|
||||
<br>
|
||||
<b>70. What are your character's inner fears? Do they tell people about them? Why or why not? </b><br>
|
||||
<br>
|
||||
<b>71. What is your character's taste in food? Is this specific to the setting of your story? How does it affect your story? </b><br>
|
||||
<br>
|
||||
<b>72. Is your character more selfish, or more generous? </b><br>
|
||||
<br>
|
||||
<b>73. What is your character's stress level? Why? What do they do to resolve it? </b><br>
|
||||
<br>
|
||||
<b>74. What effects do social pressures, like money and the media, have on your character? </b><br>
|
||||
<br>
|
||||
<b>75. Is your character interested in a more lavish lifestyle, or simple? </b><br>
|
||||
<br>
|
||||
<b>76. What weather does your character prefer? Why? How do they react when that weather is not present? </b><br>
|
||||
<br>
|
||||
<b>77. What is your character's favorite time of day? Why? </b><br>
|
||||
<br>
|
||||
<b>78. Of what importance are holidays to your character? Which holidays? </b><br>
|
||||
<br>
|
||||
<b>79. What odd traits belonging to your character tend to drive people away? Why? </b><br>
|
||||
<br>
|
||||
<b>80. What "walls" are built by your character to accommodate the common phrase, "sometimes you build walls not to keep people away, but to see who cares enough to tear them down," and what effect does this have? </b><br>
|
||||
<br>
|
||||
<b>81. Does your character place significant value in common sense? Does your character have a lot of common sense? </b><br>
|
||||
<br>
|
||||
<b>82. What is your character's taste in music? Why? Do they make music? </b><br>
|
||||
<br>
|
||||
<b>83. Is your character satisfied with their life? Why or why not? </b><br>
|
||||
<br>
|
||||
<b>84. What motivates your character to make changes and move forward in life? </b><br>
|
||||
<br>
|
||||
<b>85. What are your character's least favorite activities? </b><br>
|
||||
<br>
|
||||
<b>86. List several activities that your character will refuse to do and explain. </b><br>
|
||||
<br>
|
||||
<b>87. What does your character do to relieve boredom? </b><br>
|
||||
<br>
|
||||
<b>88. Is your character more lazy, or more studious? </b><br>
|
||||
<br>
|
||||
<b>89. Is your character more athletic and active, or more lazy? </b><br>
|
||||
<br>
|
||||
<b>90. Is your character social, or a loner? </b><br>
|
||||
<br>
|
||||
<b>91. Does your character attempt to hide their emotion? If yes, how well do they execute their goal? If not, why? What do other people think of your character because of this? </b><br>
|
||||
<br>
|
||||
<b>92. What does your character find beautiful? What does your character find ugly? </b><br>
|
||||
<br>
|
||||
<b>93. What are your character's redeeming traits? </b><br>
|
||||
<br>
|
||||
<b>94. Is your character easily distracted? If so, why, and what challenges does this present? If not, how does this help them? </b><br>
|
||||
<br>
|
||||
<b>95. How does your character interact with nature? Why? </b><br>
|
||||
<br>
|
||||
<b>96. What are the major lasting effects that your character will tend to have on other people, if any? </b><br>
|
||||
<br>
|
||||
<b>97. How self-centered is your character? Why? What do other people think of this? </b><br>
|
||||
<br>
|
||||
<b>98. Does your character judge people, and on what premises? Race? Gender? Age? </b><br>
|
||||
<br>
|
||||
<b>99. Briefly summarize the major events in the time line of your character's life. </b><br>
|
||||
<br>
|
||||
<b>100. Finally, and perhaps most importantly, what is your character's role in the story? </b><br>
|
||||
<br>
|
||||
<br>
|
||||
Last updated August 31, 2022 <br>
|
||||
<br>
|
@ -1,59 +0,0 @@
|
||||
<!--221006,220811,220922-->
|
||||
<h1>eyeshadow singles heading into Fall '22 </h1>
|
||||
july 28, 2022<br>
|
||||
#offtopic #makeup <br>
|
||||
<br>
|
||||
<p>Fall colors and blue. <br></p>
|
||||
<br>
|
||||
<h2>my fall </h2>
|
||||
<p>The weather may be staying hot through the day, but every morning dip has me feeling <i>this</i> is the day fall finally begins. Eventually. Maybe. Okay, probably not for another month. But at least I have power to choose which colors I wear. <br></p>
|
||||
<br>
|
||||
<p>This is my interpretation moving into fall '22. Initially, I was feeling bronzes. I wanted summer to be the season of bronze, but it never really happened. Bronze is a good seasonal transition (an all-around good color), but I keep neglecting it. Even with this palette, I don't quite have a bronze. What I ended up with is an orange + brown quad and a red + green quad, each with plenty of shifting shadows and shimmers. Not my first plan, but I've loved the unexpected synergies in here. (Is building an 8-pan palette like building a skillbar?) <br></p>
|
||||
<img src="/static/img/ent/-.png" alt="(palette)"><br>
|
||||
<img src="/static/img/ent/-.png" alt="(swatches)"><br>
|
||||
<br>
|
||||
<h3>discoveries</h3>
|
||||
<p>I use the browns for deepening, the orange as a transition, the multichrome as an eyeliner, and the white for inner corner, halo eyes, or adding an aegyo-sal highlight to the center of my lower lashline. The olive works well for lining under my aegyo-sal (the little bit of fat under my eye), since it's close to a brown already and neutralizes against the many reds and oranges. Red Chameleon pairs with the reds or the greens or buffed into a one-shadow look. I used to use red (Urban Decay Gash) for years in igari-style makeup (think drunk, sleepy, or angry), but intentionally looking ill during a plague just feels socially irresponsible and lost its luster. It's fun to find a new way to work red into looks again. Also, just chocolate and nothing else eyes is pure comfort food. <br></p>
|
||||
<br>
|
||||
<p>Black-based multichromes can look very harsh, but I'm finding using Sundazed over an olive eyeliner base softens it up while retaining the dramatic shift. <br></p>
|
||||
<br>
|
||||
<p>Eyeshadows in the <a href="https://www.etsy.com/shop/anothersoul">anothersoul (Etsy)</a> essential 8-pan palette <br></p>
|
||||
<ul>
|
||||
<li>Sydney Grace - Beyond (matte dark brown) </li>
|
||||
<li>Sydney Grace - Chocolate Bar (shimmery dark brown) </li>
|
||||
<li>ColourPop - Limoncello (matte butterscotch orange from the Lil Ray of Sunshine palette) </li>
|
||||
<li>Terra Moons - Sundazed (black-based multichrome that shifts to every color between coppery red to burnished green) </li>
|
||||
<li>Sydney Grace - Queen of Hearts (shimmery red) </li>
|
||||
<li>Sydney Grace - Ivy League (matte olive) </li>
|
||||
<li>Sydney Grace - Red Chameleon (duochrome that shifts green but buffs out brick red) </li>
|
||||
<li>Sydney Grace - Green Mist (white shimmer that shifts green) </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>blue indulgence </h2>
|
||||
<p>This is based on the blue eyeshadow rolling in for fall - any blue, any finish, any style. This one keeps getting suggested season after season by analysts, but Hannah Louise Poston's video has me convinced this time for no reason in particular. Blue is my f-a-v-o-r-i-t-e eyeshadow color (favorite color in general?), particularly a deep but not blackened true navy. My eyes are a relatively vibrant orangy brown, so deep blue makes them pop more than the traditional purple. Since I love blue so much, I have a few different variations of it. Why not put them all into a monochromatic palette and try the other blues more? <br></p>
|
||||
<img src="/static/img/ent/-.png" alt="(palette)"><br>
|
||||
<img src="/static/img/ent/-.png" alt="(swatches)"><br>
|
||||
<br>
|
||||
<h3>discoveries</h3>
|
||||
<p>Super Star and Below Zero are just as incredible as the navy shadows! Super Star is almost too gorgeous to be comfortably wearable - it catches a lot of attention and compliments. Luna pairs perfectly on the browbone with any of these. In general, it's been fun giving the non-navy blues a shot. <br></p>
|
||||
<br>
|
||||
<p>Eyeshadows in the Sydney Grace 9-pan palette <br></p>
|
||||
<ul>
|
||||
<li>Sydney Grace - Super Star (shimmery silvery blue) </li>
|
||||
<li>Sydney Grace - Boy Crazy (satiny cobalt blue) </li>
|
||||
<li>Sydney Grace - Indiana Love (matte navy) </li>
|
||||
<li>Sydney Grace - Below Zero (shimmery indigo with a purple shift) </li>
|
||||
<li>Sydney Grace - Perfect Storm (matte pastel blue) </li>
|
||||
<li>Sydney Grace - Deep Waters (shimmery navy) </li>
|
||||
<li>Looxi Beauty - Luna (not an eyeshadow but an icy blue highlighter) </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>custom palettes over premade any day! </h2>
|
||||
<p>I absolutely adore my palettes this go-around. The fall palette supports my vibe lately - neutral looks, color grounded in neutrals, and aegyo-sal. The blue supports the rest - colorful eyeliners and unstructured swarths of bold color. They're also a mix of favorites, reliables, and colors I never get around to wearing but totally should. Despite all that, I'm pretty sure if I saw an ad for these things, I wouldn't be that interested. No idea what that says about me. <br></p>
|
||||
<br>
|
||||
<h2>disclaimer </h2>
|
||||
<p>I buy my own makeup and don't have any affiliation with the brands mentioned. <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated October 10, 2022 <br>
|
||||
<br>
|
@ -1,124 +0,0 @@
|
||||
<!--210429,210402-->
|
||||
<h1>follow a moving target </h1>
|
||||
june 10, 2021<br>
|
||||
#ai #character #movement <br>
|
||||
<br>
|
||||
After redesigning the movement system to support <a href="../entries/210429">patrols</a>, I realized the path remains static even if the target moves. Time to tweak the design again. <br>
|
||||
<br>
|
||||
<h2>what must be done </h2><br>
|
||||
Autopathing to attack targets, skill targets, and item targets still partially relies on an old version of the movement system. Also, characters never update their pathfinding, so they cannot pursue moving targets. With some changes, the movement system can officially support following any of these targets, no matter where they go. <br>
|
||||
<br>
|
||||
For now, I'll update the movement system so the character can autopath after a moving item then pick it up once within reach. Since autopathing to items works identically to the others, the fix will be the same, too. <br>
|
||||
<br>
|
||||
<h2>upgrading the movement system </h2><br>
|
||||
I can keep the same system more or less, but one function is going to have to be rewritten: the character's path_to_object method. <br>
|
||||
<br>
|
||||
Before, it only set the next waypoint and built a path between the character and the waypoint. <br>
|
||||
<br>
|
||||
<h3>old path_to_object </h3><br>
|
||||
<code># Set Dots Between Character + Given Object<br>
|
||||
func path_to_object(goal):<br>
|
||||
if goal.is_in_group("waypoint"):<br>
|
||||
set_next(goal)<br>
|
||||
else: <br>
|
||||
room.add_waypoint(goal.get_gpos())<br>
|
||||
path_to_position(goal.get_gpos())<br>
|
||||
<br>
|
||||
# Set Dots Between Character + Given Position<br>
|
||||
func path_to_position(goal_pos):<br>
|
||||
set_dots(find_dots_pos(goal_pos))</code><br>
|
||||
<br>
|
||||
In order to follow moving targets, it needs to use the goal object itself. Also, it needs to be know when to only rebuild part of the path. <br>
|
||||
<br>
|
||||
<h3>the character receives a waypoint instead of the target, so he is unaware of his target's movement </h3><br>
|
||||
It took waypoints instead of the goal in the first place for consistency's sake. Since a target can either be a position (as with click-to-move) or an object (as with autopath-to-item) and the movement system only has one entry point, the old system only accepted objects. So when clicking-to-move, a Position2D waypoint is generated at the global mouse position. <br>
|
||||
<br>
|
||||
I took the consistency a step further and also generated waypoints at the position of object targets. If the character only has a waypoint, though, he cannot know whether the target is moving. Fortunately, the system only requires an object with a global position, not a waypoint in particular. Providing the goal directly to the character not only resolved issues but also simplified my code. <br>
|
||||
<br>
|
||||
<h3>constantly updating the path overwhelms the character </h3><br>
|
||||
If the target is moving, pathfinding needs to be reassessed periodically. However, it isn't as simple as calling the pathfinding method every tick. <br>
|
||||
<br>
|
||||
For one, the first point in the path will always be the character's starting position. If pathfinding is performed more quickly than the character can register arriving at the first point, he will either be frozen in place or jittering wildly. <br>
|
||||
<br>
|
||||
For two, it's bad for performance. Generally, the efficiency of a lightweight Godot game on modern hardware is not a critical concern, but it's not like I've never managed to bog down the performance through lazy pathfinding. Probably best to avoid extra pathfinding operations when possible. If the target hasn't moved at all, no need to recalculate anything. If the target has moved closer to the character, maybe only the farthest points need to be reconsidered. <br>
|
||||
<br>
|
||||
The next playable release after the bingo version will have a teleporting boss, so I'll probably need to be more thoughtful about pathfinding then. For now, though, these two fixes should do it... <br>
|
||||
<br>
|
||||
<h3>new path_to_object </h3><br>
|
||||
# Set Dots Between Character + Given Object<br>
|
||||
func path_to_object(goal):<br>
|
||||
# Next Waypoint<br>
|
||||
set_next(goal)<br>
|
||||
var goal_pos = goal.get_gpos()<br>
|
||||
var dots = get_dots()<br>
|
||||
var cd = get_current_dot()<br>
|
||||
# If no current dot, set dots between user and goal<br>
|
||||
if cd == null:<br>
|
||||
set_dots(find_dots_pos(get_gpos(), goal_pos))<br>
|
||||
MessageBus.publish("moved", self)<br>
|
||||
return<br>
|
||||
var last_dot = cd if len(dots) == 0 else dots.back()<br>
|
||||
# Make sure goal has moved significantly<br>
|
||||
if goal_pos.distance_to(last_dot) <= get_intimate_space():<br>
|
||||
return<br>
|
||||
# If goal moved further away<br>
|
||||
if get_gpos().distance_to(last_dot) > find_distance(goal):<br>
|
||||
# If no dots, generate new ones<br>
|
||||
if len(dots) == 0:<br>
|
||||
set_dots(find_dots_pos(get_gpos(), goal_pos))<br>
|
||||
MessageBus.publish("moved", self)<br>
|
||||
return<br>
|
||||
# If dots, only recalculate part of the path<br>
|
||||
var near = get_dots()[0]<br>
|
||||
for dot in get_dots():<br>
|
||||
if dot.distance_to(goal_pos) < near.distance_to(goal_pos):<br>
|
||||
near = dot<br>
|
||||
var i = get_dots().find(near)<br>
|
||||
set_dots(get_dots().slice(0, i - 1) +<br> find_dots_pos(get_dots()[i-1], goal_pos))<br>
|
||||
# If goal moved closer<br>
|
||||
else:<br>
|
||||
set_dots(find_dots_pos(last_dot, goal_pos))<br>
|
||||
MessageBus.publish("moved", self)</code><br>
|
||||
<br>
|
||||
<h2>testing </h2><br>
|
||||
Now let's test it. I don't have any items that move around, so I'll quickly throw that in. I'll add some movement based on a sine wave into the _process method.<br>
|
||||
<br>
|
||||
<code>var time = 0
|
||||
|
||||
func _process(delta):
|
||||
time += delta
|
||||
var mod = Vector2(delta, cos(time) * 2)
|
||||
set_gpos(get_gpos() + mod)</code><br>
|
||||
<br>
|
||||
<br>
|
||||
<h3>the character never stops autopathing, even after picking up the item </h3>
|
||||
<br>
|
||||
Okay, one more fix, then I'll have it. <br>
|
||||
<br>
|
||||
Previously, the movement AI relied on conditional statements in its process to detemine arrival at the goal. Instead, the <a href="../entries/210402">achievement system</a> handles arrival for the new movement system. Since the process is called faster than the event handlers can function, the old AI system picked up and queue_free'd the floor item before the new system could recognize it had arrived at the goal. This meant the character never truly arrived and never knew to halt the movement process or clear movement variables. <br>
|
||||
<br>
|
||||
Moving the conditional statements from _process to the function that handles the outcome of movement events. <br>
|
||||
<br>
|
||||
<h3>new result code </h3><br>
|
||||
<code>#enum MOVED {ARRIVED, NOT_MOVING, TOO_SLOW, WRONG_DIRECTION}<br>
|
||||
func handle_moved_result(result, new_user):<br>
|
||||
if result == 0:<br>
|
||||
new_user.think("UserMove/Arrived")<br>
|
||||
if get_user().get_target() != null:<br>
|
||||
if track:<br>
|
||||
if get_user().find_distance_to_target() <= get_user().get_intimate_space():<br>
|
||||
emit_signal('item_arrived')<br>
|
||||
get_waypoints().pop_front()<br>
|
||||
new_user.clear_movement()<br>
|
||||
return</code><br>
|
||||
<br>
|
||||
<h2>just a few changes makes a big difference </h2><br>
|
||||
<center>
|
||||
<img src="/static/img/ent/follow.gif" alt="(image: Angel adjusts her pathfinding to follow a moving item.)"></center><br>
|
||||
<br>
|
||||
To test, I made some moving items for the player to try to pick up. Now instead of bee-lining for the last known location of an item, she constantly readjusts her path towards the current location of the item. Looks good to me! <br>
|
||||
<br>
|
||||
(I haven't considered moving items before. They're pretty cool. It's like catching butterflies in Skyrim.) <br>
|
||||
<br>
|
||||
Last Updated October 29, 2021
|
||||
<br>
|
@ -1,102 +0,0 @@
|
||||
<!--200806,201015-->
|
||||
<h1>playing FlightRising with spreadsheets </h1>
|
||||
may 13, 2021<br>
|
||||
#offtopic #spreadsheets #petsites <br>
|
||||
My dragon breeding spreadsheet is really coming together, so I thought sharing it would be a fun break from AI. <br>
|
||||
<br>
|
||||
FlightRising is a petsite where you can breed and raise pet dragons. The dragons' appearances are determined by the breeds, genes, and colors of their parents, which have varying levels of dominance. So if you want a dragon that looks a certain way, you'll probably have to find the closest available matches and carefully breed them. There's a lot of factors to keep up with, so spreadsheets work better than keeping it all in my head. <br>
|
||||
<h2>spreadsheets </h2><br>
|
||||
<br>
|
||||
There's sheets for an overview of breeding pairs, individual parents, each breeding project, and calculators and data. If you want the spreadsheet, too, you can download my template for <a href="/download/fr_projects.ods">Calc</a> or <a href="/download/fr_projects.xlsx">Excel</a>. I use <a href="https://www.libreoffice.org/discover/calc/">LibreOffice Calc</a> for the spreadsheets, but it should work the same as Excel. I'll go over how everything works, so you can modify it to suit your own projects. <br>
|
||||
<h3>individual dragons </h3><br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_singles.png" alt="(image: screenshot from the Singles tab.)" style="display:block;" width="500"></center> <br>
|
||||
<h4>sex </h4><br>
|
||||
The sex field is limited to ♂ or ♀ and can be selected using a dropdown menu. The content will color the cell blue or pink. <br>
|
||||
<br>
|
||||
I made the dropdown menu through Data Validity (Data > Validity...). <br>
|
||||
<center><img src="/static/img/ent/FR_datavalidity.jpg" alt="(image: Validity>Criteria. Allow: Cell range. Source: $Calculator.$i$3.$I$4.)" width="500"></center> <br>
|
||||
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). <br>
|
||||
<center><img src="/static/img/ent/fr_conditionalformatting.png" alt="(image: Managing Conditional Formatting. Condition 1: cell value is equal to '♀'. .)" width="500"></center> <br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_newstyle.png" alt="(image: Apply Style>New Style...>Background.)" width="500"></center> <br>
|
||||
<h4>breeding status </h4><br>
|
||||
Depending on the breed's cooldown and date of last breeding, the cell will say "Ready" or "Cooldown" in green or red. <br>
|
||||
<center><img src="/static/img/ent/fr_status_formula.png" alt="(image: =IF(H2<=TODAY(),'Ready','Cooldown'))"></center> <br>
|
||||
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. <br>
|
||||
<h4>breed </h4><br>
|
||||
The breed, like the sex, is a Data Validity-determined dropdown menu. The list of breeds is sourced from a column in Calculator. <br>
|
||||
<center><img src="/static/img/ent/fr_breeds.png" alt="(image: The Calculator Sheet has a column for the Breed and a column for its Cooldown.)" width="500"></center> <br>
|
||||
<h4>breed's cooldown </h4><br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_vlookup.png" alt="(image: =VLOOKUP($D2,$Calculator.$G$3:$H$18,2,0))"></center> <br>
|
||||
<h4>date bred </h4><br>
|
||||
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. <br>
|
||||
<h4>nest ready </h4><br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_nestready.png" alt="(image: =F2+6)"></center> <br>
|
||||
<h4>date ready to breed again </h4>
|
||||
This is another simple formula - the date bred + the cooldown. <br>
|
||||
<center><img src="/static/img/ent/fr_dateready.png" alt="(image: =F2+E2)"></center> <br>
|
||||
<h4>cooldown countdown </h4><br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_cooldown.png" alt="(image: =IF($H2-TODAY()>0,CONCAT($H2-TODAY(),' days'),''))"></center> <br>
|
||||
<h3>dragon pairs </h3><br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_pairs.png" alt="(image: screenshot of the Pairs sheet)" width="500"></center> <br>
|
||||
<h4>project</h4> <br>
|
||||
I add the project, so I know my goal for the pair. It's helpful when prioritizing or sorting. <br>
|
||||
<h4>male + female</h4> <br>
|
||||
I add the dragon pair's names here. Data validity makes sure the name corresponds to a dragon from the Singles sheet. <br>
|
||||
<center><img src="/static/img/ent/fr_dragonvalidity.png" alt="(image: Data Validity by cell range. Source: $Singles.$A:$Singles.$A.)" width="500"></center><br>
|
||||
<h4>status </h4> <br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_status.png" alt="(image: =IF(AND((VLOOKUP($B2,$Singles.$A:$C,3,)='Ready'),(VLOOKUP(C2,$Singles.A:C,3,)='Ready')),'Ready','Cooldown'))"></center> <br>
|
||||
<h4>date ready </h4><br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_ready.png" alt="(image: =MAX(VLOOKUP($B3,$Singles.$A:$H,8,),VLOOKUP($C3,$Singles.$A:$H,8,)))"></center> <br>
|
||||
<h4>countdown </h4><br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_countdown.png" alt="(image: =IF($E2-TODAY()>0,CONCAT($E2-TODAY(), ' days'),''))"></center> <br>
|
||||
<h4>colors + genes</h4> <br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_genetics.png" alt="(image: a screenshot from FlightRising of a dragon's genetics.)"></center> <br>
|
||||
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. <br>
|
||||
<h4>best son + best daughter</h4> <br>
|
||||
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. <br>
|
||||
<h3>calculator + data </h3><br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_calculator.png" alt="(image: screenshot of the Calculator sheet.)" width="500"></center> <br>
|
||||
<h4>colors </h4><br>
|
||||
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 <a href="https://flightrising.com/main.php?p=lair&tab=userpage&id=66886">Rauxel</a> and also contains the original, much smaller color range. <br>
|
||||
<center><img src="/static/img/ent/fr_colorwheel.png" alt="(image: the color wheel by Rauxel.)" width="500"></center> <br>
|
||||
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. <br>
|
||||
<br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_magnitude.png" alt="(image: =ABS(MATCH($C3,$F$2:$F$178, )-MATCH($B3,$F$2:$F$178, )))" width="500"></center> <br>
|
||||
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. <br>
|
||||
<center><img src="/static/img/ent/fr_direction.png" alt="(image: =IF((MATCH($C3,$F$2:$F$178,)-MATCH($B3,$F$2:$F$178,))>0,'↓','↑'))"></center> <br>
|
||||
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. <br>
|
||||
<h4>breeding info</h4> <br>
|
||||
These are the columns used by the breeding pages for validity and VLOOKUP. <br>
|
||||
<h4>breeding day calculator</h4> <br>
|
||||
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. <br>
|
||||
<h3>project sheets </h3><br>
|
||||
Here I list the dragons by project, tracking their genealogy, sex, colors, genes, and average distance from goal colors. <br>
|
||||
<center><img src="/static/img/ent/fr_project.png" alt="(image: screenshot of the Boyfriend project sheet)" width="500"></center> <br>
|
||||
<h4>father + mother </h4><br>
|
||||
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. <br>
|
||||
<h4>sex </h4><br>
|
||||
Male or female, with colored conditional formatting so I can scan by sex more easily. <br>
|
||||
<h4>primary, secondary, + tertiary colors </h4><br>
|
||||
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. <br>
|
||||
<h4>gene 1, 2, + 3 </h4><br>
|
||||
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. <br>
|
||||
<h4>average </h4><br>
|
||||
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. <br>
|
||||
<h2>that's all~ </h2>
|
||||
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! <br>
|
||||
<center><img src="/static/img/ent/fr_dragons.png" alt="(image: Sand (male Sand Giraffe / Shadow Toxin / Rose Smoke Fae), Abbey (male Platinum Skink / Smoke Peregrine / Pearl Basic Tundra), Rune (male Eldritch Sphinxmoth / Eldritch Hawkmoth / Eldritch Runes Veilspun with eternal youth and dark sclera), Laguna (female Honeydew Cherub / Sanddollar Butterfly / Marigold Firefly Skydancer.)" width="500"></center>
|
||||
<br>
|
||||
Last updated May 26, 2021 <br>
|
||||
<br>
|
@ -1,115 +0,0 @@
|
||||
<!--230112,230601-->
|
||||
<h1>gator swimsuit </h1>
|
||||
august 25, 2022<br>
|
||||
#fashion #swimwear #design-process #animalparade <br>
|
||||
<br>
|
||||
<p>A swimsuit designed just for me. <br></p>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/gator.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/gator.jpg" alt="(photo: quick photo of the finished garment, hanging against my door.)">
|
||||
</a><br>
|
||||
<br>
|
||||
<h2>concept </h2>
|
||||
<p>Gator is part of Animal Parade, a collection that emphasizes the individualism of clothing. Every garment deserves special consideration, even basic undershirts, sleep masks, etc. <br></p>
|
||||
<br>
|
||||
<p>All the designs are named after important animals in my life. The swimsuit is named <i>Gator</i> because of the gator who lives in my swampy subdivision. I've seen him during walks. Absolutely unnerving. <br>
|
||||
<br>
|
||||
<h2>design process </h2>
|
||||
<p>I haven't had a swimsuit for years and never like any in the store anyway. I browsed online catalogs in English and 日本語 and window-shopped everywhere in town, searching for both style and technical inspiration. I've never worked with active wear garments, so I studied the inside of nearly everything at Dick's Sporting Goods to understand the style elements, seams, and findings typical of swimsuits and active wear in general. <br></p>
|
||||
<br>
|
||||
<h3>one-and-a-half-piece </h3>
|
||||
<p>The swimsuits that stood out to me were blurring the line between one-piece and two-piece. I can't find my old collage, but here's a quick one. Sorry for not remembering the source of the images. <br></p>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/collage.png">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/collage.png" alt="(collage: variety of swimsuits from online stores)">
|
||||
</a><br>
|
||||
<p>I iterated over the concept in sketches a little. <br></p>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/sketch-twopiece.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/sketch-twopiece.jpg" alt="(sketch: a series of rough pencil croquis with different variations of two-pieces.)">
|
||||
</a><br>
|
||||
<p>Ideas: <br></p>
|
||||
<ul>
|
||||
<li>Connecting the top and bottom with interlocked tricot loops, criss-crossing over the belly and lower back. </li>
|
||||
<li>Overlapping hanging petals of tricot over a tiered swim skirt. </li>
|
||||
<li>Long-sleeve mock turtleneck shirt under a spaghetti strap wrap one piece</li>
|
||||
<li>Flowing panel under the bust line, worn over a tiered swim skirt</li>
|
||||
<li>Ruched bodysuit worn under a structured balconette tank</li>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/sketch-chiffon.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/sketch-chiffon.jpg" alt="(sketch: realized version)">
|
||||
</a><br>
|
||||
<p>This is where the one-and-a-half-piece idea led. I like the sheer fabric in the central examples from the collage. I love texture, so all the ruching and gathers really stand out to me, too. I wonder how feasible it would be to make two "two-pieces" - one relatively basic bikini with a loop in the center front of the swim bottoms, and another sheer, pintucked overlay with a tricot panel peek-a-boo skirt that fastens onto the loop. The overlay is tiered in the back then parts around the sides until it fully exposes the midriff in the front. <br></p>
|
||||
<br>
|
||||
<p>I'm not sure tricot or mesh would be sturdy enough for pintucks, so I checked if chiffon swimwear is even a thing. It actually is! Plenty of chiffon sleeves and panels floating around out there. <br></p>
|
||||
<br>
|
||||
<p>I really like this design. The central fastener on the swim bottoms isn't like anything I've seen in stores. The suit's connected in enough places that it shouldn't become a shapeless bubble underwater. I bet it'd be gorgeous to watch float and flow in the waves. <br></p>
|
||||
<br>
|
||||
<p>Unfortunately, pretty or not, I don't think it's practical. Chiffon is a dainty fabric, and swimming is not a dainty activity. There's plenty of brick and concrete around and roughhousing with friends. Besides, chiffon isn't that comfortable to wear dry, and I cringe imagining chlorine-soaked chiffon Saran-wrapped over my torso. Not to mention, I don't know how comfortable I am with a two-piece anyway. Body insecurities! (Who doesn't have them?) <br></p>
|
||||
<br>
|
||||
<p>Back to the drawing board! <br></p>
|
||||
<br>
|
||||
<h3>made for me</h3>
|
||||
<p>Instead of synthesizing the prettiest elements into one swimsuit, I should be synthesizing the most practical elements into one swimsuit. People who feel confident and comfortable in their clothes are the prettiest! Also, ruffled chiffon is the definition of my comfort zone. Active wear is an opportune time to try new designs. <br></p>
|
||||
<br>
|
||||
<ul>
|
||||
<li>I want less skin showing, but I want to feel the water on some part of my body. </li>
|
||||
<li>I prefer the collage swimsuits with tiered swim skirts. Many "modest" swimsuits look like short bodycon dresses. I'm not insecure about the length of my swimsuit; I'm insecure about nothing covering my abdomen but spandex! If the tiers are detached and start high, it obscures this area without looking frumpy. </li>
|
||||
<li>Virtually every well-made sporting goods swimsuit (and every piece of male active wear for that matter) had raglan sleeves. This makes sense, since it's a style that doesn't impede rotation of the shoulder, but I'm surprised it's raglan or bust for athletes. Guess I'll take note. <li>
|
||||
<li>Mock turtlenecks are just the best. I have a long neck, so they look good on me. </li>
|
||||
</ul>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/sketch-raglan.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/sketch-raglan.jpg" alt="(sketch: realized version)">
|
||||
</a><br>
|
||||
<p>I drew and drew over the same croquis, so the process was lost apart from long raglan sleeves, a mock turtleneck, and tiered layers around the lower body. I went back and forth between full-coverage bikini bottoms and shorts. I also had an idea for a swim obi belt. Obi belts were all over the runway a few years ago. I couldn't find anything quite like it on a swimsuit, but it seems like such a cool idea. Maybe not practical, but I'd go for it if it didn't require <i>so</i> much fabric. <br></p>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/ZuhairMurad_PreFall2019_00015-Zuhair-Paris-Pre-Fall-19-credit-Emmanuel-Giraud.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/ZuhairMurad_PreFall2019_00015-Zuhair-Paris-Pre-Fall-19-credit-Emmanuel-Giraud.jpg" alt="(fashion photography: two looks. One is a bodycon black dress with a Mandarin collar, plunging neckline, and fringe ’sleeves’, topped with a textured black obi belt with long tassels. The other is cropped black dress pants worn with a garment at the intersection of tailored blazer and kimono, with fringe falling from the shoulders, topped with a black velvet obi belt tied with tassels. )">
|
||||
</a><br>
|
||||
<i>Zuhair Murad presented some of my favorite obi belt looks during the Pre-Fall 2019 show. Photo credit to Emmanuel Giraud. <br>(Wait, a design like this wouldn't take as much fabric...Hmmm.) <br></i>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/final.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/final.jpg" alt="(sketch: realized version)">
|
||||
</a><br>
|
||||
<p>Anyway, this is close to what I made. I moved the zipper to the center back to avoid breaking up my beautiful fabric. I didn't care to insert piping into active wear seams. (yes, those aren't thick seams - that is piping.) I didn't make the obi belt either, but I might. I have long strips of fabric left over, and it might be enough to do something cool. <br></p>
|
||||
<h2>material</h2>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/fabricshopping.png">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/fabricshopping.png" alt="(screenshot: pastel seafoam, mauve, and sulfur neoprene with a swamp print)">
|
||||
</a><br>
|
||||
<i><a href="https://www.moodfabrics.com/mystic-swamp-digitally-printed-stretch-neoprene-scuba-knit-307451">Mood Fabric's Mystic Swamp Digitally Printed Stretch Neoprene/Scuba Knit</a></i> <br>
|
||||
<p>I chose neoprene because it's flatteringly thick, durable, and still relatively trendy in fashion after years of being delegated to seat covers and boring functional garments. I've never sewn with it before and heard terrible things, but I'll try it. <br></p>
|
||||
<br>
|
||||
<p>This print in particular is so unique. In a sea of tropical island palm tree, this is a swamp! I grew up in swamps and live in a swamp, and I <i>never</i> see our biome fantasized like this. It's also bright and pastel without entering some generic rainbow or pastel goth palette. It even includes that incredible glowing sulfur color from <a href="https://www.pantone.com/articles/past-colors-of-the-year/color-of-the-year-2021">PANTONE's 2021 Color of the Year</a>. I <i>adore</i> this fabric. <br></p>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/neoprene.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/neoprene.jpg" alt="(photo: my cut of neoprene)">
|
||||
</a><br>
|
||||
<p>I paired it with a seafoam invisible zipper, pastel rainbow thread, and gray thread. <br></p>
|
||||
<h2>pattern-making</h2>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/pattern.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/pattern.jpg" alt="(photo: my paper pattern pieces, hanging with the rest of my patterns)">
|
||||
</a><br>
|
||||
<p>This is my only picture of my pattern for now. I make them out of thick paper and store them by piercing each set with a safety pin then hanging them from yarn bows. <br></p>
|
||||
<br>
|
||||
<p>I've never made a raglan sleeve and don't even own any, so this was a real challenge. I started with a regular sloper, taped them together, cut them along the "raglan line," used that to sew a knit bodysuit, then fitted and seam-ripped and resewed until it was spot-on. <br></p>
|
||||
<br>
|
||||
<p>I've never designed a mock turtleneck either, even though I really ought to have by now. For some reason, I imagining it should be more tapered, but the neck is relatively tubular. The triangular muscles connecting the neck to the shoulders aren't as important, especially with my placement of the scoop "neckline." However, starting the collar that far out adds inches to the height requirement. It took several iterations before it was long enough to actually look like a turtleneck. <br></p>
|
||||
<br>
|
||||
<p>Sleeves are sleeves. Princess lines and tiers-and-panels are my specialty, so no problem there. Then I traced my comfiest pair of full-coverage underwear for the leg openings. <br></p>
|
||||
<br>
|
||||
<p>As with most of my tiered designs, the tiers of the skirt only start an inch or so from beneath the previous tier. That bottom tier isn't much longer than the tier on the top. This reduces bulk and fabric consumption, which is 100x more important on a swimsuit made of pricy fabric. The length of the tiers took a lot of experimentation. They need to be balanced, fall at flattering points of my body, begin at comfortable points on my body, and work with the print. I played in front of a mirror in loops of measuring tape all day. <br></p>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/tieredpanels.png">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/tieredpanels.png" alt="(MS paint sketch: panels underlay the tiers. In-between each panel of the skirt, a gathered tier begins. This contrasts economically with a skirt where every tier begins at the waist.)">
|
||||
</a><br>
|
||||
<h2>cut and sew </h2>
|
||||
<p>I was very conscious of the print while cutting. I used the stark white sky as an anchor and draped a few different placements - across the collarbone, across the bustline, and my chosen placement, atop the chest. The print has dense dark areas and light fluffy areas, and this placement emphasized femininity. The grays and trees are at my chest, emphasizing them while still looking painterly and abstract enough to not be garish. The blacks and voids are at my waist, neck, upper arms, and lap. Then the dense, difficult-to-read green foliage obscures my lower body. Perfect! I matched the arms, which puts the placid blue water on my forearms, so the part I see the most is my favorite part of the print. Overall, great luck with the vertical repeat on this fabric. <br></p>
|
||||
<br>
|
||||
<p>As for sewing, these are all serged seams using pastel rainbow thread. The edges are finished with gray serging. The tiers were basted and gathered by hand before being sewn into the skirt. It was very, very easy. The girls who told me neoprene doesn't hold stitches must have had finicky machines. <br></p>
|
||||
<br>
|
||||
<p>The top is supported by underwire and thin cups. I cut up an old bra and attached it to the lining by hand. It was nerve-wracking doing the fittings because they were done with the garment inside-out and any markings involving stretchy material around curves are difficult to achieve accuracy with. The final fit is perfect, though. <br></p>
|
||||
<h2>outcome</h2>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/gator.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/gator.jpg" alt="(photo: quick photo of the finished garment, hanging against my door.)">
|
||||
</a><br>
|
||||
<p>I've taken it to the beach and the pool and feel so special. No one has a swimsuit like this. The colors are adorable and unique. The print and colors are so intricate compared to the rest of the market. The design is relatively modest but still youthful. I get so many compliments. I'm also glad I pushed myself away from making yet another ruffled chiffon gown. Even within the realm of activewear neoprene, my design aesthetic is still obvious, and that's cool to see. <br></p>
|
||||
<br>
|
||||
<p>It's very comfortable to wear, too, which was my number one design goal here. The skirt isn't too bulky, so I can get away with oversized jeans as my coverup. I feel confident under the thick fabric and tiered skirt, and the long sleeves and tall neck protect me from the full blast of the sun. My thighs do show, but whatever. They're usually underwater anyway. The swimsuit maintains its shape well underwater, too. <br></p>
|
||||
<br>
|
||||
<p>When I was done, I immediately sewed four mock turtleneck undershirts based off this pattern and love them, too! When I have more time, I'll share the rest of my garments in another diary entry. Until then, enjoy the rest of summer. <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 31, 2022
|
||||
<br>
|
@ -1,105 +0,0 @@
|
||||
<!--210610,200429-->
|
||||
<h1>gator swimsuit </h1>
|
||||
october 20, 2022<br>
|
||||
#fashion #swimwear #design-process #animalparade <br>
|
||||
<br>
|
||||
<h2>concept </h2>
|
||||
<p>Gator is part of Animal Parade, a collection that emphasizes the individualism of clothing. Every garment should be valued and individualized, even basic undershirts, sleep masks, etc. <br></p>
|
||||
<br>
|
||||
<p>All the designs are named after important animals in my life. The swimsuit is named <i>Gator</i> because of the gator who lives in my subdivision. I've seen him during walks. Absolutely unnerving. <br>
|
||||
<br>
|
||||
<h2>design process </h2>
|
||||
<p>I haven't had a swimsuit for years and never like any anyway. I browsed online catalogs in English and 日本語 and window-shopped everywhere in town, searching for both style and technical inspiration. I've never worked with active wear garments, so I studied the inside of nearly everything at Dick's Sporting Goods to understand the style elements, seams, and findings typical of swimsuits and active wear in general. I learned a lot but liked virtually nothing. <br></p>
|
||||
<br>
|
||||
<h3>1.5 piece </h3>
|
||||
<p>The swimsuits that stood out to me were treading the line between one piece and two-piece. I can't find my old collage, but here's a quick one. Sorry for not remembering the source of the images. I iterated over the concept in sketches a little. <br></p>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/collage.png">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/collage.png" alt="(collage: variety of swimsuits from online stores)">
|
||||
</a><br>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/sketch-twopiece.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/sketch-twopiece.jpg" alt="(sketch: a series of rough pencil croquis with different variations of two-pieces.)">
|
||||
</a><br>
|
||||
<p>Ideas: <br></p>
|
||||
<ul>
|
||||
<li>Connecting the top and bottom with interlocked tricot loops, criss-crossing over the belly and lower back. </li>
|
||||
<li>Overlapping hanging petals of tricot over a tiered swim skirt. </li>
|
||||
<li>Long-sleeve mock turtleneck shirt under a spaghetti strap wrap one piece</li>
|
||||
<li>flowing panel under the bust line, worn over a tiered swim skirt</li>
|
||||
<li>Ruched bodysuit worn under a structured balconette tank</li>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/sketch-chiffon.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/sketch-chiffon.jpg" alt="(sketch: realized version)">
|
||||
</a><br>
|
||||
<p>This is where the two-piece idea led. I like the sheer fabric in the central examples from the collage. I love texture, so all the ruching and gathers really stand out to me, too. I wonder how feasible it would be to make two "two-pieces" - one relatively basic bikini with a loop in the center front of the swim bottoms, and another sheer, pintucked overlay with a tricot panel peek-a-boo skirt that fastens onto the loop. The overlay is tiered in the back then parts around the sides until it fully exposes the midriff in the front. <br></p>
|
||||
<br>
|
||||
<p>I'm not sure tricot or mesh would be sturdy enough for pintucks, so I checked if chiffon swimwear is even a thing. It actually is! Plenty of chiffon sleeves and panels floating around out there. <br></p>
|
||||
<br>
|
||||
<p>I really like this design. The central fastener on the swim bottoms isn't like anything I've seen in stores. The suit's connected in enough places that it shouldn't become a shapeless bubble nor flap up and show too much skin underwater. I bet it'd be gorgeous to watch float and flow in the waves. <br></p>
|
||||
<br>
|
||||
<p>Unfortunately, pretty or not, I don't think it's practical. Chiffon is a dainty fabric, and swimming is not a dainty activity. I lean against brick and against concrete without babying my clothes. Chiffon isn't that comfortable to wear dry, and I cringe imagining soaking wet chlorine chiffon Saran-wrapped over my torso. Not to mention, I don't know how comfortable I am with a two-piece anyway? Body insecurities! <br></p>
|
||||
<p>Back to the drawing board! <br></p>
|
||||
<br>
|
||||
<h3>made for me</h3>
|
||||
<p>Instead of synthesizing the prettiest elements into one swimsuit, I should be synthesizing the most practical elements into one swimsuit. People who feel confident and comfortable in their clothes are the prettiest! <br></p>
|
||||
<br>
|
||||
<ul>
|
||||
<li>I want less skin showing, but I want to feel the water on some part of my body. </li>
|
||||
<li>I prefer the collage swimsuits with tiered swim skirts. Many "modest" swimsuits look like short bodycon dresses. I'm not insecure about my swimsuit being too short; I'm insecure about showing the world my lower abdomen! If the tiers are detached and start high, it obscures this area without looking frumpy. </li>
|
||||
<li>Virtually every well-made sporting goods swimsuit (and almost every piece of male active wear for that matter) had raglan sleeves. This makes sense, since it's a sleeve that doesn't impede rotation of the shoulder, but I'm surprised it's raglan or bust for athletes. Guess I'll take note. <li>
|
||||
<li>Mock turtlenecks are just the best. I have a long neck, so they look good on me. </li>
|
||||
</ul>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/sketch-raglan.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/sketch-raglan.jpg" alt="(sketch: realized version)">
|
||||
</a><br>
|
||||
<p>I drew and drew over the same croquis, but the big idea is a long-sleeved raglan with a mock turtleneck and tiered layers around the lower body. I facilitated between full-coverage bikini bottoms and shorts. I also had an idea for a swim obi belt. Obi belts were all over the runway a few years ago. I couldn't find anything quite like it on a swimsuit, but it seems like such a cool idea. Maybe not practical, but I'd go for it if it didn't require <i>so</i> much fabric. <br></p>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/ZuhairMurad_PreFall2019_00015-Zuhair-Paris-Pre-Fall-19-credit-Emmanuel-Giraud.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/ZuhairMurad_PreFall2019_00015-Zuhair-Paris-Pre-Fall-19-credit-Emmanuel-Giraud.jpg" alt="(fashion photography: two looks. One is a bodycon black dress with a Mandarin collar, plunging neckline, and fringe ’sleeves’, topped with a textured black obi belt with long tassels. The other is cropped black dress pants worn with a garment at the intersection of tailored blazer and kimono, with fringe falling from the shoulders, topped with a black velvet obi belt tied with tassels. )">
|
||||
</a><br>
|
||||
<i>Zuhair Murad presented some of my favorite obi belt looks during the Pre-Fall 2019 show. Photo credit to Emmanuel Giraud. <br></i>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/final.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/final.jpg" alt="(sketch: realized version)">
|
||||
</a><br>
|
||||
<p>Anyway, this is close to what I made. I moved the zipper to the center back to avoid breaking up my beautiful fabric. I didn't care to insert piping into active wear seams. (yes, those aren't thick seams - that is piping.) I didn't make the obi belt either, but I might. I have long strips of fabric left over, and it might be enough to do something cool. <br></p>
|
||||
<h2>material</h2>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/fabricshopping.png">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/fabricshopping.png" alt="(screenshot: pastel seafoam, mauve, and sulfur neoprene with a swamp print)">
|
||||
</a><br>
|
||||
<i><a href="https://www.moodfabrics.com/mystic-swamp-digitally-printed-stretch-neoprene-scuba-knit-307451">Mood Fabric's Mystic Swamp Digitally Printed Stretch Neoprene/Scuba Knit</a></i> <br>
|
||||
<p>I chose neoprene because it's luxuriously, flatteringly thick, durable, and still relatively trendy in fashion after years of being delegated to seat covers and boring functional garments. I've never sewn with it before and heard terrible things, but I'll try it. <br></p>
|
||||
<br>
|
||||
<p>This print in particular is so unique. In a sea of tropical island palm tree prints, this one has swamps! I grew up in swamps and live in a swamp, and I <i>never</i> see our biome fantasized into artwork like this. It's also bright and pastel without entering some generic rainbow or pastel goth palette. It even includes that incredible glowing sulfur color from <a href="https://www.pantone.com/articles/past-colors-of-the-year/color-of-the-year-2021">PANTONE's 2021 Color of the Year</a>. I <i>adore</i> this fabric. <br></p>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/neoprene.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/neoprene.jpg" alt="(photo: my cut of neoprene)">
|
||||
</a><br>
|
||||
<p>I paired it with a seafoam invisible zipper, pastel rainbow thread, and gray thread. <br></p>
|
||||
<h2>pattern-making</h2>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/pattern.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/pattern.jpg" alt="(photo: my paper pattern pieces, hanging with the rest of my patterns)">
|
||||
</a><br>
|
||||
<p>This is my only picture of my pattern for now. I make them out of thick paper and hang them by piercing a full set with a safety pin then hanging them from yarn bows. <br></p>
|
||||
<br>
|
||||
<p>I've never made a raglan sleeve and don't even own any, so this was a real challenge. I started with a regular sloper, taped them together, cut them along the "raglan line," used that to sew a knit bodysuit, then fitted and seam-ripped and resewed until it was spot-on. <br></p>
|
||||
<br>
|
||||
<p>I've never designed a mock turtleneck either, even though I really ought to have by now. For some reason, I imagining it should be more tapered, but the neck is relatively tubular. The triangular muscles connecting the neck to the shoulders aren't as important, especially with my placement of the scoop "neckline." It also took several iterations before it was long enough to actually look like a turtleneck. <br></p>
|
||||
<br>
|
||||
<p>Sleeves are sleeves. Princess lines and tiers-and-panels are practically my specialty, so no problem there. Then I traced my comfiest pair of full-coverage underwear for the leg openings. As with most of my tiered designs, the tiers of the skirt only start an inch or so from under the previous tier. That bottom tier isn't much longer than the tier on the top. This reduces bulk and fabric consumption, which is 100x more important on a swimsuit made of pricy fabric. The length of the tiers took a lot of experimentation. They need to be balanced, fall at flattering points of my body, begin at comfortable points on my body, and work with the print.<br></p>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/tieredpanels.png">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/tieredpanels.png" alt="(MS paint sketch: panels underlay the tiers. In-between each panel of the skirt, a gathered tier begins. This contrasts economically with a skirt where every tier begins at the waist.)">
|
||||
</a><br>
|
||||
<p>I was very conscious of the print while cutting. I used the white sky as an anchor and draped a few different placements - across the collarbone, across the bustline, and my chosen placement, atop the chest. The print has dense dark areas and light fluffy areas, and this placement emphasized femininity. The grays and trees are at my breasts, emphasizing them while still looking painterly and abstract enough to not be garish. The blacks and voids are at my waist, neck, upper arms, and crotch. Then the dense, difficult-to-read green foliage obscures my lower body. Perfect! I matched the arms, which puts the placid blue water on my forearms, so the part I see the most is my favorite part of the print. Overall, perfect sizing and placement in my eyes. <br></p>
|
||||
<br>
|
||||
<p>As for sewing, these are all serged seams using pastel rainbow thread. The edges are serged with gray. The tiered were basted and gathered by hand. It was very, very easy. Whoever told me neoprene doesn't hold stitches must have had a very finicky machine. <br></p>
|
||||
<br>
|
||||
<p>The top is supported by underwire and thin cups. I cut up an old bra and attached it to the lining by hand. It was kind of nerve-wracking doing the fittings because any markings or fittings involving stretchy material around the breasts are difficult to achieve accuracy with, but the final fit is perfect. <br></p>
|
||||
<h2>outcome</h2>
|
||||
<a target="_blank" href="/static/img/fash/churchgirls+animalparade/Gator/gator.jpg">
|
||||
<img src="/static/img/fash/churchgirls+animalparade/Gator/gator.jpg" alt="(photo: quick photo of the finished garment, hanging against my door.)">
|
||||
</a><br>
|
||||
<p>I've taken it to the beach and the pool and feel so special. No one has a swimsuit like this. The colors are adorable and unique. The print is so intricate compared to the rest of the market. The design is relatively modest but still youthful. I get so many compliments. <br></p>
|
||||
<br>
|
||||
<p>It's very comfortable to wear, too, which was my number one design goal here. The skirt isn't too bulky, so I can get away with oversized jeans as my coverup. I feel confident under the thick fabric and tiered skirt, and the long sleeves and tall neck protect me from the full blast of the sun. My thighs do show, but whatever. They're usually underwater anyway. The swimsuit maintains its shape well underwater, too. <br></p>
|
||||
<br>
|
||||
<p>Then when I was done, I immediately sewed four mock turtleneck undershirts based off this pattern and love them, too! <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 28, 2022
|
||||
<br>
|
@ -1,39 +0,0 @@
|
||||
<!--210318,210304-->
|
||||
<h1>writing a game design document </h1>
|
||||
may 27, 2021<br>
|
||||
#gamedesign #gdd #worldbuilding <br>
|
||||
<br>
|
||||
A game design document (GDD) is a detailed document used to communicate the vision for a videogame. They are used internally by AAA game developers to keep hundreds of people on the same page, but it's worth considering keeping one as a small team or individual. I'll share how I organize mine. <br>
|
||||
<br>
|
||||
<h2>why keep a GDD if everyone's already on the same page? </h2><br>
|
||||
Even small games are complex pieces of software requiring a broad skillset spanning computer science, design, art, music, creative writing, and marketing. The development process can take years, too. A GDD can serve as a single place to collect your thoughts and document the evolution of your design over time. Even as a single person, it's been helpful to give every aspect a little thought as I fill it out. Also, whenever I need to refer back to something, it's a boon to have an organized GDD instead of random notebooks and files. <br>
|
||||
<br>
|
||||
Of course, writing a GDD isn't developing a game. Barely anyone shares their GDD outside of their team, so unless your team or publisher has extra requirements, they only exist to facilitate game development. If you can't keep the document up-to-date with development or it would never be referenced by anyone, consider alternative forms of documentation. Sometimes a GDD is more effective as a game prototype, a mood board, or merely a thought in your head. If you're keeping scattered notes like I did, though, consider compiling them into a single word document or keeping them all in a binder. <br>
|
||||
<br>
|
||||
<h2>download the GDD template </h2><br>
|
||||
Download my <a href="/download/DesignDocumentTemplate.docx">GDD template</a> and make a copy every time you have a new game idea so you never forget any! Obviously, it's just a template. If some parts aren't suitable for your genre or development process, swap them out for something better. <br>
|
||||
<br>
|
||||
<h2>worldbuilding bible </h2><br>
|
||||
I feel it's easier to keep some parts in a different format from my GDD. For worldbuilding, I use a modified version of <a href="https://ellenbrockediting.com/worldbuilding-bible-template/">Ellen Brock's worldbuilding questionnaire</a>. I keep her headings and delete the detailed bullet prompts for less clutter. In general, I try to write my own prompts so they are closely tailored to my fantasy world. If I don't even know where to begin, though, her prompts are a great starting point. <br>
|
||||
<br>
|
||||
<center><img src="/static/img/ent/gdd_worldbuilding.png" alt="(image: Ellen Brock's worldbuilding questionnaire.)"></center> <br>
|
||||
<br>
|
||||
Every nation in my game gets their own copy that's written from their perspective, since different people groups can have different experiences or explanations regarding the same world. <br>
|
||||
<br>
|
||||
<h2>story + dialog </h2><br>
|
||||
The pacing and direction of game narratives are dependent on the player's actions, so the stories are less like monolithic pages of text and more like a series of events strung together. For that reason, I don't keep the story or major events in my GDD. I keep an outline of the story and each scene in individual flowchart documents instead, so I can move the pieces around and connect them freely. <br>
|
||||
<br>
|
||||
<center>
|
||||
<a target="_blank" href="/static/img/ent/gdd_diagram.png">
|
||||
<img src="/static/img/ent/gdd_diagram.png" alt="(image: event diagram with an unnecessary amount of choices)" width="500" height="313">
|
||||
</a></center><br>
|
||||
<br>
|
||||
To make my flowcharts, I open diagramming software like <a href="https://wiki.gnome.org/Apps/Dia">Dia</a> and make a box for the title and one for the goals of the scene. Then, using color coding to separate character dialog, conditional statements, stage directions, and emotes, I write the event box-by-arrow-by-box. <br>
|
||||
<br>
|
||||
Every time I have an idea for a scene, I scribble it in a flowchart to keep with my GDD. Some of them are dumb, but it's never bad to have a giant pile of potential game events. <br>
|
||||
<br>
|
||||
<h2>backing up your GDD </h2><br>
|
||||
Finally, there's no point to keeping everything together in one place if the hard drive loses them. Try to keep a current copy in about 3 places. I have a GDD folder that contains an individual folder for each game. That way, it's easy to push all my GDDs to git at once. Better safe than sorry! <br>
|
||||
<br>
|
||||
Last updated May 26, 2021 <br>
|
||||
<br>
|
@ -1,63 +0,0 @@
|
||||
<!--210527,210402-->
|
||||
<h1>how to make a plugin for godot engine </h1>
|
||||
april 15, 2021<br>
|
||||
#godotengine <br>
|
||||
<br>
|
||||
If Godot Engine doesn't have the functionality you need, you can extend it with your own plugins. You can also use it to make specialized nodes to suit your project. <br>
|
||||
<br>
|
||||
<h2>how to make a plugin </h2><br>
|
||||
<br>
|
||||
Navigate to your project folder. Within it, make a folder called <b>addons</b>. Within the addons folder, make a folder and name it after your plugin. Within the plugin folder, you will need a few files: plugin.cfg, custom_node.gd, a .gd file for each custom node your plugin will add, and a .png icon for your custom nodes. <br>
|
||||
<br>
|
||||
<h3>plugin.cfg </h3><br>
|
||||
Within the plugin file, make a file called <b>plugin.cfg</b>. Open it in a simple text editor like Notepad and use this template to make your config: <br>
|
||||
<br>
|
||||
[plugin]<br>
|
||||
name="World"<br>
|
||||
description="A world system."<br>
|
||||
author="chimchooree"<br>
|
||||
version="0.4"<br>
|
||||
script="custom_node.gd"<br>
|
||||
<br>
|
||||
Obviously, fill the space within the quotation marks with your own information. The script's value should be kept the same, though. Once you have these six lines in your file, save and close. Avoid writing these files in a full word processor like Microsoft Word because they tend to fill your documents with extra characters. Even if they aren't displayed in the word processor, they will make your file unreadable to Godot. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h3>custom_node.gd </h3><br>
|
||||
Within the plugin file, make another file called <b>custom_node.gd</b>. The contents of this node should look like this: <br>
|
||||
<br>
|
||||
tool <br>
|
||||
extends EditorPlugin<br>
|
||||
<br>
|
||||
func _enter_tree():<br>
|
||||
add_custom_type("Room", "Node2D", preload("room.gd"), preload("World.png"))<br>
|
||||
<br>
|
||||
func _exit_tree():<br>
|
||||
remove_custom_type("Room")<br>
|
||||
<br>
|
||||
To add a type, supply the <b>add_custom_type</b> method with 4 parameters: the name of your custom node, the node type (Node2D, AnimatedSprite, etc), your custom node's preloaded script, and a preloaded icon. Every type you add must also be removed. Use this process to add as many custom nodes as you need. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h3>.gd files </h3><br>
|
||||
For each custom node you declare in the custom_node.gd file, you'll need to supply a .gd script. These are going to look just like your other scripts in the editor. You can write them in full now or leave them relatively blank, but at least declare the type at the top. <br>
|
||||
<br>
|
||||
Since my example calls for a Node2D with a "room.gd", I can make a file within the plugins folder called <b>room.gd</b>. I'll keep the contents extremely simple for now: <br>
|
||||
<br>
|
||||
extends Node2D <br>
|
||||
<br>
|
||||
<br>
|
||||
<h3>icon </h3><br>
|
||||
Icon must be .png files with the dimensions of 16x16 pixels. They are just for you to see within the editor's node tree, so you can draw something fancy or just squish down the same Godot head everyone uses. You can also make a unique icon for each node or just use the same one across all nodes. Just make sure the file name matches what's used in custom_node.gd. <br>
|
||||
<br>
|
||||
If you want to use my squished icon, that's 100% fine with me. If you need to check the license for the original Godot head, though, it's on their <a href="https://github.com/godotengine/godot/blob/master/LOGO_LICENSE.md">git repo</a>. <img src="/static/img/ent/plugin_icon.png" alt="(image: Squished Godot head)"> <br>
|
||||
<br>
|
||||
When choosing whether to make something beautiful or lazy, let Colossians 3:23 echo in your head: "And whatever you do, do it heartily, as to the Lord and not to men." <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>how to add a plugin </h2><br>
|
||||
Now, inside Godot Engine's editor, go to the top-left menu and select Project>Project Settings and go to the Plugins tab. If your files came out okay, your new plugin should appear in the listing with all the data from your plugin.cfg file. Under the Status heading, make sure the plugin is set to "Enable" or "Active". To check whether your plugin's working, try to add a new node to a scene and search for your custom type. It should pop up with your custom icon in the search. If you add it, it will already have its custom script attached and ready to go. <br>
|
||||
<br>
|
||||
Happy coding! <br>
|
||||
<br>
|
||||
<br>
|
||||
Last updated April 30, 2021 <br>
|
||||
<br>
|
@ -1,91 +0,0 @@
|
||||
<!--220310,220224-->
|
||||
<h1>hostility</h1>
|
||||
january 27, 2022<br>
|
||||
#design #mechanic<br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>what is hostility? </h2><br>
|
||||
Hostility is a state that a character's AI state machine can enter. More specific states will inherit from the hostile state to prompt targeting, aggressive, and defensive behavior. It's a very similar concept to <a href="https://wiki.guildwars.com/wiki/Aggro">aggro</a> in Guild Wars because weaving through patrol patterns and balling mobs is one of my favorite things from any game. <br>
|
||||
<br>
|
||||
<h3>when does a character become hostile? </h3><br>
|
||||
NPCs generally will not seek out the player for combat. They will either stand stationary or follow their patrol route, oblivious of the player until becoming hostile. <br>
|
||||
<br>
|
||||
Usually, if an NPC is hostile, that means a threat got too close. Currently, proximities in Blessfrey mirror <a href="https://en.wikipedia.org/wiki/Proxemics">Edward T. Hall's zoning</a> for interpersonal distances. Intimate distance is the range for physical interaction and melee attacks and social distance is the range for assessing hostility and ranged attacks. <br>
|
||||
<center><a href="https://en.wikipedia.org/wiki/Proxemics#/media/File:Personal_Space.svg"><img src="/static/img/ent/Personal_Space.svg" alt="(image: A visualization of proxemics by WebHamster of Wikipedia. Around someone are 4 concentric circles with varying diameters: within 25 feet is their public space, 12 feet is their social space, 4 feet is their personal space, and 1.5 feet is their intimate space.)" width="500" height="267.72"></a></center>
|
||||
(By <a href="//commons.wikimedia.org/wiki/User:WebHamster" title="User:WebHamster";>WebHamster</a> - <span class="int-own-work" lang="en">Own work</span>, <a href="https://creativecommons.org/licenses/by-sa/3.0" title="Creative Commons Attribution-Share Alike 3.0">CC BY-SA 3.0</a>, <a href="https://commons.wikimedia.org/w/index.php?curid=6147809">Link</a>) <br>
|
||||
<br>
|
||||
An NPC will become hostile under a few conditions: <br>
|
||||
<ul>
|
||||
<li>An enemy faction member enters its social distance. Every character has a RangeBubble (Area2D) representing its social space. When a character enters range, its AI will assess both set of factions and change states upon finding a conflict. If there is a significant level disparity in the opponent's favor, though, the character will remain idle. </li>
|
||||
<li>Someone attacked it or dealt damage to it. If their opponent isn't in range, they will become hostile and begin searching or ambushing. (There is no friendly fire, so teams aren't going to implode.) </li>
|
||||
<li>Someone was damaged or attacked by it. Once again, if their opponent isn't in range, they will begin the hunt. </li>
|
||||
<li>When the majority of a team is hostile towards an opponent, any team of the same faction or type entering the social space of the hostile team will also become hostile towards it. </li>
|
||||
<li>When one member of a team becomes hostile, the others remain idle until aggravated. This allows skilled players to pull individual opponents away at a time without alerting the others and divide and conquer. This also prevents one foolhardy teammate from programmatically pulling aggro onto its entire team. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>what changes when a character is hostile? </h3><br>
|
||||
A hostile NPC will enter a combative AI state, usually with the goal of pursuing its opponent until either is killed or out of range. During combat, its passive health regeneration will slow, while energy regeneration will remain constant. Maybe certain skills and items can't be used during combat. If it has hostility towards multiple targets, it will prioritize targets according to its targeting AI state, probably favoring the nearest and weakest opponents. <br>
|
||||
<br>
|
||||
Each NPC will express hostility differently. Broadly, hostile behavior falls into 3 groups: offensive, defensive, and targeting. Offensive states may involve melee or ranged attacks, weapon attacks or offensive skill usage, single-target attacks or AoE, frontlining or backlining, and so on. Defensive states may involve buffing or healing, fleeing or kiting, protecting themselves or their teammates, and so on. The targeting state will allow the character to have unique opinions on who is most deserving of its attention. <br>
|
||||
<br>
|
||||
When a character becomes hostile toward the player, there will be feedback, such as battle music playing, the opponent's name turning red, or a sound effect playing. (Now I have the <a href="">Aion aggro sound effect</a> in my head.) <br>
|
||||
<br>
|
||||
<h3>when is a character no longer hostile? </h3><br>
|
||||
An NPC will lose hostility under a few conditions:
|
||||
<ul>
|
||||
<li>Enough distance has spread between the NPC and its opponent. Usually, an NPC will not pursue an opponent very far. The farther the NPC is led from its idle route, the less tolerance it has to pursue its opponent. However, if pulled slowly, a few steps at a time, it can be led almost anywhere. </li>
|
||||
<li>Its opponent exits the NPC's territory. Some NPCs have lines they will not cross. </li>
|
||||
<li>Its opponent or itself dies. </li>
|
||||
<li>The opponent no longer belongs to a conflicting faction. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>what happens after a character is no longer hostile? </h3><br>
|
||||
The character will return to its idle position or the nearest waypoint of its patrol route. Its passive health regeneration returns to its usual rate. Possibly some skills and items will be combat-only and will become disabled. <br>
|
||||
<br>
|
||||
<h2>hostility in action </h2><br>
|
||||
This next section is mostly for me. Let's run through some faction clash examples after illustrating the relationship of teammates and allies.<br>
|
||||
<br>
|
||||
<br>
|
||||
<h3>team hierarchy </h3><br>
|
||||
Teams have a leader. If there are additional teammates, they will be followers of the leader. Teams can be allied with other teams. Generally, the leader of the ally team will become a follower of the main team's leader, while its teammates will be followers of their local leader. If a teammate has a pet, raises a minion, casts a summon, or triggers an event that grants it an ally, that character will be the leader of its own group, allied with the responsible teammate. Alliances can be gained or broken. <br>
|
||||
<br>
|
||||
Teams will be more or less oblivious to their allies' position and lose them if they aren't keeping up. They will support allies in combat, but they characters usually prioritize teammates over allies. <br>
|
||||
<br>
|
||||
<center><img src="/static/img/ent/team_hierarchy.png" alt="(A diagram of team hierarchy. )" width="500" height="375"></center> <br>
|
||||
<br>
|
||||
<h3>scenarios </h3><br>
|
||||
<center><img src="/static/img/ent/teams_collide.png" alt="(An illustration of the chain resulting from paladins allying with a necromancer who summons a vampire who converts a ghoul who is friends with a chaos dwarf who build a war golem.)" width="500" height="375"></center> <br>
|
||||
<br>
|
||||
A, B, and C are in team 1. D is allied with them. They are preparing to attack the idle team 2 (V, W, and X with ally Y). Both teams will be spotted by the patrolling team 3 (M, N, and O with ally P) in a minute. Team 2 and 3 are members of the same faction, while Team 1 is of an opposing faction. A, B, and D are within range of either other, while C is investigating something just out of range. V, W, and X are within range, while Y is stuck behind a rock just out of range. M, N, and O are patrolling, while P walks too slowly to be in immediate range of the others. A, V, and M are leaders of their teams. They lead, while their teammates flock with them. Allies are members of their own team(s). Ally team leaders will follow the team leader of the main team, while their teammates flock with them. Allies can have their own allies, resulting in large trails of allied groups. Allies will not engage against allies or support direct enemies of their allies. Allies may engage against allies removed or support direct enemies of allies twice removed, though. <br>
|
||||
<br>
|
||||
Technically, allies are in their own team by themselves. Allies will flock within their own team and follow the general position of the main team or the individual teammate they are allied with. The main team will flock within their own team and ignore the positions of their allies. Allies will only share hostility with the main team through the coincidental case of being the same faction or type. <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li>A attacked V. V and A are hostile towards each other. B and D gain hostility towards V from being in range of A. W and Y gain hostility towards A from V. Now A, B, and D are opposed to V, W, and Y and vice versa and begin fighting. C and X are bound to cluster closer or be approached by opponents and join in soon. </li>
|
||||
<li>A lays a trap. V walks into the trap and takes damage. A and V are now hostile towards each other. A and V will prepare for battle and begin hunting for each other. Their RangeBubbles will extend farther during this time. If they search for too long or travel too many steps without finding an opponent, they will resume their idle positions. If A finds an opponent, any teammates or allies within their RangeBubble will gain hostility towards the opponent and move within range. Combat will ensue. If very few or no members were in range of A, its team will idle on without it. If most members were in range, the remaining members will flock to their team and inevitably gain hostility and enter combat. </li>
|
||||
<li>A one-hit-kills V from a safe distance. A becomes hostile and searches for an opponent. Team 2 is oblivious. </li>
|
||||
<li>Teams 1 and 2 are hostile towards each other. Team 1 changes to the same faction. Teams 1 and 2 lose hostility. They will now consider each other friendly and possibly support each other. If one team gains hostility towards another team, the other will share hostility if still in range. </li>
|
||||
<li>Teams 1 and 2 are friendly with each other and following each other. Team 1's faction changes to an adversarial one. They are all so close, they all gain hostility towards the other team's members immediately. </li>
|
||||
<li>All of team 1 is hostile towards all of team 2. Team 3 enters range of team 2. All of team 3 gains hostility towards team 1 the moment a member of team 2 enters range of a single member of team 3. </li>
|
||||
<li>Team 1 and team 2 are hostile towards each other with team 3 approaching. Ally P intersects with ally Y, triggering hostility between them. Teams 1 and 2 remain oblivious towards Team 3 and vice-versa. If team 3 starts going somewhere else, P will be left behind. Members of team 3 will gain hostility on a case by case basis as they flock nearby and inevitably get too close. </li>
|
||||
<li>Team 1 and team 2 are hostile towards each other with team 3 approaching. Teammate M intersects with ally Y, triggering hostility between all of team 3 and ally Y. Team 2 will eventually enter the fray coincidentally. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>ally chains </h3><br>
|
||||
<br>
|
||||
<center><img src="/static/img/ent/ally_chain.png" alt="(An illustration of the chain resulting from paladins allying with a necromancer who summons a vampire who converts a ghoul who is friends with a chaos dwarf who build a war golem.)" width="500" height="375"></center> <br>
|
||||
<br>
|
||||
If a necromancer is allied with a team of paladins, they will only enter hostility through their own terms. For instance, the paladins may attack a bear, but the necromancer will ignore it until the bear is a direct threat to itself. If the paladins attack another necromancer, the enemy necromancers will likely ignore the paladin-allied necromancer and never pose a direct threat. The allied necromancer may express idle supportive behavior like buffing the paladins, but it will remain idle. The politics of the main team trump that of other roaming teams. The allied necromancer will not enter combat with the paladins merely because it is the same type as the necromancers. It will also not idly heal the team that is currently directly opposed to its paladin allies. If the enemy necromancers were fighting a team of merchants, and the paladins completely ignore both groups, the necromancer ally will enter the fray in support of the necromancers and against the merchants. This may draw the paladins in, who will support the merchants and fight the necromancers. The allied necromancer will immediately lose hostility towards anyone directly opposed to the main team's leader. <br>
|
||||
<br>
|
||||
If the necromancer raises 2 liches, each lich is the leader of its own team, and each team is allied with the necromancer. Let's say the liches summon vampiric minions, one of which converts someone to an allied ghoul whose alliance remains constant with its chaos dwarf buddy who in turn is allied with its war golem. The paladin will respect the necromancer and liches but become hostile towards the vampires and all other evil monsters and vice-versa. In the case all these groups were factionless, the paladin would be neutral towards the vampires and everything else down the chain. Neutral characters are generally low priority in combat, but AoE attacks can easily whip up hostility. <br>
|
||||
<br>
|
||||
If the necromancer dies, the lich and paladins will no longer restrain themselves from becoming hostility towards each other. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>what I learned </h2><br>
|
||||
Before, I was trying to force the combat state into flat booleans, but clearly there is more nuance to the issue. A character can be hostile but not in active combat. A character can be in combat but not hostile. Also, hostility is more of a product of a character's surroundings, actions, and actions inflicted on it. Structurally, it needs to resemble (extremely obviously) an AI state rather than any kind of variable. <br>
|
||||
<br>
|
||||
The characters' state machines now behave more like the above scenarios, and I'd love to make a cutscene-like demo for Blessfrey's second demo that sets differently factioned groups on clashing patrols to make sure it all works. Look forward to it! <br>
|
||||
<br>
|
||||
Last updated January 31, 2022
|
||||
<br>
|
@ -1,40 +0,0 @@
|
||||
<!--200917,201112-->
|
||||
<h1>inventory as a system diagram </h1>
|
||||
january 7, 2021<br>
|
||||
#design #systemdiagram #gamemechanics<br>
|
||||
<br>
|
||||
<b>System diagrams</b> illustrate how components interact within a system. It saves so much headache to step back and plan with a system diagram before jumping into code. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>stop + plan before coding </h2><br>
|
||||
I want to move blessfrey's inventory into an app on the player character's smartphone. Before, it was displayed in a random pop-up window. It was poorly planned, so the programmatic inventory and the UI were too tightly coupled to easily pop into the phone screen. Instead of wrestling, it's easier to start over and actually plan before I code this time. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>list out your nouns </h2><br>
|
||||
A simple way to start thinking about a system is to list out its nouns + verbs. Jot down the entities that interact with your system. <br>
|
||||
<br>
|
||||
<center><img src="/static/img/ent/systemdiagram_inventory.jpeg" alt="(image: system diagram for inventory)" width="500" height="250"></center> <br>
|
||||
<br>
|
||||
For blessfrey's inventory, that's the inventory (programmatic), the player character, the inventory app (UI), and base items. The inventory app is related to the smartphone and inventory items. Items are related to floor items, which are related to rooms. <br>
|
||||
<br>
|
||||
(blessfrey has three different kinds of items. <br>
|
||||
<br><ul>
|
||||
<li><b>Base Item</b>: holds all the data regardless of how the item is currently expressed </li>
|
||||
<li><b>Floor Item</b>: sits on the ground and gets picked up by characters. </li>
|
||||
<li><b>Inventory Item</b>: displayed in inventories, store windows, containers, etc </li>
|
||||
</ul><br>
|
||||
Floor + Inventory Items hold a base item inside them that gets popped out and traded around as the item gets expressed in different forms.) </br>
|
||||
<br>
|
||||
<h2>connect your nouns with verbs </h2><br>
|
||||
I wrote the entities in pink and moved them around until the placement was decently readable. Then I connected the concepts with arrows. These arrows represent the verbs, which I explicitly labeled in yellow. <br>
|
||||
<br>
|
||||
The flow of these arrows can be very important. If you are modeling AI, for instance, no matter what path the program takes, there shouldn't be dead-ends. Seeing mistakes like that is easier with a diagram than lines of code. Otherwise, the flow is always generally useful for figuring out which methods are needed for each class and how they connect. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>write the code </h2><br>
|
||||
At this point, coding is a bit easier now that it's in some ways a transcription of the diagram. The entities are data (classes or objects), and the arrows are logic (methods). <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>conclusion </h2><br>
|
||||
Your diagram doesn't have to be fancy or formal to get the point across to yourself, and it just takes a minute to save all the headache later. Don't skip this step or you'll have to rewrite the inventory system just to display it in a different window. <br>
|
||||
<br>
|
@ -1,140 +0,0 @@
|
||||
<!--210610,200429-->
|
||||
<h1>css grid with angular (break into 2?)</h1>
|
||||
may 5, 2022<br>
|
||||
#angular #css #webdev <br>
|
||||
<br>
|
||||
<h2>start from the beginning</h2><br>
|
||||
<a href="https://angular.io/guide/setup-local">Angular's documentation</a> shares the process for beginning a new project, but I'll explain it, too. <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li>Installation process will differ depending on your operating system. These commands are for Linux Mint, downstream from Ubuntu and Debian. </li>
|
||||
<li><a href="https://nodejs.org/en/">Install Node.js </a> </li>
|
||||
<li><code>sudo curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash</code></li>
|
||||
<li><code>sudo apt-get install -y nodejs</code></li>
|
||||
<li><code>sudo apt install -y build-essential</code></li>
|
||||
<li><code>sudo npm install -g @angular/cli</code> (you can decide whether to share analytics) </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>grab the template </h2>
|
||||
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 <a href="https://github.com/angular/angular-cli">Angular's github</a>. <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li><code>ng new Example</code> (accept Angular routing and CSS) Change out the name 'Example' with your project name. </li>
|
||||
<li>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. </li>
|
||||
</ul>
|
||||
<h2>test run </h2>
|
||||
Now you can run your example project in the browser. <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li><code>cd Example/ </code></li>
|
||||
<li><code>npm start </code><li>
|
||||
<li>Now you can browse to your project. By default, it used port 4200, so it's viewable @ <a href="http://localhost:4200/">http://localhost:4200/</a> </li>
|
||||
<li>When you're done, stop the script by entering ctrl + c into the terminal. </li>
|
||||
</ul>
|
||||
<br>
|
||||
If you see the page below, you have everything you need to get started on your own project. <br>
|
||||
<center><a target="_blank" href="/static/img/ent/angular_examplepage.png">
|
||||
<img src="/static/img/ent/angular_examplepage.png" alt="(image: the example webpage that comes with the skeleton files.)" width="500" height="505">
|
||||
</a></center><br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>adding custom components </h2>
|
||||
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 <a href="https://angular.io/guide/component-overview">component</a> to be styled by the grid. <br>
|
||||
<br>
|
||||
I'll use the petsite browser game I'm making as an example: <br>
|
||||
<center><a target="_blank" href="/static/img/ent/lemonland_cssgrid.png">
|
||||
<img src="/static/img/ent/lemonland_cssgrid.png" alt="(image: planned layout of my example page: two buffers at the sides named Left and Right, Header at the top, Footer at the bottom, Chatter in between Header and Footer and left of Right, Zone and PDA in the second row from the top, Alert in the third, and Action and Partner in the fourth.)" width="500" height="478">
|
||||
</a></center><br>
|
||||
<br>
|
||||
This webpage has some major elements that will be reused on many pages, which I would like to keep in a general grid. <br>
|
||||
<ul>
|
||||
<li>header - wgill hold the logo, home page link, account links </li>
|
||||
<li>left - a centering buffer, will have a background </li>
|
||||
<li>right - a centering buffer, will have a background </li>
|
||||
<li>footer - hold copyright, footer links </li>
|
||||
</ul>
|
||||
Then I'd like to nest a grid inside to contain elements more specific to this kind of page. <br>
|
||||
<ul>
|
||||
<li>zone - a graphic representing the player's location </li>
|
||||
<li>pda - a control panel with news, email, friend's list, quick links, inventory, etc </li>
|
||||
<li>alert - a window for dialog, system messages, etc </li>
|
||||
<li>action - a window containing player choices and dialog responses </li>
|
||||
<li>partner - basic info about the active pet </li>
|
||||
<li>chatter - a live-time chat box </li>
|
||||
</ul>
|
||||
<br>
|
||||
Each of these will need to be added as components via the terminal. <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li><code>cd app/ </code></li>
|
||||
<li><code>ng g c header </code></li>
|
||||
<li><code>ng g c zone </code></li>
|
||||
<li>...and so on. </li>
|
||||
</ul>
|
||||
These commands fill your app folder with components for your grid. <br>
|
||||
<br>
|
||||
<center><a target="_blank" href="/static/img/ent/angular_componentdir.pngid.png">
|
||||
<img src="/static/img/ent/angular_componentdir.png" alt="(image: screenshot of each folder generated for each component inside the app folder.)" width="500" height="273">
|
||||
</a></center><br>
|
||||
<br>
|
||||
<h2>writing the css grid </h2>
|
||||
There's a few HTML files and a few CSS files in your project folder. <br>
|
||||
<ul>
|
||||
<li><code>src/index.html</code> is the basic webpage </li>
|
||||
<li><code>src/app/app.component.html</code> is the app displayed in the webpage </li>
|
||||
<li>Then there's an HTML file for each component, like <code>src/app/partner/partner.component.html</code> </li>
|
||||
<br>
|
||||
<h3>index.html + styles.css </h3>
|
||||
I'm keeping these two very general, since most of the content on the page is part of the game. <br>
|
||||
<code><!doctype html></code><br>
|
||||
<code><html lang="en"></code><br>
|
||||
<code><head></code><br>
|
||||
<code> <meta charset="utf-8"></code><br>
|
||||
<code> <title>lemonland</title></code><br>
|
||||
<code> <base href="/"></code><br>
|
||||
<code> <meta name="viewport" content="width=device-width, initial-scale=1"></code><br>
|
||||
<code> <link rel="icon" type="image/x-icon" href="favicon.ico"></code><br>
|
||||
<code></head></code><br>
|
||||
<code><body></code><br>
|
||||
<code><router-outlet></router-outlet></code><br>
|
||||
<code> <div class="app-container"></code><br>
|
||||
<code> <app-root></app-root></code><br>
|
||||
<code> </div></code><br>
|
||||
<code></body></code><br>
|
||||
<code></html></code><br>
|
||||
<br>
|
||||
Then the CSS... <br>
|
||||
<code>* {</code><br>
|
||||
<code> padding: 0;</code><br>
|
||||
<code> margin: 0;</code><br>
|
||||
<code> font-family: verdana;</code><br>
|
||||
<code> font-size: 18px;</code><br>
|
||||
<code>}</code><br>
|
||||
<code>body {</code><br>
|
||||
<code> background-color: black;</code><br>
|
||||
<code> color: MidnightBlue;</code><br>
|
||||
<code>}</code><br>
|
||||
<br>
|
||||
<h3>app.component.html + app.component.css </h3>
|
||||
These two contain all the subcomponents generated earlier. <br>
|
||||
<code><div class="container"></code><br>
|
||||
<code> <app-header></app-header></code><br>
|
||||
<code> <app-left></app-left></code><br>
|
||||
<code> <router-outlet></router-outlet></code><br>
|
||||
<code> <div class="content-grid"></code><br>
|
||||
<code> <app-zone></app-zone></code><br>
|
||||
<code> <app-pda></app-pda></code><br>
|
||||
<code> <app-chatter></app-chatter></code><br>
|
||||
<code> <app-alert></app-alert></code><br>
|
||||
<code> <app-action></app-action></code><br>
|
||||
<code> <app-partner></app-partner></code><br>
|
||||
<code> </div></code><br>
|
||||
<code> <app-right></app-right></code><br>
|
||||
<code> <app-footer></app-footer></code><br>
|
||||
<code></div></code><br>
|
||||
<br>
|
||||
Then the CSS grid takes place in the CSS file. <br>
|
||||
<br>
|
||||
<br>
|
||||
Last updated April 12, 2022
|
||||
<br>
|
@ -1,44 +0,0 @@
|
||||
<!---->
|
||||
<h1>makeup of the day </h1>
|
||||
august 11, 2022<br>
|
||||
#fashion #makeup #motd <br>
|
||||
<br>
|
||||
<p>Sometimes, I feel like sharing my makeup. <br></p>
|
||||
<br>
|
||||
<h2>red eyeshadow as eyeliner </h2>
|
||||
<p>Red eyeshadow! I wanted to match my makeup to my outfit ~ a black t-shirt with a vibrant orange tiger print and rich tan fall coat with red and black plaid. Red is a forever favorite to wear in igari style, but it's bordering on socially irresponsible to try to look ill during a pandemic. Maybe my red can come back with more conventional styles, though navy and bronze are far superior liner colors for brown eyes. <br></p>
|
||||
<br>
|
||||
<p>I applied a red metallic eyeshadow with an eyeliner brush along the outer third of the upper lashline and blended into the inner third. Up to my brow, I used a base shade to even out my tone. The outer third of the lower lash line was lined with deep burgundy and flicked out and up with my finger to form a subtle wing. <br></p>
|
||||
<br>
|
||||
<p>Photo is after 8 hours of wear. I think the pencil got a little messy, but the red could last forever. <br></p>
|
||||
<img src="/static/img/otd/motd_221106.png" alt="(photo: metallic red eyeshadow-as-eyeliner look)"><br>
|
||||
<br>
|
||||
<p>Specific shades: <br></p>
|
||||
<p><ul>
|
||||
<li>Base: Stila One Step Correct primer </li>
|
||||
<li>Brow pencil: Ulta Ultra Slim Brow Pencil (Dark Brown) </li>
|
||||
<li>Eyeshadow: Sydney Grace Queen of Hearts, ABH Base (Norvina palette) </li>
|
||||
<li>Eyeliner: Urban Decay (Alkaline) </li>
|
||||
<li>Setting spray: Urban Decay All-Nighter (Ultra Matte) </li>
|
||||
</ul></p>
|
||||
<br>
|
||||
<h2>red eyeshadow-as-eyeliner </h2>
|
||||
<p>Red eyeshadow! I wanted to match my makeup to my outfit ~ a black t-shirt with a vibrant orange tiger print and rich tan fall coat with red and black plaid. Red is a forever favorite to wear in igari style, but I dropped it because it's plain rude to intentionally look ill and unapproachable during a pandemic. Maybe red can come back with more conventional styles, though navy and bronze are the supreme liner colors for dark brown eyes. <br></p>
|
||||
<br>
|
||||
<p>I applied a red metallic eyeshadow with an eyeliner brush along the outer third of the upper lashline and blended into the inner third. Up to my brow, I used a base shade to even out my tone. The outer third of the lower lash line was lined with deep burgundy and flicked out and up with my finger to form a subtle wing. <br></p>
|
||||
<br>
|
||||
<p>Photo is after 8 hours of wear. I think the pencil got a little messy, but the red is unmoved. <br></p>
|
||||
<img src="/static/img/mu/221106.png" alt="(photo: metallic red eyeshadow-as-eyeliner look)"><br>
|
||||
<br>
|
||||
<p>Specific shades: <br></p>
|
||||
<p><ul>
|
||||
<li>Base: Stila One Step Correct primer </li>
|
||||
<li>Brow pencil: Ulta Ultra Slim Brow Pencil (dark brown) </li>
|
||||
<li>Eyeshadow: Sydney Grace Queen of Hearts, ABH Base (Norvina palette) </li>
|
||||
<li>Eyeliner: Urban Decay Alkaline </li>
|
||||
<li>Setting spray: Urban Decay All-Nighter Ultra Matte </li>
|
||||
</ul></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 31, 2022 <br>
|
||||
<br>
|
@ -1,49 +0,0 @@
|
||||
<!--221006,220811,220922-->
|
||||
<h1>everything's coming together: a new website </h1>
|
||||
july 28, 2022<br>
|
||||
#webdev<br>
|
||||
<br>
|
||||
<p>Everything's coming together. I've been learning a lot, and I'm finally ready to share my work. <br></p>
|
||||
<img src="/static/img/ent/everythingscomingtogether_home.png" alt="(screenshot: Blessfrey homepage)"><br>
|
||||
<br>
|
||||
<h2>new website, new me </h2>
|
||||
<p>Welcome to Blessfrey.me, my online portfolio and design blog! After using it privately (or at least as privately as anything can be online) to practice webdev and biweekly blogging for a year, this site is ready for visitors. <br></p>
|
||||
<br>
|
||||
<p>The last time I did any webdev was back when every website had custom HTML+CSS profiles, so I'm stunned by how far web technology has come along, both in terms of capability and ease of implementation. Man, I wish we had the CSS grid to lay out old petsite pages! I feel up to speed now, though. My confidence in maintaining and upgrading my website is solid. Same for writing articles. They're at a good length, level of organization, and readability. Writing for just yourself and writing for someone else are two completely different mindsets, you know? <br></p>
|
||||
<br>
|
||||
<p>Of course, I'm not saying Blessfrey.me is <i>great</i>, I'm saying I'm not <i>ashamed</i> anymore. People with a harsh inner critic understand what a hurdle that is. <br></p>
|
||||
<br>
|
||||
<p>I'm going to take this somewhat professionally (I mean, I'm no business suit avatar "no offers under 100k" person), so I have a release schedule and content mix and everything. I'll return to social media, too. All that pandemic news was hard to look at, but I miss seeing other people's projects and meeting fellow devs. My Twitter is <a href="https://twitter.com/lilchimchooree">@lilchimchooree</a>, and my Mastodon is also <a href="https://mastodon.gamedev.place/web/@lilchimchooree">lilchimchooree</a>. <br></p>
|
||||
<br>
|
||||
<p>So please bookmark and visit every other Thursday (US time) for new articles! Also, message me wherever. I don't mind chatting. <br></p>
|
||||
<br>
|
||||
<h2>reassessing things </h2>
|
||||
<p>I never really had a plan for how to use this site and was generally copying other portfolios and blogs. Having your own website is really cool, though. Unless I'm somewhere else for a community, there's no reason for me to still be fussing with image hosting services or any kind of content management tool. My server, domain, and custom code should cover everything. It should be the easiest thing in the world to show people what I've been working on, too - just show them my website, duh. <br></p>
|
||||
<br>
|
||||
<p>So what should I do with my website? Whatever I want. It should be obvious, but the drive to copy others and meet standard expectations is so hard to break. <br></p>
|
||||
<br>
|
||||
<p>First, I'm going to have embedded HTML5 applications. I'm not waiting for Blessfrey's first demo to do that, either. I'm making gamejam projects, prototypes, anything interesting, and slapping them right on the website. After all, a gamedev website should have games! <br></p>
|
||||
<br>
|
||||
<p>Second, I'm going to share programming <i>and</i> fashion projects. I used to have a separate fashion portfolio and a few blogs, but I was always struggling to match the guidelines for online content. It's more freeing to give myself a blank section of my general portfolio and a tenth of the blog to fill however I want. Some fashion designers like <a href="https://www.kennethdking.com/">Kenneth D. King</a> don't even organize their ideas into seasonal collections. The industry as a whole is reconsidering rigid expectations, replacing in-person runway shows with alternatives like direct press meetings, fashion photography lookbooks, and short art films. Why shouldn't a fashion blogger re-evaluate her portfolio? <br></p>
|
||||
<br>
|
||||
<p>
|
||||
<p>Best practice says to be an SEO zombie laser-focused on a niche, but that doesn't make sense for me. I develop websites, games, programming projects, fashion projects, interior design projects, pixelart, writing, and more, and people in my life ask to see them. I want to work for actual people, not an algorithm. <br></p>
|
||||
<br>
|
||||
<h2>technical journey </h2>
|
||||
<p>Blessfrey.me's needs are fairly simple - some static pages and a blog page. Blogging platforms are overkill for my purposes, and all those unused features would bog down the website at best and contribute to security vulnerabilities at worst. Also, they tend to collect private user information, and I'd rather not be responsible for that right now. So I write and maintain this site from scratch. It's plain fun to write my own platform. Besides, it just makes sense for my programming portfolio to be something I programmed. <br></p>
|
||||
<br>
|
||||
<p>I always thought PHP developers were so cool as a kid, so Blessfrey.me was originally written in PHP. That didn't last long. I could compare pros and cons, but PHP was too unenjoyable to maintain. <a href="https://www.php.net/manual/en/">Its documentation</a> is crazy, though. Each page has a comment section with 19-year-old posts criticising the language. So bizarrely negative and <i>old</i>! <br></p>
|
||||
<br>
|
||||
<p>Now I use <a href="https://bottlepy.org/docs/dev/">Bottle</a>, a Python micro web-framework, its built-in template engine <a href="https://bottlepy.org/docs/dev/stpl.html">SimpleTemplate</a>, and HTML and CSS. It's deployed using <a href="https://docs.docker.com/language/java/deploy/">Docker</a>. Any embedded applications are probably HTML5 written in Godot Engine. <br></p>
|
||||
<br>
|
||||
<h2>plans for the future </h2>
|
||||
<p>The website has plenty of room for improvement. It looks pretty wonky on mobile and tablets, and I've only been testing in Firefox and Chrome-based browsers. It's functional and has a decent amount of content, though, so I'd say it's a-okay to take out of maintenance mode for now. <br></p>
|
||||
<br>
|
||||
<p>Next I'm going to work with every resolution I can get my hands on and iron out the code. Each page is wordy and unstructured, but I'll rein them in soon. I'll also properly implement my character database, so I don't have to use clunky <a href="https://toyhou.se/abbey">Toyhouse</a> anymore. <br></p>
|
||||
<br>
|
||||
<h2>let's appreciate what we have! </h2>
|
||||
<p>Don't go through the motions. If you have anything super cool like a website, don't just use it how you're "supposed" to use it. Put your possessions to work and have fun with them! <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 28, 2022 <br>
|
||||
<br>
|
@ -1,33 +0,0 @@
|
||||
<!--220811,220825-->
|
||||
<h1>everything's coming together: a new website </h1>
|
||||
july 28, 2022<br>
|
||||
#webdev <br>
|
||||
<br>
|
||||
<p>Everything's coming together. I've been learning a lot and think I'm finally ready to start sharing my work. <br></p>
|
||||
<img src="/static/img/ent/everythingscomingtogether_home.png" alt="(screenshot: Blessfrey homepage)"><br>
|
||||
<br>
|
||||
<h2>up and up </h2>
|
||||
<p>I've had a mostly solid horizontal slice of Blessfrey ready for a while, and this cycle of system revamps is finally able to support the sophistication of content I want. When I finish this iteration of skill systems and AI, I will be ready to make a real demo release of Blessfrey! <br></p>
|
||||
<br>
|
||||
<p>I don't know why it never occurred to me that I don't have to hold back my website waiting on that demo, though. Releasing and publishing is an important skill in itself. I threw together No-Legs the Cat in a few hours, exported it, hosted it on <a href="https://chimchooree.itch.io/legless-the-cat">itch.io</a>, and embedded what is currently the crown jewels of my website. Finally! I have a gamedev website with a playable game on it. <br></p>
|
||||
<img src="/static/img/ent/everythingscomingtogether_no-legsthecat.png" alt="(No-Legs the Cat screenshot: Poltics Cat finds a bowl of breakfast in the maze)"><br>
|
||||
<p>All this time, my website maintenance skills have been getting stronger. I have a years' worth of content as a buffer. My artist's block has dissipated for the first time in years, and I actually <i>enjoy</i> drawing concept art and character designs again. I've also spent a year trying different languages and frameworks and improving across the board. The website's already a night and day difference from old versions, and I finally feel comfortable with where it's at. <br>
|
||||
<br>
|
||||
<h2>changes </h2>
|
||||
<p>This is <i>my</i> website, so I might as well use it however I want. If I have a website, I shouldn't have to rely on anyone else for image hosting or digital content presentation. There's no reason for me to have to pull up my phone all the time to show people what I'm working on. Blessfrey.me can take care of all of that for me. <br></p>
|
||||
<br>
|
||||
<p>From now on, I'll post fashion content here. I used to have a separate online portfolio for it and tried a separate blog from that once, but I was always struggling to fit into standard formats. Giving myself a blank section of my general portfolio to structure however I want is freeing. Some fashion designers like <a href="https://www.kennethdking.com/">Kenneth D. King</a> don't even organize their ideas into seasonal collections. The industry as a whole is moving away from the rigid structure of in-person runway shows in lieu of directly meeting with the press, releasing lookbooks of fashion photography, and shooting short art films. Why shouldn't a fashion blogger re-evaluate her portfolio, too? Maybe I'll add a section for general art here, too, someday. Who knows? <br></p>
|
||||
<br>
|
||||
Maybe best practice is to stay laser-focused on a content niche, but I'm not an SEO zombie. I develop websites, games, programming projects, fashion projects, interior design projects, pixelart, writing, and more, and they all deserve some web real estate. Maybe later, I can work with clients through here, too, but that is a dream for the future. For now, I'm keeping everything Web 1.0. The security is <i>so</i> much easier that way. <br></p>
|
||||
<br>
|
||||
<h2>plans for the future </h2>
|
||||
<p>That isn't to say the website's perfect as it! It looks pretty wonky on mobile and tablets, and I've only been testing in Firefox and Chrome-based browsers. It's functional and has a decent amount of content, though, so I'd say it's a-okay to take out of maintenance mode for now. <br></p>
|
||||
<br>
|
||||
<p>Next I'm going to work with every resolution I can get my hands on and refactor my code a little. Also, I have a different vision for the formatting of most pages. The demo and fashion pages could definitely be broken into pieces. There should probably ultimately be a separate, permanent page for each HTML5 application. I also like having not just my Blessfrey characters but all my ocs here. It's like Toyhouse, but the price of custom CSS is already included in server costs. If nothing else, it'll be nice for when Artfight's sputtering. <br></p>
|
||||
<br>
|
||||
<h2>let's appreciate what we have! </h2>
|
||||
Don't go through the motions. If you have anything super cool like a website, don't just use it how you're "supposed" to use it. Put your stuff to work and have fun! <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 28, 2022 <br>
|
||||
<br>
|
@ -1,33 +0,0 @@
|
||||
<!--220825,220728-->
|
||||
<h1>no-legs the cat </h1>
|
||||
august 11, 2022<br>
|
||||
#game #no-legs-the-cat #godotengine #release<br>
|
||||
<br>
|
||||
<p><b>No-Legs the Cat</b> is a 2D maze game featuring Poltics Cat! Help him find his legs! He can't move by himself, so scoot him around with the arrow keys. Don't forget to feed him all three breakfasts or he'll starve!! Go play it <a href="http://127.0.0.1:9001/demo">here</a> or on <a href="https://chimchooree.itch.io/legless-the-cat">itch.io</a>. <br></p>
|
||||
<img src="/static/img/ent/everythingscomingtogether_no-legsthecat.png" alt="(No-Legs the Cat screenshot: Poltics Cat finds a bowl of breakfast in the maze)"><br>
|
||||
<br>
|
||||
<p>It's not much - just a demonstration to myself that I can export a game and embed HTML5 applications here. It runs pretty well locally, so we'll see how well it runs on the live server in my playtesters' browsers. I'm getting close to releasing the first minor demo for Blessfrey, so I'd really rather iron out all the kinks with a short and simple project first, you know? Dreading the day I have to handle serialization in the browser. <br></p>
|
||||
<br>
|
||||
<p>Have fun! More games coming soon. <br></p>
|
||||
<br>
|
||||
<h2>faq</h2>
|
||||
<h3>who is poltics cat? </h3>
|
||||
<img src="/static/img/ent/nolegsthecat_polticscat.png" alt="(photo: My pet orange kitty with an empty look on his face and legs tucked entirely under his body. He looks like a loaf of bread.)"><br>
|
||||
<p>My kitty! <br></p>
|
||||
<br>
|
||||
<p>It's just an inside joke. There was a guy who kept interrupting the political discussion channel by posting his pet, so I tried to imitate him with my own politics cat. Only I made a typo, and it stuck. <br></p>
|
||||
<br>
|
||||
<h3>where'd his legs go? </h3>
|
||||
<p>Aren't cats cute when they sit like that? It's called "loafing." Kitty's so fluffy that his legs become totally hidden when he does that, and he just stares helplessly at us when we start heckling him. <br></p>
|
||||
<br>
|
||||
<p>It looks like his legs are missing for real this time, though. He couldn't have gotten far without them, so they have to be somewhere in the maze. <br></p>
|
||||
<br>
|
||||
<h3>isn't one breakfast enough? </h3>
|
||||
<p>I dunno, my cat is weird. He wants us to give him breakfast first thing in the morning, then again when we eat our own breakfast. It's still so early, it's like he eats two breakfasts. He doesn't care about food for the rest of the day. It's like the concept of lunch and dinner are completely foreign to him. He's a dishonest little guy, though, so he'll come to both my husband and me separately to beg for "second" breakfast. We're usually too smart for him, but I'd be lying if he hasn't bamboozled us into <i>three</i> whole breakfasts before. <br></p>
|
||||
<br>
|
||||
<h3>when are godot devs going to stop making everything out of the godot head? </h3>
|
||||
<p>Probably never. <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 21, 2022 <br>
|
||||
<br>
|
@ -1,33 +0,0 @@
|
||||
<!--220825,220728-->
|
||||
<h1>no-legs the cat </h1>
|
||||
august 11, 2022<br>
|
||||
#game #no-legs-the-cat #godotengine #release<br>
|
||||
<br>
|
||||
<p><b>No-Legs the Cat</b> is a 2D maze game featuring Poltics Cat! Help him find his legs! He can't move by himself, so scoot him around with the arrow keys. Don't forget to feed him all three breakfasts or he'll starve!! Go play it <a href="http://127.0.0.1:9001/demo">here</a> or on <a href="https://chimchooree.itch.io/legless-the-cat">itch.io</a>. <br></p>
|
||||
<img src="/static/img/ent/everythingscomingtogether_no-legsthecat.png" alt="(No-Legs the Cat screenshot: Poltics Cat finds a bowl of breakfast in the maze)"><br>
|
||||
<br>
|
||||
<p>It's not much - just a demonstration to myself that I can export a game and embed HTML5 applications here. It runs pretty well locally, so we'll see how well it runs on the live server in my playtesters' browsers. I'm getting close to releasing the first minor demo for Blessfrey, so I'd really rather iron out all the kinks with a short and simple project first, you know? Dreading the day I have to handle serialization in the browser. <br></p>
|
||||
<br>
|
||||
<p>Have fun! More games coming soon. <br></p>
|
||||
<br>
|
||||
<h2>faq</h2>
|
||||
<h3>who is poltics cat? </h3>
|
||||
<img src="/static/img/ent/nolegsthecat_polticscat.png" alt="(photo: My pet orange kitty with an empty look on his face and legs tucked entirely under his body. He looks like a loaf of bread.)"><br>
|
||||
<p>My kitty! <br></p>
|
||||
<br>
|
||||
<p>It's just an inside joke. There was a guy who kept interrupting the political discussion channel by posting his pet, so I tried to imitate him with my own politics cat. Only I made a typo, and it stuck. <br></p>
|
||||
<br>
|
||||
<h3>where'd his legs go? </h3>
|
||||
<p>Aren't cats cute when they sit like that? It's called "loafing." Kitty's so fluffy that his legs become totally hidden when he does that, and he just stares helplessly at us when we start heckling him. <br></p>
|
||||
<br>
|
||||
<p>It looks like his legs are missing for real this time, though. He couldn't have gotten far without them, so they have to be somewhere in the maze. <br></p>
|
||||
<br>
|
||||
<h3>isn't one breakfast enough? </h3>
|
||||
<p>I dunno, my cat is weird. He wants us to give him breakfast first thing in the morning, then again when we eat our own breakfast. It's still so early, it's like he eats two breakfasts. He doesn't care about food for the rest of the day. It's like the concept of lunch and dinner are completely foreign to him. He's a dishonest little guy, though, so he'll come to both my husband and me separately to beg for "second" breakfast. We're usually too smart for him, but I'd be lying if he hasn't bamboozled us into <i>three</i> whole breakfasts before. <br></p>
|
||||
<br>
|
||||
<h3>when are godot devs going to stop making everything out of the godot head? </h3>
|
||||
<p>Probably never. <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 21, 2022 <br>
|
||||
<br>
|
@ -1,71 +0,0 @@
|
||||
<!--221006,220825-->
|
||||
<h1>gaming diary: Oblivion </h1>
|
||||
july 28, 2022<br>
|
||||
#gaming <br>
|
||||
<br>
|
||||
<p>One of my most-played games by far <br></p>
|
||||
<img src="/static/img/ent/oblivion_broken.png" alt="(screenshot: a floorless inn with floating NPCs and giant yellow exclamation marks)"><br>
|
||||
<br>
|
||||
<h2>gaming diary </h2>
|
||||
<p>Some gamedev advice I've heard is to actively journal while gaming. Try to see from gamedev and player eyes simultaneously and learn from the risks taken, get inspired by different genres, and generally increase your exposure to the medium. I might as well try it. <br></p>
|
||||
<br>
|
||||
<p>I haven't written about games outside of Steam reviews, so maybe it's easiest to start with a favorite: Oblivion. I've been going through an Oblivion phase again lately anyway. In the <a href="/diary/tag/gaming">Gaming Diary series</a>, I'll give a description of the featured game then paint in broad strokes what's fun and what holds it back. It'll be like a game review but for game designers. I'll keep a nitpicky journal privately. </p>
|
||||
<br>
|
||||
<h2>the best sandbox </h2>
|
||||
<p>The Elder Scrolls IV: Oblivion is a 2006 action/adventure game by Bethesda, sandwiched between Morrowind and Skyrim. You play as a <br></p>
|
||||
<br>
|
||||
<p>I've spent thousands of hours easily in Oblivion, but I don't have a normal relationship with it. I've only finished the main quest once and still haven't completed all the quests after all these years. The bulk of my gameplay has been spent roleplaying in Anvil or making mods. Judging from my backup folder, I've been making significant edits to the game every few months since high school. So for me, Oblivion is a sandbox, or maybe even just a level editor with a lot of premade content. <br></p>
|
||||
<br>
|
||||
<p>So what are the issues keeping me from playing the game as a game? <br></p>
|
||||
<h2>problems with the game </h2>
|
||||
<p>Obviously, the combat and level scaling is bad, but every reviewer in the world has torn into those topics already. Honestly, The Elder Scrolls is strong in adventure, not combat, so I'm not miffed by it. Few modern games (post-2005) are compelling by that metric alone. Morrowind is propped up as so much better, but the RPG aspects are barebones and won't punish you much at all for neglecting to plan your class. The So long as you are willing to pour a few hours into missing with your weapon or lockpick or spell or whatever, you'll start hitting and hard. (well, Morrowind DOES has cool spells like levitation that tie into levitation dungeon puzzles..so it's an awesome RPG in some ways.) It's like offering high praise to Planescape Torment then extending that praise to Planescape Torment's combat. So long as the combat doesn't detract too much from the game's high points, that's okay with me. <br></p>
|
||||
<br>
|
||||
<p>I sink into Daggerfall and Morrowind when I play, but I'm not sure I felt that way even when first started Oblivion. The art direction never looked good to me, unlike Morrowind's intriguing alienscape. The level design is overwhelmingly bland (overworld, dungeons, cities, houses). They haven't aged well, either. After seeing Witcher 3's massive and believable cities overflowing with workers and pedestrians, the Imperial City is a ghost town.
|
||||
Oblivion has a particularly pleasant soundtrack, so it's not bad to walk around town or the forest. Daggerfall has incredible dungeons that, combined with some random quest objective, are strong enough to stand on their own. Plenty of Morrowind's dungeons stand out to me, too, with their levitation and waterbreathing puzzles, strong aesthetic differences between caves and Dwemer underground cities. I'm not sure any really stand out to me in Oblivion. The puzzles in Ayleid dungeons are pretty basic and easy to just run through, heal up, and move on. There's nothing to really learn about the Ayleids, despite game taking place in their old capital. Very shallow inclusion. <br></p>
|
||||
<br>
|
||||
<p>Part of the problem I mentioned is that I'm forcing myself 10 years later into trying a significant amount of the content. Especially back when I was in high school, I was the kind of person who 100%'ed every game I touched. Oblivion makes it very unrewarding, very tedious, and too obscure to dig into the game. I slept in an inn maybe once. I stopped walking on foot unless I forced myself, opting to map travel, missing out on the opportunity to find small quests in the wild. <br></p>
|
||||
<br>
|
||||
(screenshot of witcher 3 city vs imperial city)
|
||||
(screenshot of meme dialogue)
|
||||
(screenshot of cool morrowind dungeons and interiors)
|
||||
(screenshot of daggerfall dungeon)
|
||||
(screenshot of Planescape torment combat)
|
||||
<h2>so what carries the game? </h2>
|
||||
<p>That would be the writing. It's not surprising in the slightest that every time a 'best quests ever' article or thread pops up online, the And Then There Were None quest, the painting quest, Glarthir's quest, and other Oblivion quests. It's creative and cool, but I think there's more to its lasting popularity. I think Oblivion was emulating a memetic quality before memes had the importance they do together. The dialogue is editted and tight. Each screenshot of text can stand on its own, and is often hilarious on its own. It's only boosted with the uncanny Bethesda freeze and zoom onto the ridiculously ugly potato faces that change tone and expression line by line. <br></p>
|
||||
<br>
|
||||
<p>The part that kept the game running at all times for me was the music. The music is particularly pleasant. I've heard Jeremy Soule was inspired for at least some tracks by a car accident and his new appreciation for life, but I haven't verified that. Morrowind's doesn't have enough variety, so the big movie adventurer score plays when I'm just reorganizing my crates at home, so though nice, it can be inappropriate at times. Skyrim's has almost too much variety and seems more complicated, so it's more difficult for my untrained ear to pick out particular tracks to tie to memories in-game. Oblivion's is the sweet spot in the middle. Simple, pleasant, and always ties into what my character is currently doing. I spent so much time studying or doing homework, using the game as a 12 hour oblivion study and chill video running in the background. If I went a long time without playing then heard the soundtrack, it pulled on my heart. I don't feel this way about many games, but a huge portion of Oblivion is the soundtrack to me, and I wouldn't be surprised if others feel this level of connection between the two. <br></p>
|
||||
<br>
|
||||
<p>I feel like it was their last artistic, vulnerable endeavor that was trying to be more than a commercial project. The radiant AI has some wild stories. Only Bethesda would surrender their control over the player's experience and hand it over to not only the player but the NPCs. Even if the radiant AI is shackled in its current state, I still can seldom visit Olaf's inn in Bruma without witnessing a town-wide brawl. It makes the game unplayable to a degree. There were plenty of interesting NPCs I only learned about on my second playthrough because so many died off-screen during my first. It gives the game the same unpredictability that old Sims games had, but the simulation was obviously the point of those games. There's something raw about putting that into an RPG. Despite being a quest marker game, it is also comfortable about filling the world with content on well-traveled paths. There are still quests I am discovering for the first time, albeit it small ones in remote inns. Most games these days try as hard as possible to put the player on rails. If they make a good quest, they force the start point into you hand. <br></p>
|
||||
<br>
|
||||
<p>Most people wouldn't say it's the writing and music and certainly not the art, though. They'd say it's the modding community. They'd probably be right, but there's probably plenty of highly moddable games out there that never gain any traction. I don't think Fallout's is nearly as impressive, despite the games being very similar. Oblivion is just particularly inspiring to mess around with! The community surely would have never come without the name recognition and actual merits of the game. Oblivion has an awesome modding community, though, that still is active even today. I'm not sure if Bethesda manages it well, with all the attempts to monetize, control the platform on which mods can be published, and incompatible rereleases of theirs games, but once they put the construction kit out there, people are going to publish mods. <br></p>
|
||||
<br>
|
||||
<p>I'm happy with the game as is, so I'm not motivated to do much more than disable cliff racers and make a few houses. Oblivion is so simple, though, (it's not too far from a walking in a fantasy forest emulator) that I don't feel as bad about drastic modding. The graphics are right on that line of modern 3D graphics but still within grasp for amateur modelers to create nonclashing models for, too. With localization mods making the game accessible to new communities at staggered times, there were several waves of new cultures making mods. Japan's in particular stand out, with all their Japanese-influenced Akavir mods and cute clothes and character models. <br></p>
|
||||
<br>
|
||||
<h2>gallery </h2>
|
||||
<p>I'll share some of my personal screenshots. <br></p>
|
||||
<div class="gallery">
|
||||
<img src="/static/img/ent/oblivion_akavir.png" alt="(screenshot: my dunmer girl wearing a kimono and the Madstone in Akavir)"><br>
|
||||
<img src="/static/img/ent/oblivion_cathedral.png" alt="(screenshot: cathedral lights at night)"><br>
|
||||
<img src="/static/img/ent/oblivion_inn.png" alt="(screenshot: Martin and my breton girl watching the rain from their room at the inn)"><br>
|
||||
<img src="/static/img/ent/oblivion_jeanne.png" alt="(screenshot: my breton girl and Jeanne in their favorite dresses)"><br>
|
||||
<img src="/static/img/ent/oblivion_martin.png" alt="(screenshot: Martin spending time with the Blades)"><br>
|
||||
<img src="/static/img/ent/oblivion_unicorn.png" alt="(screenshot: my breton girl riding a unicorn through the woods)"><br>
|
||||
</div>
|
||||
<p>Don't ask me all the mods...<br></p>
|
||||
<br>
|
||||
<h2>what would I like to emulate from Oblivion? </h2>
|
||||
<p>I can't say anything 100%, only point out things I admire. <br></p>
|
||||
<br>
|
||||
<p>Maybe it's a bad thing for a dev to say, but it's comforting that a game with such awkward graphics and objectively poor and unfun gameplay mechanics and systems (imo lol) can be held up so well by creative quests and NPC dialogue, music, willingness to try some unusual wacky mechanic. <br></p>
|
||||
<br>
|
||||
<p>Definitely going to take notes from the writing. The memetic, screenshottable quality is a very smart guideline to shoot for while writing. Avoiding awkward breaks between screens is less shareable. Screenshots are more attractive when they have complete sentences or at least complete ideas on them. <br></p>
|
||||
<br>
|
||||
<p>The cities have a lot of detail and environmental storytelling to appreciate, but they come across as so lifeless and dead to me today. After all the time I've spent redesigning Chorrol and the Imperial City to have more character and life. <br></p>
|
||||
<br>
|
||||
<p>I love that they didn't give us a simple level editor - they gave us tools capable of creating most of the content in the game. If I could make the content with tools that I could release alongside the game, that would be really cool. I'm already designing skills with this mindset. I think most devs make tools to develop their game with, so I'm not really sure why most of those tools are never released. It'd take some effort to polish them and make them more usable by amateurs, but practically no one releases them. You'd think the Construction Set and GECK wouldn't be so special, but they really are. <br></p>
|
||||
<br>
|
||||
<p>Then, the most important part, the aesthetic of a couple of Oblivion mods was the direct push that spurred me to start writing Blessfrey. I don't still have them, but it was like a motorcycle mod, some streetwear mods, etc. That idea of going to a relatively believable modern day relatable setting and going shopping and hanging out with your cute elf boyfriend and having a greatsword and cute clothes was extremely lore-breaking (though probably not to Kierkegaardists) but enthralling. I had a few more ideas for mods, like a Spider Daedra themed fast food joint in the Market District, but the level of modding I was looking at was so much that I halted and started making my own game instead with that aethetic instead. I'm not sure Blessfrey really resembles those original mods, but that was the impetus, the spark. So...honestly, all of Blessfrey is an attempt to emulate Oblivion at least in some small part. <br></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 28, 2022 <br>
|
||||
<br>
|
@ -1,67 +0,0 @@
|
||||
<!--201224,200806-->
|
||||
<h1>making of blessfrey.me</h1>
|
||||
october 15, 2020<br>
|
||||
#bottle #css #html #simpletemplate #webdesign #webdevelopment<br>
|
||||
<br>
|
||||
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 <a href="https://bottlepy.org/docs/dev/">Bottle</a>, a Python web framework. <br>
|
||||
<br>
|
||||
<h2>why not use a premade blogging platform like WordPress? </h2><br>
|
||||
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. <br>
|
||||
<br>
|
||||
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. <br>
|
||||
<br>
|
||||
<h2>why Bottle? </h2><br>
|
||||
I originally wrote Blessfrey.me in PHP. I switched to Bottle after looking for a templating engine. Bottle comes with SimpleTemplate and can do everything PHP can do but faster and with less verbosity. Plus, I get to write in Python, a much more enjoyable language. <br>
|
||||
<br>
|
||||
<h2>how does blessfrey.me work? </h2><br>
|
||||
<h3>SimpleTemplate </h3><br>
|
||||
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. <br>
|
||||
<br>
|
||||
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 <code>{{!base}}</code>. (Double curly brackets refer to variables, and exclamation marks disable escaping.) <br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/blessfrey_website_alltemplate.png" alt="(image: basic template code.)"><br>
|
||||
</center>
|
||||
(The code can be found on <a href="https://pastebin.com/mQuGX3Xa">Pastebin</a>.) <br>
|
||||
<br>
|
||||
The header template below (brought in at <code>% include('header.tpl')</code>) has some variables, too, which are supplied by the Bottle script. If Bottle doesn't provide a title, it defaults to 'blessfrey.me.' Variables can also be used in paths and URLs. <br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/blessfrey_website_headertemplate.png" alt="(image: header template code.)" width="500" height="54"><br>
|
||||
</center>
|
||||
(The code can be found on <a href="https://pastebin.com/JcEU4xTm">Pastebin</a>.) <br>
|
||||
<br>
|
||||
You can insert Python code into the templates for dynamic pages. Below is an excerpt of the template for the diary page. This code fills the page with diary entry previews using a for loop. Not shown is the first line <code>% rebase('frame.tpl')</code>, which tells SimpleTemplate to insert this content at the <code>{{!base}}</code> variable in the frame template. <br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/blessfrey_website_snippettemplate.png" alt="(image: diary snippet code from diary template.)" width="500" height="401"><br>
|
||||
</center>
|
||||
(The code can be found on <a href="https://pastebin.com/ckEj9Bf2">Pastebin</a>.) <br>
|
||||
<br>
|
||||
The Bottle script sends the max number of snippets per page (the <code>limit</code>) and a list of lists containing all the diary snippets. It receives the page number from the URL. For the snippets that will appear on the given page, it converts the list data into HTML code to be displayed in the browser. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h3>Bottle </h3><br>
|
||||
Bottle takes URLs and generates the corresponding web page upon request. Each URL is tied to a method, which returns a template and a dictionary of data to be used in the template. Since Bottle is a Python framework, you have access to all the Python libraries you need. <br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/blessfrey_website_diaryscript.png" alt="(image: Bottle script excerpt for diary routes.)" width="500" height="288"><br>
|
||||
</center>
|
||||
(The code can be found on <a href="https://pastebin.com/Bf96F9Ha">Pastebin</a>.) <br>
|
||||
<br>
|
||||
This is what the methods for specific routes look like. So every time you go to Blessfrey.me/diary, one of the above methods is called, depending on whether also you supplied an integer. To generate the page content, it calls a lot of Python functions to find my diary entries, convert them into previews for the snippets section and headlines for the sidebar, and get the current time for the footer. <br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<h3>CSS </h3><br>
|
||||
The website is styled using CSS, heavily relying on the CSS Grid and a bit of Flexbox. CSS Grids can be used inside CSS Grids, so my pages are generally blocked out, with smaller internal grids managing specific content. <br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/blessfrey_website_cssgrid.png" alt="(image: CSS Grid traced over screenshot of projects page.)" width="500" height="491"><br>
|
||||
</center>
|
||||
<br>
|
||||
The projects page is an example of nested grids. Almost every page uses the yellow general layout. The content unique to the projects page is mapped out in green, with a section for the header, featured projects, and other projects. The other projects use a 2-column grid in blue to evenly space out all the little thumbnails. <br>
|
||||
<br>
|
||||
The CSS code for project's general grid and the nested unfeatured grid are shown below.<br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/blessfrey_website_projectcss.png" alt="(image: projects css code.)"><br>
|
||||
</center>
|
||||
(The code can be found on <a href="https://pastebin.com/pVgkmT5k">Pastebin</a>, but you can always see a web page's CSS by right-clicking and viewing the source.) <br>
|
||||
<br>
|
||||
Last updated June 8, 2021 <br>
|
||||
<br>
|
@ -1,44 +0,0 @@
|
||||
<!---->
|
||||
<h1>outfit of the day </h1>
|
||||
august 11, 2022<br>
|
||||
#fashion #ootd <br>
|
||||
<br>
|
||||
<p>Sometimes, I feel like remembering what I wore. <br></p>
|
||||
<br>
|
||||
<h2>lazy tiger</h2>
|
||||
<p>Don't feel like wearing pants or a blouse. Can never go wrong with my favorite skirt and a t-shirt. Today, I went with a black souveneir t-shirt with a vibrant orange tiger on the front. I think the colors look okay with my fall coat & hat combo. There was a simple moonstone teardrop pendant on a gold-colored chain, but I took it off before picture time. Oops. <br></p>
|
||||
<br>
|
||||
<p>I wore makeup to match - red eyeshadow as eyeliner with mauve-purple shimmer blush and a purple-plum lip water stain. <br></p>
|
||||
<br>
|
||||
<img src="/static/img/otd/ootd_221106.jpg" alt="(photo: my outfit - a black t-shirt with a painterly tiger's face on the front over a black and dusty purple lace maxi skirt. My coat has red and black plain over rich tan. My cloche hat is nearly the same tan.)"><br>
|
||||
<br>
|
||||
<p>Clothes: <br></p>
|
||||
<p><ul>
|
||||
<li>Hat: C&C (ebay repurchase of a wholesale hat from an Atlanta Apparel at AmericasMart tradeshow) </li>
|
||||
<li>Coat: Avec Les Filles's Longline Plaid Blazer in RED MOTIF (Anthropologie) </li>
|
||||
<li>Pendant: (TJ Maxx)</li>
|
||||
<li>T-shirt: Cincinnati Zoo gift shop </li>
|
||||
<li>Skirt: Free People (bought in 2011 and has never had a break) </li>
|
||||
<li>Socks: some pack from Target </li>
|
||||
</ul></p>
|
||||
<br>
|
||||
<h2>lazy </h2>
|
||||
<p>Don't feel like wearing pants or a blouse. Can never go wrong with my favorite skirt and a t-shirt. Today, I went with a black souveneir t-shirt with a vibrant orange tiger on the front. I think the colors look okay with my fall coat & hat combo. There was a simple moonstone teardrop pendant on a gold-colored chain, but I took it off before picture time. Oops. <br></p>
|
||||
<br>
|
||||
<p>I wore makeup to match - red eyeshadow as eyeliner with mauve-purple shimmer blush and a purple-plum lip water stain. <br></p>
|
||||
<br>
|
||||
<img src="/static/img/otd/ootd_221106.jpg" alt="(photo: my outfit - a black t-shirt with a painterly tiger's face on the front over a black and dusty purple lace maxi skirt. My coat has red and black plain over rich tan. My cloche hat is nearly the same tan.)"><br>
|
||||
<br>
|
||||
<p>Clothes: <br></p>
|
||||
<p><ul>
|
||||
<li>Hat: C&C (ebay repurchase of a wholesale hat from an Atlanta Apparel at AmericasMart tradeshow) </li>
|
||||
<li>Coat: Avec Les Filles's Longline Plaid Blazer in RED MOTIF (Anthropologie) </li>
|
||||
<li>Pendant: (TJ Maxx)</li>
|
||||
<li>T-shirt: Cincinnati Zoo gift shop </li>
|
||||
<li>Skirt: Free People (bought in 2011 and has never had a break) </li>
|
||||
<li>Socks: some pack from Target </li>
|
||||
</ul></p>
|
||||
<br>
|
||||
<br>
|
||||
Last updated July 31, 2022 <br>
|
||||
<br>
|
@ -1,64 +0,0 @@
|
||||
<!--210107,201112-->
|
||||
<h1>refactoring characters: black box </h1>
|
||||
february 18, 2021<br>
|
||||
#character #refactor <br>
|
||||
<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>
|
||||
The two biggest problems with my character script were the lack of structure + encapsulation. <br>
|
||||
<br>
|
||||
<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>
|
@ -1,15 +0,0 @@
|
||||
<!--201224,201015-->
|
||||
<h1>free pixel font </h1>
|
||||
august 20, 2020<br>
|
||||
#assets<br>
|
||||
<br>
|
||||
<b><a href="https://fontstruct.com/fontstructions/show/1596262/pixel-joy">pixel joy</a></b> is a small, round sans-serif pixel font, made using <a href="https://fontstruct.com/">FontStruct's FontStructor</a> for an old version of Blessfrey. Freely use and edit for your personal and commercial projects. No credit needed. <br>
|
||||
<br>
|
||||
Download it from <a href="https://fontstruct.com/fontstructions/show/1596262/pixel-joy">FontStruct</a>.<br>
|
||||
<br>
|
||||
<center><img src="/static/img/ent/pixeljoy.jpeg" alt="image: pixel joy font preview"></center> <br>
|
||||
<br>
|
||||
Font released under public domain. Sample text in the preview image is from Imogen Heap's "Pocket Sun," and the colors are from <a href="https://lospec.com/palette-list/aap-64">Adigun Polack's AAP-64 palette</a>. :)<br>
|
||||
<br>
|
||||
Last updated June 8, 2021 <br>
|
||||
<br>
|
@ -1,39 +0,0 @@
|
||||
<!--210218,201029-->
|
||||
<h1>tidying up my skill phases </h1>
|
||||
november 12, 2020<br>
|
||||
#programming #skills<br>
|
||||
<br>
|
||||
In Godot Engine, you can call methods from a parent class by prefixing it with a period (.). So to access the <code>move()</code> method from a parent, call <code>.move()</code>. This is called a <b>super method</b>. <br>
|
||||
<br>
|
||||
Being called super doesn't mean there isn't a better way, though. I used to use super methods to build customs skills in blessfrey, but subfunctions is tidier. <br>
|
||||
<br>
|
||||
(Just so you know, blessfrey's skills have a number of phases of effects that must happen in order: skill press > activation > initial phase > main phase > end phase > cooldown.) <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>the old way </h2><br>
|
||||
Initially, I used super methods to give each phase custom effects and call the next phase. This was messy. If I ever redesigned the flow of the skill phases, I'd have to edit every single skill script. It also causes a lot of repetitive code in the individual skill scripts while the base script is tiny. The one-time script being the small one is no fair. <br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/supermethod_old.png" alt="(image: GDscript code using old method)"><br>
|
||||
</center>
|
||||
(You can see the old method's code on <a href="https://pastebin.com/DDu1Q7Q6">Pastebin</a>.)
|
||||
<br>
|
||||
<br>
|
||||
<h2>the new way </h2><br>
|
||||
<br>
|
||||
Instead, I can bring all the repetitive steps into the base class, sandwiching in a subfunction where the custom effects would take place. Now I only need to add what makes my skill unique inside the subfunction. <br>
|
||||
<br>
|
||||
I named the subfunction after its main function and added an underscore to the front. So in the base script, I fit <code>_functionality(user, action_target)</code> into <code>functionality(user, action_target)</code>. Then the individual skill scripts only need the subfunction, none of the other repetitive code from before. The subfunction is empty in the base class and filled with unique code in the child classes. Since skills inherit, the unique <code>_functionality</code> subfunction will be called automatically from the base script's <code>functionality</code>. <br>
|
||||
<br>
|
||||
<center>
|
||||
<a target="_blank" href="/static/img/ent/supermethod_old.png">
|
||||
<img src="/static/img/ent/supermethod_new.png" alt="(image: GDscript code using new method)" width="500" height="355.36">
|
||||
</a>
|
||||
</center>
|
||||
(You can see the new method's code on <a href="https://pastebin.com/teeYn9jP">Pastebin</a>.)
|
||||
<br>
|
||||
<br>
|
||||
<h2>problem solved! </h2><br>
|
||||
<br>
|
||||
The base script holds all the lengthy code in one place, while I only need to write the unique effects in all the hundreds of skill scripts. That saves me time making, refactoring, and maintaining skills. Yay. <br>
|
||||
<br>
|
||||
|
@ -1,49 +0,0 @@
|
||||
<!--200806,200903-->
|
||||
<h1>pretendOS - a game inspired by windows XP </h1>
|
||||
november 26, 2020<br>
|
||||
#sideproject<br>
|
||||
<br>
|
||||
Getting started with blessfrey's AI was overwhelming, so I took a break and worked on a new game. I didn't get very far. It's not even on my hard drive anymore. It's cute, though. <br>
|
||||
<br>
|
||||
Unlike blessfrey, where coding takes up 90% of the effort, pretendOS is mostly graphical assets + sounds with barely any functionality. It's a UI game, after all. Since it's a game requiring a completely opposite skill-set, I was able to make progress on <i>something</i> while reading up on game AI. I also got to work on new things like particle effects. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>Inspiration </h2>
|
||||
<br>
|
||||
<h3>Windows XP</h3>
|
||||
The game takes strong aesthetic inspiration from Windows XP. It almost fits the 90s vaporwave trend, but I'm too young to really remember Windows 95. I obviously have nostalgia for it as my first operating system (as far as I remember - I was a toddler then), but I mostly knew it as the Lego Island machine propped up in the dining room. As my family upgraded computers over the years, Windows never really impacted me as anything more than something that can run some videogames and whatever popular web browser of the time. That is, until Windows XP. <br>
|
||||
<br>
|
||||
XP really hooked me. It was the first operating system I spent as much time exploring as I spent using software. XP's edition of Paint was my favorite yet, I loved fiddling with the themes and accessibility options, especially Microsoft Sam, Rover, and Clippy. I started watching YouTube videos on how to use the Command Prompt. XP was just fun to use. I've found better desktop environments and operating systems since, but I never got over that aesthetic: smooth, blended graphics with hard pixel edges in 32-bit color with an alpha channel, right at the cusp between pixel art and vector graphics. Vaporwave for me is Luna olive green, or the "Fisher-Price interface" as Ars Technica users called it. <br>
|
||||
<br>
|
||||
<img src="/static/img/ent/wikipedia_luna.png" alt="(image: Wikipedia excerpt: Critics who did not like the theme characterized it as a 'Fisher-Price interface'.)"><br>
|
||||
(screenshot from <a href="https://en.wikipedia.org/wiki/Windows_XP_visual_styles">Wikipedia</a> - referencing articles from <a href="https://web.archive.org/web/20091008081626/http://www.pcworld.com/article/117427/full_disclosure_your_take_on_windows_worst_irritations.html">PCWorld</a> and <a href="https://arstechnica.com/information-technology/2014/04/memory-lane-before-everyone-loved-windows-xp-they-hated-it/">Ars Technica</a>)<br>
|
||||
<br>
|
||||
<br>
|
||||
There were a few other experiences behind the game, too. <br>
|
||||
<br>
|
||||
<h3>Mother's Day E-Card</h3>
|
||||
I finally got my husband to try Godot Engine, and he used it to make a digital Mother's Day card for his mom. (Cute.) Opening the card displayed a 3D heart (a "cardioid") that bounced to the beat of a song while 2D cardioid particles rained down. It was all programmatically generated using geometry instead of 3D + 2D assets, so the application was very small. He made the graphics side of things look really interesting, and I wanted to play around with particles, too. Just...not as fancy;; <br>
|
||||
<br>
|
||||
<h3>Secret Little Haven</h3>
|
||||
I also just played a cute pretend OS game on itch called <a href="https://ristar.itch.io/secret-little-haven">Secret Little Haven</a> It's quite short, very story-driven, and kind of buggy, telling Alex's struggle with gender identity through IMs. Honestly, pretend OS games and coming-of-age chat sims are nothing special, but Secret Little Haven's believability makes it really stand out. Instead of defending against cheesy + inaccurate deep web hacking attempts, you use an in-game terminal to get around child locks set by Alex's dad. Those terminal puzzles are the most realistic and relatable hacking I've seen in these games. SLH isn't super sophisticated or in-depth, but it shows how cute and believable a pretend OS game can be. I'd love to make a little environment like that, that's as fun to fiddle around with as XP. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>pretendOS </h2>
|
||||
<br>
|
||||
So what's pretendOS? Like I said, not much besides pictures. I only worked on it for a few days. <br>
|
||||
<br>
|
||||
What really bogged it down was Cat Chat. I wanted an AI chat personality that talked like a cat. I could do that, but that kind of thing takes a lot of time, when this project was really just procrastinating working on AI. <br>
|
||||
<br>
|
||||
The rest is cute, though. The icon winks when you click it, the cursor's kinda 2000s-free-animated-cursors, and it's got those Fisher-Price colors and bubbly sounds everywhere that I liked as a kid. <br>
|
||||
<br>
|
||||
<center>
|
||||
<a target="_blank" href="/static/img/ent/pretendOS_catchat.jpeg">
|
||||
<img src="/static/img/ent/pretendOS_catchat.jpeg" alt="(image: pretend desktop with a Cat Chat application)" width="500" height="281.25">
|
||||
</a><br>
|
||||
</center>
|
||||
<br>
|
||||
<br>
|
||||
<h2>the future</h2>
|
||||
<br>
|
||||
It's cute. I'd like it to be finished in some way. I went ahead and cloned my old repo. Maybe I'll fill it out with more applications during a game jam or something or at least finally get that cool Secret Little Haven curved screen shader working. <br>
|
||||
<br>
|
@ -1,13 +0,0 @@
|
||||
<!--210318,200806-->
|
||||
<h1>web development resources</h1>
|
||||
january 21, 2021<br>
|
||||
#accessibility #color #css #html #webdesign<br>
|
||||
<br>
|
||||
I'll collect frequently used resources for web design here. <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li><a href="https://cssgrid-generator.netlify.app/"><b>CSS Grid Generator</b></a> - build a basic CSS Grid by changing the number of columns + rows, adjusting their dimensions, and adding containers. </li>
|
||||
<li><a href="https://validator.w3.org/nu/#textarea"><b>W3's Nu Html Checker</b></a> - automatically check the validity of your HTML + CSS. </li>
|
||||
<li><a href="https://webaim.org/resources/contrastchecker/"><b>WebAIM's Contrast Checker</b></a> - check whether your font color contrasts well against your background color, at least in the eyes of a computer. </li>
|
||||
<li><a href="https://coolors.co/75dbcd-c9dbba-dcdba8-f5cda7-faa381"><b>Coolors</b></a> - select and lock colors then generate palettes by pressing space. Click on a color to view shades + tints, so you can tweak contrast without losing hues. </li>
|
||||
</ul>
|
File diff suppressed because one or more lines are too long
@ -1,20 +0,0 @@
|
||||
<!--220310,220224-->
|
||||
<h1>goalless games </h1>
|
||||
january 14, 2022<br>
|
||||
#game-design #philosophy<br>
|
||||
<br>
|
||||
<h2>goalless games </h2><br>
|
||||
Some developers are happy to make loose, meandering sandbox games without no true win or fail state. The concept of goalless games is controversial among semantic people, but I feel that the genre with Garry's Mod and all the dressup games and physics simulators is enviably successful if not totally legitimate. It's not like the overwhelmingly popular Minecraft and old RuneScape don't share one foot in this genre, either, with their relative lack of direction and gameplay dominated by self-driven goals. I don't even feel like a central story or main objectives would improve these games (especially after watching Minecraft tack on some tedious hunger mechanic and an awkward final boss). <br>
|
||||
<br>
|
||||
<h2>my need for structure </h2><br>
|
||||
I'm just not a goalless game designer myself. <br>
|
||||
<br>
|
||||
It sounds nice to provide an open world where the player can set out after his own goals without the dev placing horse blinders on his head. In reality, though, a game designer can't force a player to share the game's goals in the first place, so there's no need to purposefully design a game to be goalless. For me, I feel like neglecting to set a game's goal reflects a lack of a game development goal. A goal is helpful to not only the player but also to the developer. A central vision of the game's progression will imbue each piece of the game with more purpose and help them fit together more seamlessly as a whole. It's a safeguard against filling a game with pointless, incongruent clutter at whim. Obviously not every developer needs a goal-oriented approach, but I work better with one. <br>
|
||||
<br>
|
||||
No matter what philosophy the game designer has, though, a player will do what he wants to do, even if it has nothing to do with the goal of the game. For example, roleplayers are prominent members of MMO communities, and they might never max out a character or finish the main storyline. They throw out all the game designers' work and focus on finding the perfect backdrop and acting out their own scene instead. There are plenty of screensaver simulators and 3D chat servers out there for them, but they turn up in "real" goal-driven games, too. There are touches of this aberrant behavior in everyone who doodles with bullet holes, names their character something funny to harvest out-of-context dialog screenshots, or hoards a useless item. <br>
|
||||
<br>
|
||||
<h2>players do whatever they want anyway </h2><br>
|
||||
So in a way, game designers really don't need to design a goalless game. They can trust players to forge their own fun from even the most rigid hallway simulator. In my opinion, deliberately not designing goals runs the greater risk of making players too lost, bored, or overwhelmed to find their own fun or not even finding incentive to try the game in the first place. A better approach is in the middle, building towards a purpose while taking a tip from goalless games by filling the world with choices, interesting tools, and interactibles that are fun for fun's sake. At the end of the day, though, obviously do what works for your players! <br>
|
||||
<br>
|
||||
Last updated January 12, 2022
|
||||
<br>
|
@ -1,28 +0,0 @@
|
||||
<!--200806,201224-->
|
||||
<h1>designing blessfrey's first demo </h1>
|
||||
january 20, 2022<br>
|
||||
#demo <br>
|
||||
<br>
|
||||
<h2>my goals </h2><br>
|
||||
The systems and game mechanics in Blessfrey are mostly present and functional, so I feel like it's a good time to practice releasing, hosting, and supporting a game. The first release will just be a tech demo. I want it to showcase the features in the game, have structure and goals, and have some of the same gameplay feel of future releases. Hopefully it's fun, but we'll see when it's all bolted together. <br>
|
||||
<br>
|
||||
The core of the game is curating from a wide variety of skills and combining them into a viable skillbar. I'm going to try to get away with skimping on content to put more focus on the release process, but skill variety deserves the most attention. I'll shoot for 30 skills for now, or in other words, 3-4 skillbar's worth without repeats. <br>
|
||||
<br>
|
||||
<h2>finding structure </h2><br>
|
||||
I could release a <a href="https://www.blessfrey.me/diary/entries/220114">goalless demo</a>, but I fear people wouldn't explore long enough to discover any depth. If I could rip a level from the finished game, structure and goals would already be built in, but this demo will be more or less original content. I'll have to build structure as I go along. <br>
|
||||
<br>
|
||||
This demo should showcase more gameplay than story and world, so it should probably have more in common structurally with a tutorial room. I'll just fallback on the tutorial bingo approach again and hope it never loses its luster. Bingo is a great excuse to list gameplay prompts for the player while giving them some choice on how to proceed. It's also a game in itself, so I don't need to take my game design much further: every full consecutive set of activities is a little win with a prize and a full board bingo is a big win with a big prize. I'm not going to worry about a fail state, so the demo can be more like a playground than a challenge. <br>
|
||||
<br>
|
||||
The demo shouldn't just resemble a tutorial - it should <em>be</em> a tutorial. It is the first time unguided players will be able to play, so there needs to be lots of in-game guidance. I'll test a stealth tutorial and see how it compares to a more conventional tutorial. Ideally, the tutorial should be easy enough for veterans to breeze through without noticing it's even there, but nudges and tips are given to those who need it. It'd be even cooler if the tutorial doesn't break immersion, coming from level design, believable dialog, or from passers-by setting an example. Maybe it's a terrible idea and there's a reason why all games start out feeling like post No Child Left Behind era public school, but I want to try it out. Since I have the <a href="https://www.blessfrey.me/diary/entries/210402">event system</a>, it's just a matter of listening for lack of movement, unnecessary key spamming, stalling in quest progress, or any other apparent failures and sending someone over to help out. <br>
|
||||
<br>
|
||||
<h2>world and story </h2><br>
|
||||
I won't be taking an exerpt of the story or using fully realized locations, but the demos should at least conceivably fit within the full game. This time, I'm just going to use two of the major supporting characters, Chloe and Night, (both healers) and enough of the school to service a demo. The courtyard is a relatively safe area with some easier enemies to the far side of the map, guarding collectible items. If you die, the checkpoint is in this field, managed by Chloe. The nurse's office is an item shop, run by Night. The storage room is a maze full of monsters and treasure. The areas, monsters, and dialog will be more involved than anything I've ever tested before, and it'll include a stress test skill. Let's see how the engine handles it! <br>
|
||||
<br>
|
||||
<h2>ugly </h2><br>
|
||||
Of course, it's going to be pretty rough overall. It's the first alpha build released to the public, so there are a few bugs I know are still in there, some capable of crashing the game. Also, there are no frills when it comes to the audiovisual side - barely any animations, all audio is from the public domain, effects are carelessly placed, and so on. Like Yandere Dev says, "all assets are placeholder." :) <br>
|
||||
<br>
|
||||
Anyway, back to working on the demo! <br>
|
||||
<br>
|
||||
<br>
|
||||
Last updated January 20, 2022
|
||||
<br>
|
@ -1,30 +0,0 @@
|
||||
<!--220127,210708-->
|
||||
<h1>applied skills vs. applied keywords </h1>
|
||||
march 24, 2022<br>
|
||||
#skill <br>
|
||||
<br>
|
||||
<h2>monitoring skills </h2><br>
|
||||
In Blessfrey, entities like to know where effects come from. <br>
|
||||
<br>
|
||||
For one, knowing the source of a killing blow allows for cute little feedback like the Binding of Isaac's death screen. <br>
|
||||
<center><img src="/static/img/ent/bindingofisaac_deathscreen.png" alt="(image: the death screen in Binding of Isaac looks like a torn diary page, showing a crude illustration of what killed him and a vague description of the area where he died.)"</center> <br>
|
||||
More importantly, it allows mechanics to interact more freely. If the bleeding status effect on a character is linked with the Cat Scratch skill, used by Bad Cat, that opens up possibilities. Maybe there could be a skill that reflects target's status effects back unto the original dealer. Maybe there could be an effect that negates skills from animal sources. Maybe a skill could heal an ally for even more you are both suffering from the same skill. The source is important if I want to do anything beyond the basic "cure bleeding." <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>how should the data be bundled? </h2>
|
||||
Skills themselves contain keywords, references to the user and target, and any data that could possibly be needed. It's immediately obvious to just directly tack the still onto the back of an array on the target. It can never be that easy, though. Skills contain keywords, all of which have different durations and aren't necessarily in the tree at the same time. Also, there's not a lot of applications for cycling through all the applied skills, besides making something like Guild Wars's <a href="https://wiki.guildwars.com/wiki/User_interface#Effects_monitor">effects monitor</a> and <a href="https://wiki.guildwars.com/wiki/User_interface#Damage_monitor">damage monitor</a>. <br>
|
||||
<br>
|
||||
<center><img src="/static/img/ent/guildwars_skillmonitor.png" alt="(image: Guild Wars's UI. At the top-left corner are all the icons of skills actively applied on your character. Along the left side of the screen is a list of the sources from which you recently took damage.)"</center> <br>
|
||||
<br>
|
||||
There aren't a lot of cases where the game would be looking to remove any instances of "Cat Scratch." However, there would plenty of skills looking to remove bleeding or status effects. <br>
|
||||
<br>
|
||||
It's a more direct approach to treat keywords and skills separately in the code. Characters can keep an array with references to the applied keywords instead of applied skills. The other data can be bundled with it as an array: [keyword, source, [tags]]. <br>
|
||||
<br>
|
||||
The keyword is the important part because, in bleeding's case, it's the main culprit for the actual health degeneration of the character. It also has its own duration, so there's no conflicts with holding onto bleeding even if all other keywords from its skill expiring. The source is just a noncommittal reference, so it and its data can be accessed as needed. Maybe the keyword and skill contain everything needed, but I'm going to pull out some frequently accessed attributes into tags to see if that helps with efficiency. <br>
|
||||
<br>
|
||||
<h2>it'll be better this way </h2>
|
||||
It's always a good idea to separate keywords from their governing skill. When skills and keywords are decoupled, each can run their course without interference. <br>
|
||||
<br>
|
||||
<br>
|
||||
Last updated April 7, 2022
|
||||
<br>
|
@ -1,161 +0,0 @@
|
||||
<!--210121,210304-->
|
||||
<h1>generating an RSS feed with python bottle</h1>
|
||||
march 18, 2021<br>
|
||||
#bottle #rss #webdev <br>
|
||||
<br>
|
||||
After a few months of quietly running my blog as practice, I want to start sharing my articles with other people. I looked over my favorite gamedev communities and saw that <a href="https://gamedev.net/">GameDev.net</a> apparently allows you to syndicate a blog through RSS. I never thought about making an RSS feed, so why not? <br>
|
||||
<br>
|
||||
<h2>what is RSS? </h2><br>
|
||||
Before the massive centralized content platforms came into the mainstream, the internet was more like a constellation of individual websites. In lieue of algorithm-driven feeds and push notifications from major social media, RSS was designed to bring content from scattered websites into one place. <br>
|
||||
<br>
|
||||
RSS and its predecessors have been around since the 90s. RSS 2.0 (what blessfrey.me uses) was published in 2002. Even through it's old and falling in popularity, it's still used by some large aggregators today like <a href="https://publishercenter.google.com/publications#p:id=pfehome">Google News</a> and <a href="https://podcasters.spotify.com/submit">Spotify</a>. <br>
|
||||
<br>
|
||||
Here's a few examples from around the internet, a mix of large + small news websites and forums: <br>
|
||||
<ul>
|
||||
<li><a href="https://www.theguardian.com/world/rss">The Guardian</a> </li>
|
||||
<li><a href="https://www.gamasutra.com/blogs/rss/">Gamasutra</a> </li>
|
||||
<li><a href="https://www.polygon.com/rss/index.xml">Polygon</a> </li>
|
||||
<li><a href="https://store.steampowered.com/feeds/news.xml">Steam</a> </li>
|
||||
<li><a href="https://www.gamedev.net/tutorials/rss/">GameDev.net</a> </li>
|
||||
<li><a href="https://www.nasa.gov/rss/dyn/chandra_images.rss">NASA's Chandra Mission</a> </li>
|
||||
<li><a href="https://www.temptalia.com/feed/">Temptalia</a> </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>what goes into an RSS feed? </h2><br>
|
||||
RSS files themselves are written in XML. They should contain the latest 10-15 entries along with things like their title, link, summary, date, and author. <br>
|
||||
<br>
|
||||
Blogging platforms like <a href="https://wordpress.org/support/article/wordpress-feeds/">WordPress</a> already take care of the RSS feed, but there's no shortage of third-party RSS creators on the internet. Since I have already written code to display + summarize my articles on the <a href="https://www.blessfrey.me/diary">diary</a> page, the 'latest' box in the diary's sidebar, and the 'news' box on the <a href="https://www.blessfrey.me/">index</a> page, I figure I can format the data one more time into an XML file. <br>
|
||||
<br>
|
||||
Here's truncated version of blessfrey.me's feed as an example (also available on <a href="https://pastebin.com/bbrVp58E">Pastebin</a>: <br>
|
||||
<br>
|
||||
<code><?xml version="1.0" encoding="utf-8"?></code><br>
|
||||
<code><rss version="2.0"></code><br>
|
||||
<code><channel></code><br>
|
||||
<code><title>blessfrey.me</title></code><br>
|
||||
<code><link>https://www.blessfrey.me/</link></code><br>
|
||||
<code><description>chimchooree's dev space</description></code><br>
|
||||
<code><language>en-us</language></code><br>
|
||||
<code><webMaster>chimchooree@mail.com (chimchooree)</webMaster></code><br>
|
||||
<code><item></code><br>
|
||||
<code><title>making an rss feed</title></code><br>
|
||||
<code><link>https://www.blessfrey.me/diary/entries//diary/entries/210318</link></code><br>
|
||||
<code><description>After a few months of quietly running my blog as practice, I want to start sharing my articles with ... </description></code><br>
|
||||
<code><pubDate>Thu, 18 Mar 2021 8:05 CST</pubDate></code><br>
|
||||
<code><guid>https://www.blessfrey.me/diary/entries//diary/entries/210318</guid></code><br>
|
||||
<code></item></code><br>
|
||||
<code></channel></code><br>
|
||||
<code></rss></code><br>
|
||||
<br>
|
||||
I'll explain each tag, but they are also described on the RSS Advisory Board's <a href="https://www.rssboard.org/rss-profile">Best Practices Profile</a>. There are more tags, too, so research documentation + examples to see what suits your website. <br>
|
||||
<br>
|
||||
<h3>XML declaration</h3><br>
|
||||
Identifies the document as XML and defines the version + character encoding. It's required and must be the first line. <br>
|
||||
<br>
|
||||
<h3>RSS</h3><br>
|
||||
The top-level element that defines version number. It's required. <br>
|
||||
<br>
|
||||
<h3>channel</h3><br>
|
||||
Nested within the RSS tags and describes the RSS feed. It's required. <br>
|
||||
<br>
|
||||
There's some tags nested within the channel. <code>Title</code>, <code>Link</code>, and <code>Description</code> are required. <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li><b>title</b> - defines the title. Mine is just my website name, but large websites may have multiple feeds. It's required. </li>
|
||||
<li><b>link</b> - defines the link to the channel. So, either your website or a specific area of your website. It's required. </li>
|
||||
<li><b>description</b> - describe the channel in a few words. I used my website's tagline. It's required. </li>
|
||||
<li><b>language</b> - defines the language, using a <a href="https://www.rssboard.org/rss-language-codes">RSS language code</a>. It's optional. </li>
|
||||
<li><b>webMaster</b> - provide the contact email + name for technical issues regarding the feed. It should look something like <code>example@example.com (Name McName). It's optional. </code> </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>item</h3><br>
|
||||
Nested within the channel. Each article will be defined with the item. <br>
|
||||
<br>
|
||||
There's some tags nested within the item. <code>Title</code>, <code>Link</code>, and <code>Description</code> are required. <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li><b>title</b> - defines the title of the article. It's required. </li>
|
||||
<li><b>link</b> - defines the link to the article. It's required. </li>
|
||||
<li><b>description</b> - summarize the article in one or two sentences. It's required. </li>
|
||||
<li><b>pubDate</b> - indicates the date and time of publication, conforming to the <a href="https://www.rssboard.org/rss-profile#data-types-datetime">RFC 822 Date and Time Specification</a>. Follow a pattern like Mon, 15 Oct 2007 14:10:00 GMT. </li>
|
||||
<li><b>guid</b> - A unique identifying string, which helps aggregators detect duplicates. Aggregators may ignore this field or use it in combination with the title and link values. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>how to make an RSS feed </h2><br>
|
||||
I'm generating the RSS every time I update my website. That way, it always exists on the server and can be served as a static file. If I used a template, the RSS file would not exist unless it was accessed. I'm not sure if that would be an issue and haven't experimented. <br>
|
||||
<br>
|
||||
Since Bottle is just Python, I can generate the file similar to how I format my articles into diary snippets, pages, and headlines. <br>
|
||||
<br>
|
||||
I'll share the main code, but the full code can be viewed on <a href="https://pastebin.com/E0PvNtbp">Pastebin</a>. <br>
|
||||
<br>
|
||||
<h3>code example </h3><br>
|
||||
def make_rss(): <br>
|
||||
loc = 'diary/entries/' <br>
|
||||
info = {'items': list_items(gather_and_sort(loc)[0:15])} <br>
|
||||
<br>
|
||||
# Return list of items <br>
|
||||
def list_items(articles): <br>
|
||||
f_name = "static/xml/blessfrey.xml" # the RSS file <br>
|
||||
loc2 = 'https://www.blessfrey.me/' <br>
|
||||
loc = 'diary/entries/' <br>
|
||||
loc3 = loc2 + loc <br>
|
||||
result = [] <br>
|
||||
<br>
|
||||
for article in articles: <br>
|
||||
path = loc + article <br>
|
||||
text = [] <br>
|
||||
a = [] <br>
|
||||
length = 0 <br>
|
||||
text = article2list(article, loc) <br>
|
||||
a.append(find_title(text)) <br>
|
||||
a.append(find_url(path)) <br>
|
||||
a.append(clean_tags(prepare_rss_summary(text, path))) <br>
|
||||
a.append(find_timestamp(text)) <br>
|
||||
result.append(a) <br>
|
||||
<br>
|
||||
clear_file(f_name) <br>
|
||||
f = open(f_name, 'w') <br>
|
||||
f.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + '\n') <br>
|
||||
f.write("<rss version=\"2.0\">" + '\n') <br>
|
||||
f.write("<channel>" + '\n') <br>
|
||||
f.write("<title>blessfrey.me</title>" + '\n') <br>
|
||||
f.write("<link>https://www.blessfrey.me/</link>" + '\n') <br>
|
||||
f.write("<description>chimchooree's dev space</description>" + '\n') <br>
|
||||
f.write("<language>en-us</language>" + '\n') <br>
|
||||
f.write("<webMaster>chimchooree@mail.com (chimchooree)</webMaster>" + '\n') <br>
|
||||
<br>
|
||||
for r in result: <br>
|
||||
f.write("<item>" + '\n') <br>
|
||||
f.write("<title>" + r[0] + "</title>" + '\n') <br>
|
||||
f.write("<link>" + loc3 + r[1] + "</link>" + '\n') <br>
|
||||
f.write("<description>" + r[2] + "</description>" + '\n') <br>
|
||||
code = r[1].replace(loc,'') <br>
|
||||
code = code.replace('/','') <br>
|
||||
f.write("<pubDate>" + format_rss_time(code) + "</pubDate>" + '\n') <br>
|
||||
f.write("<guid>" + loc3 + r[1] + "</guid>" + '\n') <br>
|
||||
f.write("</item>" + '\n') <br>
|
||||
<br>
|
||||
f.write("</channel>" + '\n') <br>
|
||||
f.write("</rss>" + '\n') <br>
|
||||
f.close() <br>
|
||||
<br>
|
||||
return result <br>
|
||||
<br>
|
||||
# Serve XML <br>
|
||||
@route('/static/xml/<filename:path>') <br>
|
||||
def serve_xml(filename): <br>
|
||||
return static_file(filename, root='static/xml', mimetype='text/xml') <br>
|
||||
<br>
|
||||
## Main ## <br>
|
||||
<br>
|
||||
if __name__ == '__main__': <br>
|
||||
make_rss() <br>
|
||||
run(host='127.0.0.1', port=9001) <br>
|
||||
<br>
|
||||
<h2>double-check </h2><br>
|
||||
The <a href="https://www.rssboard.org/rss-validator/">RSS Advisory Board</a> and <a href="<a href="https://validator.w3.org/feed/">W3C</a> have feed validation services that can check the syntax of Atom or RSS feeds. It's nice to check but don't feel pressured to meet all the recommendations if they don't suit your needs. <br>
|
||||
<br>
|
||||
<h2>double-check </h2><br>
|
||||
Now I have an RSS feed, available at <a href="/static/xml/blessfrey.xml">https:/blessfrey.me/static/xml/blessfrey.xml</a>. Feel free to use it if you prefer to read through an aggregator and contact me if there's technical problems. <br>
|
||||
<br>
|
||||
Last updated March 19, 2021 <br>
|
||||
<br>
|
@ -1,55 +0,0 @@
|
||||
<!--210610,200429-->
|
||||
<h1>skills aren't a manor; they're the DMV </h1>
|
||||
april 7, 2022<br>
|
||||
#gamedev #gamedesign #skill <br>
|
||||
<br>
|
||||
<h2>designing on autopilot </h2><br>
|
||||
Phases are necessary for skills to be reactive. For instance, take Blessed Purity: <i>Cure 2 poisons from target. Heal for 35 per poison removed</i>. 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: <a href="https://wiki.guildwars.com/wiki/Initial_effect">initial effect</a> -> main function (not sure if there's even a name for this) -> <a href="https://wiki.guildwars.com/wiki/End_effect">end effect</a>. 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. <br>
|
||||
<br>
|
||||
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. <br>
|
||||
<br>
|
||||
It's time to actually turn my brain on and design with diagrams. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>building the skill like a manor</h2>
|
||||
<a target="_blank" href="/static/img/ent/skillsarentamanor_SkillManor.png">
|
||||
<img src="/static/img/ent/skillsarentamanor_SkillManor.png" alt="(diagram: Imagine the entire skill is a manor. The main phase is the main building, while the initial and end phases are additional wings. Within each section are rooms (or keywords). The entry and exit point of the keyword room are conditional statements. The space between wings represents the arbitrary entry and exit points of phases.)">
|
||||
</a><br>
|
||||
If a skill was a manor, phases would be wings, keywords would be rooms, and doors would represent conditional statements. There are three main sections to stand in for the beginning, middle, and end. It makes sense if you don't really think about it. After all, the flow looks so clean and linear. <br>
|
||||
<a target="_blank" href="/static/img/ent/skillsarentamanor_SkillManorFlow1200.png">
|
||||
<img src="/static/img/ent/skillsarentamanor_SkillManorFlow1200.png" alt="(diagram: All initial keywords activate in order, the initial phase is complete, all main keywords activate, phase complete, same for end keywords and effect.)"></a> <br>
|
||||
<br>
|
||||
<h2>criticism </h2>
|
||||
The concept of a phase brings nothing to skills. In Blessfrey and even Guild Wars, "initial effect" and "end effect" are used more like conditions than integral structure. The majority of skills don't operate in phases anyway. <br>
|
||||
<br>
|
||||
Worse, my careless implementation runs every keyword sequentially, undermining any distinction phases had. There's zero difference between putting Cure in initial or in the first line of main. <br>
|
||||
<br>
|
||||
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. <br>
|
||||
<br>
|
||||
<br>
|
||||
It makes me wonder what a phase even is. I can't label the boundaries of the phase in the diagram because it's so arbitrary. Do skills need phases at all? <br>
|
||||
<br>
|
||||
Keywords already have all the structure they need built into them. Keywords lock their effect behind an entry condition (like curing a poison) and guard the exit with another condition (like a duration of 30 seconds). It would make more sense if end effect keywords instead listened for the resolution of given keywords, while all other keywords are free to fire off simultaneously. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>skills should feel like going to the DMV</h2>
|
||||
DMVs in my life have been all-day affairs of standing in lines that stretch around the building through the bad part of town, attended by only one service desk. Honestly, that's not too far off from my original skill design. I'm not referring to <i>those</i> DMVs, though. The new DMV in town is much more efficient, lets you sit as you wait, and (novel concept) has multiple service windows. That's a much better model for my skills. <br>
|
||||
<a target="_blank" href="/static/img/ent/skillsarentamanor_SkillDMV.png">
|
||||
<img src="/static/img/ent/skillsarentamanor_SkillDMV.png" alt="(diagram: The skill's DMV has an entry point that leads to the welcome kiosk where each keyword must register its trigger and exit cue. All keywords wait in the same waiting room. Whenever the DMV calls a trigger (like health below 33%), that keyword will be actively served by a clerk until satisfied.)"> </a><br>
|
||||
<br>
|
||||
Since my "DMV" will be a separate entity from the skill (basically an <a href="https://www.blessfrey.me/diary/entries/210402">event handler</a>), it can preserve its data as long as needed, even after the main skill script dies. Flow is also more controlled, since the skill cannot progress its own current state. <br>
|
||||
<br>
|
||||
As for flow, obviously, skills without triggers can fire off immediately. The DMV will connect to the <a href="https://www.blessfrey.me/diary/entries/210402">KnowledgeBase</a> and begin listening for any event topics that would 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 die quietly. <br>
|
||||
<br>
|
||||
Under the DMV model, the skill's flow becomes more circular. <br>
|
||||
<a target="_blank" href="/static/img/ent/skillsarentamanor_SkillDMVFlow1200.png">
|
||||
<img src="/static/img/ent/skillsarentamanor_SkillDMVFlow1200.png" alt="(diagram: Each keyword registers triggers and exit cues with the DMV. The DMV subscribes to the topics and listens for triggers and exit cues. A trigger is received and conditions are met, so the keyword becomes active. The keyword is applied. The removal conditions are met, so the keyword is freed. The DMV continues to listen until all keywords had their chance to activate.)"></a> <br>
|
||||
<br><br>
|
||||
<h2>superior design? hopefully </h2>
|
||||
Never thought I'd prefer the DMV, but you can learn design concepts from anywhere. This design is far more complex to implement, but it's the first design that allows me to build skills from conditional keywords that trigger simultaneously or in any particular order. I'll finally be able to add the skills I have in my head. It'll take a lot of time and work, but can't wait to get this up and running. <br>
|
||||
<br>
|
||||
Anyway, if you're doing anything on autopilot, especially designing the core mechanic of your game, stop immediately! A little foresight and I'd be leagues ahead by now. Or maybe not? Probably. <br>
|
||||
<br>
|
||||
<br>
|
||||
Last updated April 7, 2022
|
||||
<br>
|
@ -1,55 +0,0 @@
|
||||
<!--210610,200429-->
|
||||
<h1>skills aren't a manor; they're the DMV </h1>
|
||||
april 7, 2022<br>
|
||||
#gamedev #gamedesign #skill <br>
|
||||
<br>
|
||||
<h2>designing on autopilot </h2><br>
|
||||
Phases are necessary for skills to be reactive. For instance, take Blessed Purity: <i>Cure 2 poisons from target. Heal for 35 per poison removed</i>. 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: <a href="https://wiki.guildwars.com/wiki/Initial_effect">initial effect</a> -> main function (not sure if there's even a name for this) -> <a href="https://wiki.guildwars.com/wiki/End_effect">end effect</a>. 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. <br>
|
||||
<br>
|
||||
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. <br>
|
||||
<br>
|
||||
It's time to actually turn my brain on and design with diagrams. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>building the skill like a manor</h2>
|
||||
<a target="_blank" href="/static/img/ent/skillsarentamanor_SkillManor.png">
|
||||
<img src="/static/img/ent/skillsarentamanor_SkillManor.png" alt="(diagram: Imagine the entire skill is a manor. The main phase is the main building, while the initial and end phases are additional wings. Within each section are rooms (or keywords). The entry and exit point of the keyword room are conditional statements. The space between wings represents the arbitrary entry and exit points of phases.)">
|
||||
</a><br>
|
||||
If a skill was a manor, phases would be wings, keywords would be rooms, and doors would represent conditional statements. There are three main sections to stand in for the beginning, middle, and end. It makes sense if you don't really think about it. After all, the flow looks so clean and linear. <br>
|
||||
<a target="_blank" href="/static/img/ent/skillsarentamanor_SkillManorFlow1200.png">
|
||||
<img src="/static/img/ent/skillsarentamanor_SkillManorFlow1200.png" alt="(diagram: All initial keywords activate in order, the initial phase is complete, all main keywords activate, phase complete, same for end keywords and effect.)"></a> <br>
|
||||
<br>
|
||||
<h2>criticism </h2>
|
||||
The concept of a phase brings nothing to skills. In Blessfrey and even Guild Wars, "initial effect" and "end effect" are used more like conditions than integral structure. The majority of skills don't operate in phases anyway. <br>
|
||||
<br>
|
||||
Worse, my careless implementation runs every keyword sequentially, undermining any distinction phases had. There's zero difference between putting Cure in initial or in the first line of main. <br>
|
||||
<br>
|
||||
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. <br>
|
||||
<br>
|
||||
<br>
|
||||
It makes me wonder what a phase even is. I can't label the boundaries of the phase in the diagram because it's so arbitrary. Do skills need phases at all? <br>
|
||||
<br>
|
||||
Keywords already have all the structure they need built into them. Keywords lock their effect behind an entry condition (like curing a poison) and guard the exit with another condition (like a duration of 30 seconds). It would make more sense if end effect keywords instead listened for the resolution of given keywords, while all other keywords are free to fire off simultaneously. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>skills should feel like going to the DMV</h2>
|
||||
DMVs in my life have been all-day affairs of standing in lines that stretch around the building through the bad part of town, attended by only one service desk. Honestly, that's not too far off from my original skill design. I'm not referring to <i>those</i> DMVs, though. The new DMV in town is much more efficient, lets you sit as you wait, and (novel concept) has multiple service windows. That's a much better model for my skills. <br>
|
||||
<a target="_blank" href="/static/img/ent/skillsarentamanor_SkillDMV.png">
|
||||
<img src="/static/img/ent/skillsarentamanor_SkillDMV.png" alt="(diagram: The skill's DMV has an entry point that leads to the welcome kiosk where each keyword must register its trigger and exit cue. All keywords wait in the same waiting room. Whenever the DMV calls a trigger (like health below 33%), that keyword will be actively served by a clerk until satisfied.)"> </a><br>
|
||||
<br>
|
||||
Since my "DMV" will be a separate entity from the skill (basically an <a href="https://www.blessfrey.me/diary/entries/210402">event handler</a>), it can preserve its data as long as needed, even after the main skill script dies. Flow is also more controlled, since the skill cannot progress its own current state. <br>
|
||||
<br>
|
||||
As for flow, obviously, skills without triggers can fire off immediately. The DMV will connect to the <a href="https://www.blessfrey.me/diary/entries/210402">KnowledgeBase</a> and begin listening for any event topics that would 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 die quietly. <br>
|
||||
<br>
|
||||
Under the DMV model, the skill's flow becomes more circular. <br>
|
||||
<a target="_blank" href="/static/img/ent/skillsarentamanor_SkillDMVFlow1200.png">
|
||||
<img src="/static/img/ent/skillsarentamanor_SkillDMVFlow1200.png" alt="(diagram: Each keyword registers triggers and exit cues with the DMV. The DMV subscribes to the topics and listens for triggers and exit cues. A trigger is received and conditions are met, so the keyword becomes active. The keyword is applied. The removal conditions are met, so the keyword is freed. The DMV continues to listen until all keywords had their chance to activate.)"></a> <br>
|
||||
<br><br>
|
||||
<h2>superior design? hopefully </h2>
|
||||
Never thought I'd prefer the DMV, but you can learn design concepts from anywhere. This design is far more complex to implement, but it's the first design that allows me to build skills from conditional keywords that trigger simultaneously or in any particular order. I'll finally be able to add the skills I have in my head. It'll take a lot of time and work, but can't wait to get this up and running. <br>
|
||||
<br>
|
||||
Anyway, if you're doing anything on autopilot, especially designing the core mechanic of your game, stop immediately! A little foresight and I'd be leagues ahead by now. Or maybe not? Probably. <br>
|
||||
<br>
|
||||
<br>
|
||||
Last updated April 7, 2022
|
||||
<br>
|
@ -1,141 +0,0 @@
|
||||
<!--210218,210107-->
|
||||
<h1>python writes my skills for me</h1>
|
||||
march 4, 2021<br>
|
||||
#godotengine #json #python <br>
|
||||
<br>
|
||||
Similar to Magic: The Gathering cards, 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>
|
||||
last updated March 6, 2021 <br>
|
||||
<br>
|
@ -1,70 +0,0 @@
|
||||
<!--200806,201126-->
|
||||
<h1>my first game jam - #weeklygamejam </h1>
|
||||
september 3, 2020<br>
|
||||
#gamejam<br>
|
||||
<br>
|
||||
<b><a href="https://weeklygamejam.itch.io/">WeeklyGameJam</a></b> is a weekly theme-based game jam hosted through itch.io. It's fairly laid-back for a jam, giving you a full week's time, allowing for premade/stock assets and code, and being understanding towards late submissions. Most people make videogames, but any kind of game is allowed. At the end of the week, streamers will play and critique the submissions while the developers hang out in their chatrooms. <br>
|
||||
<br>
|
||||
<center><img src="/static/img/ent/SmallThingThatMakesThings.png" alt="(image: Key art of Elwell and Small Thing, buried in dogs)" width="500" height="223.77"></center> <br>
|
||||
<br>
|
||||
<h2>small thing that makes things</h2>
|
||||
<br>
|
||||
I participated in Week 85 under the theme Offspring, submitting my game on February 27, 2019. My game was Small Thing That Makes Things, an adventure platformer. You can play it on <a href="https://chimchooree.itch.io/small-thing-that-makes-things">itch.io</a>. <br>
|
||||
<br>
|
||||
You play as Hamish T. Elwell, the hero accountant of an overcrowded animal shelter, investigating the recent explosion of the local stray population. You can walk, jump on platforms, collect items, and chat with NPCs. There's multiple endings, depending on your choices. <br>
|
||||
<br>
|
||||
<h2>positives </h2>
|
||||
<br>
|
||||
For a week-made game, I think STTMT is pretty cute, and I'm pretty happy with it.<img src="/static/img/emo/star.gif" alt=":)"> <br>
|
||||
<br>
|
||||
I actually finished a game, and someone actually finished playing it on a stream. That's really cool, even if STTMT isn't all that good. The deadline forced me to make final decisions, complete features, and move on, and there's a lot of value in that. <br>
|
||||
<br>
|
||||
The short time-frame forced me to get around to every aspect of game development, many of which I had never done before. I had to learn how to export a Godot project, upload an HTML5 game to itch, and make sure the exported game was complete and playable. Lots of the features were first-times for me, too. I've never written code for platformer movements or moving cameras. This also was the first time I've really gotten branching and conditional dialog working in Godot, which was a skill I immediately applied to Blessfrey. <br>
|
||||
<br>
|
||||
<h2>mistakes</h2>
|
||||
<br>
|
||||
I recolored OPP's pixel art and lost the high contrast for the rock ledges. They blend into the rocky background, so you can't tell you can jump on them. I didn't even notice until <a href="https://www.twitch.tv/mrjoshuamclean">Joshua McLean</a> pointed this out during his stream. Having more eyes on your game is so important. <br>
|
||||
<br>
|
||||
Also the level design is just not interesting. I spent lots of time on the choices and adventure game aspects, while the platforming as an extreme afterthought. It's a game jam, though, what do you expect?<br>
|
||||
<br>
|
||||
I took the easy way out with animation. I might have learned more working from scratch, but modifying OPP's sprites to suit my character designs was way faster when I was already struggling to finish on time. <br>
|
||||
<br>
|
||||
<h2>screenshots + progression </h2>
|
||||
<center>
|
||||
<a target="_blank" href="/static/img/ent/SmallThingThatMakesThings_flatland.png">
|
||||
<img src="/static/img/ent/SmallThingThatMakesThings_flatland.png" alt="(image: Elwell and Small Thing in a jumble of dogs)" width="500" height="300.92">
|
||||
</a><br>
|
||||
Experimenting with Small Thing's summoning mechanic. In this version, the characters are just blocks with collision that can move around the flat, empty world with WASD. <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/chimchooree_weekly_game_jam.gif">
|
||||
<img src="/static/img/ent/chimchooree_weekly_game_jam.gif" alt="(gif: Elwell rides a broken-physics dog across the valley)" width="500" height="215.77">
|
||||
</a><br>
|
||||
The dog spawning physics was (and still is) really broken, so dogs go flying pretty frequently. It was reliable enough in this version to be used as a moving platform. <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/SmallThingThatMakesThings_rainingdogs.png">
|
||||
<img src="/static/img/ent/SmallThingThatMakesThings_rainingdogs.png" alt="(image: Elwell watches the rainfall of dogs from his window)" width="500" height="282">
|
||||
</a><br>
|
||||
Dogs rain down upon Elwell's animal shelter in the finished version. <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/SmallThingThatMakesThings_rainingdogs.png">
|
||||
<img src="/static/img/ent/SmallThingThatMakesThings_dialog.png" alt="(image: Dialog)" width="500" height="265.12">
|
||||
</a><br>
|
||||
Dialog between Elwell and his boss. <br>
|
||||
</center>
|
||||
<br>
|
||||
<h2>conclusion</h2>
|
||||
<br>
|
||||
If you're looking for a jam to jump into, WeeklyGameJam is a cute one to try. You aren't too rushed, you get to watch people play your game, you get useful criticism, and the community is pretty chill. The themes are always inspiring, too.<img src="/static/img/emo/heart.gif" alt="<3"> <br>
|
||||
<br>
|
||||
<h2>credits</h2>
|
||||
<ul>
|
||||
<li>coding and art by chimchooree</li>
|
||||
<li>Open Pixel Project (OPP) (animations & tiles, edited to fit my characters & palette) @ <a href="http://www.openpixelproject.com/">http://www.openpixelproject.com/</a></li>
|
||||
<li>Music track "forest" by syncopika under CC-BY 3.0 @ <a href="https://opengameart.org/content/forest">https://opengameart.org/content/forest</a> & <a href="https://greenbearmusic.bandcamp.com/album/bgm-fun-vol-5">https://greenbearmusic.bandcamp.com/album/bgm-fun-vol-5</a></li>
|
||||
<li>Bad ending image from Wikimedia, credit to Jon Sullivan @ <a href="https://tinyurl.com/y6oswx8v">https://tinyurl.com/y6oswx8v</a> (URL contains spoilers)</li>
|
||||
<li>SimpleJPC-16 Palette by Adigun Polack @ <a href="https://lospec.com/palette-list/simplejpc-16">https://lospec.com/palette-list/simplejpc-16</a></li>
|
||||
<li>pixel joy font by chimchooree @ <a href="https://fontstruct.com/fontstructions/show/1596262/pixel-joy">https://fontstruct.com/fontstructions/show/1596262/pixel-joy</a></li>
|
||||
<li>Tools: <a href="https://godotengine.org/">Godot Engine 3.0.6</a>, <a href="https://graphicsgale.com/us/">GraphicsGale</a></li>
|
||||
<li>Weekly Game Jam 85, "Offspring" theme @ <a href="https://itch.io/jam/weekly-game-jam-85">https://itch.io/jam/weekly-game-jam-85</a></li>
|
||||
</ul>
|
||||
<br>
|
@ -1,27 +0,0 @@
|
||||
My style
|
||||
Fushigi Yuugi
|
||||
Code Lyoko
|
||||
SMT
|
||||
Akira
|
||||
Kaiji
|
||||
Darker Than Black
|
||||
Hunter X Hunter
|
||||
K-On!
|
||||
Made in Abyss
|
||||
Mononoke
|
||||
Garden Sphere
|
||||
As Told By Ginger
|
||||
Monster High
|
||||
WITCH, Winx Club
|
||||
Nana
|
||||
Norn9
|
||||
OuHos
|
||||
Outlaw Star
|
||||
slayers
|
||||
Ranma 1/2
|
||||
Soul Eater
|
||||
Higurashi
|
||||
Sailor Moon
|
||||
Card Captor Sakura
|
||||
Little Witch Academia
|
||||
Jojo
|
@ -1,51 +0,0 @@
|
||||
<!--210527,210402-->
|
||||
<h1>common tropes from media </h1>
|
||||
december 10, 2020<br>
|
||||
#writing<br>
|
||||
<br>
|
||||
<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 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>arena/tournament arc</b> - Fable, Oblivion </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>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>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>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue