update
@ -1,18 +0,0 @@
|
|||||||
<!--210610,200429-->
|
|
||||||
<h1>adding a bleeding status effect in godot engine</h1>
|
|
||||||
march 10, 2022<br>
|
|
||||||
#mechanic #status-effect<br>
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<h2>out of the norm </h2><br>
|
|
||||||
RPGs are all about the stats that define their characters. The values of each stat are constantly being jostled around by buffs, debuffs, enchanted equipment, environmental effects, and perks. If you allow each <br>
|
|
||||||
<br>
|
|
||||||
<h2>when does a character become hostile? </h2><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><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"></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>
|
|
||||||
Last updated January 12, 2022
|
|
||||||
<br>
|
|
@ -0,0 +1,30 @@
|
|||||||
|
<!--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,12 +1,43 @@
|
|||||||
<!--220301,220501-->
|
<!--220301,220501-->
|
||||||
<h1>march 2022: demo skills </h1>
|
<h1>march 2022: demo skills, new game </h1>
|
||||||
april 1, 2022<br>
|
april 1, 2022<br>
|
||||||
#diary <br>
|
#diary <br>
|
||||||
<br>
|
<br>
|
||||||
<h3>tuesday, march 1 </h3>
|
<h3>thursday, march 3 </h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li>...I'll document this soon. </li>
|
<li>Adrenaline Rush demonstates working critical and attack rate increases; effects are properly removed at timeout </li>
|
||||||
|
<li>refactored highlight; it only uses control nodes as it always should have; data can be added and removed to the highlight </li>
|
||||||
|
<li>skillbar allows common skills to be equipped on a character's skillbar, no matter their job </li>
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
Last updated April 7, 2022 <br>
|
<h3>friday, march 4 </h3>
|
||||||
|
<ul>
|
||||||
|
<li>refactoring attack and movement, since move-to is wonky; attack no longer waits for a complete loop to realize it's out of range and should move to target </li>
|
||||||
|
<li>allow for UI windows to toggle </li>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
<h3>saturday, march 5 </h3>
|
||||||
|
<ul>
|
||||||
|
<li>Appraise adds floor item value to its highlight </li>
|
||||||
|
<li>added skills with an instant activation time </li>
|
||||||
|
<br>
|
||||||
|
<h3>sunday, march 6 </h3>
|
||||||
|
<ul>
|
||||||
|
<li>inventory items are highlightable </li>
|
||||||
|
<li>tweaked appearance of inventory UI </li>
|
||||||
|
<br>
|
||||||
|
<h3>saturday, march 19 </h3>
|
||||||
|
<ul>
|
||||||
|
<li>started drawing some new keyart for Blessfrey </li>
|
||||||
|
<br>
|
||||||
|
<h3>tuessday, march 29 </h3>
|
||||||
|
<ul>
|
||||||
|
<li>started seriously developing Lemonland, an action-oriented petsite </li>
|
||||||
|
<br>
|
||||||
|
<h3>thursday, march 31 </h3>
|
||||||
|
<ul>
|
||||||
|
<li>started digitizing the gdd for Lemonland. I started writing it probably around 2017. </li>
|
||||||
|
<br>
|
||||||
|
</ul>
|
||||||
|
Last updated April 8, 2022 <br>
|
||||||
<br>
|
<br>
|
||||||
|
@ -1,29 +1,49 @@
|
|||||||
<!--210610,200429-->
|
<!--220127,210708-->
|
||||||
<h1>???? </h1>
|
<h1>skills aren't a manor; they're the DMV </h1>
|
||||||
april 7, 2022<br>
|
april 7, 2022<br>
|
||||||
#demo <br>
|
#skill #redesign <br>
|
||||||
<br>
|
<br>
|
||||||
|
<h2>skills are unmanageable as is </h2><br>
|
||||||
|
The effect of a Blessfrey skill is broken into keywords and conditions. For example, Blessed Purity cures 2 poisons from target and heals for 35 per poison removed. Technically, it's a skill with the cure keyword and a conditional heal keyword. This way, "heal" code is reusable, and players can rely on "heal" skills to be consistent. <br>
|
||||||
<br>
|
<br>
|
||||||
<h2>my goals </h2><br>
|
Phases are necessary for skills to be reactive. For Blessed Purity, cure is first, and heal cannot activate until it received the outcome of cure. To achieve this, 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 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>
|
||||||
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>
|
<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>
|
Naturally, I had a lot of problems with the flow of the skill. 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 ran long before earlier keywords finished up. When I forced keywords to execute one at a time, I had projectiles that awkwardly persisted until an unrelated keyword timed out. Timing was unpredictable, and instead of implementing a third fix, I wanted to critically assess the internal structure of the skill. <br>
|
||||||
<br>
|
<br>
|
||||||
<h2>finding structure </h2><br>
|
|
||||||
I could release a goalless demo, 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>
|
<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>
|
<h2>building the skill like a manor</h2>
|
||||||
|
<center><a target="_blank" href="/static/img/ent/SkillManor.png">
|
||||||
|
<img src="/static/img/ent/SkillManor.png" alt="(image: diagram of a skill. 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.)" width="500" height="662">
|
||||||
|
</a></center><br>
|
||||||
|
It makes sense if you don't really think about it. After all, that makes the flow look clean and straight. <br>
|
||||||
|
<center><a target="_blank" href="/static/img/ent/SkillManorFlow1200.png">
|
||||||
|
<img src="/static/img/ent/SkillManorFlow1200.png" alt="(image: diagram of a skill. All initial keywords activate in order, the initial phase is complete, all main keywords activate, phase complete, same for end keywords and effect.)" width="500" height="80"></a></center> <br>
|
||||||
<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>
|
The concept of a phase brings nothing to skills. Even Guild Wars seems to use "initial effect" and "end effect" more like conditions than integral structure. The majority of skills don't operate in phases anyway. <br>
|
||||||
<br>
|
<br>
|
||||||
<h2>world and story </h2><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. Also, in general, keywords within the same phase run sequentially when that isn't necessarily my intention. It kind of invalidates the entire concept of phases, too. Sure, an end effect keyword is certainly called after an initial effect keyword, but in most versions of Blessfrey's skill.gd, the flow is identical when putting the same keywords one after the other into the main phase. <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>
|
<br>
|
||||||
<h2>ugly </h2><br>
|
It makes me wonder what a phase even is. I can't even define the boundaries of the phase in the diagram because it's so arbitrary. Do my skills need phases at all? <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>
|
<br>
|
||||||
Anyway, back to working on the demo! <br>
|
Keywords already have structure built into them. Keywords lock their effect behind an entry condition (like curing 1 or 2 poisons) and guard the exit with another condition (like bleeding lasting 30 seconds). It would make more sense if end effect keywords were replaced by keywords that trigger upon the completion of earlier keywords, while other keywords are free to fire off simultaneously. <br>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
Last updated January 12, 2022
|
<h2>skills should feel like going to the DMV</h2>
|
||||||
|
Most DMVs I've suffered through in my life have been all-day affairs of standing in lines that stretch around the building through the bad side of town, attended by only one service desk manned by a slow, error-prone clerk. Honestly, that's not too far off from my original skill design. I'm not referring to <i>those</i> DMVs, though. The DMV that's closest to my new location is much more efficient, lets you sit as you wait, and has (novel concept) multiple service windows. That's a much better model for my skill. <br>
|
||||||
|
<center><a target="_blank" href="/static/img/ent/SkillDMV.png">
|
||||||
|
<img src="/static/img/ent/SkillDMV.png" alt="(image: illustration of a skill. 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.)" width="500" height="351"></a></center> <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>), the fate of the skill is less important when it comes to data it holds inside. Flow is also more controlled, since the skill itself cannot progress its own current state. <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 could trigger the keywords. Once a keyword's conditions are met, it will become active and be applied to the target. The DMV also sets up a timer for its duration or listens for exit cues to know when to remove the keyword. Some keywords will never activate, but they will be freed once they had their chance. If Blessed Purity cures 0 poisons, heal will receive a sad "0" and free quietly. <br>
|
||||||
|
<br>
|
||||||
|
Under the DMV model, the skill's flow becomes more circular. <br>
|
||||||
|
<center><a target="_blank" href="/static/img/ent/SkillDMVFlow1200.png">
|
||||||
|
<img src="/static/img/ent/SkillDMVFlow1200.png" alt="(image: diagram of a skill. 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.)" width="500" height="180"></a></center> <br>
|
||||||
|
<br><br>
|
||||||
|
<h2>superior design? hopefully </h2>
|
||||||
|
Nothing's ever going to be perfect, but taking time to plan and be intentional gives a better outcome. Never thought I'd prefer the DMV, but you can learn design concepts from anywhere. <br>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
Last updated April 7, 2022
|
||||||
<br>
|
<br>
|
||||||
|
@ -1,32 +1,49 @@
|
|||||||
<!--220407,220505-->
|
<!--210610,200429-->
|
||||||
<h1>defining the major jobs in blessfrey </h1>
|
<h1>skills aren't a manor; they're the DMV </h1>
|
||||||
february 10, 2022<br>
|
april 7, 2022<br>
|
||||||
#game-design #jobs<br>
|
#skill #redesign <br>
|
||||||
<br>
|
<br>
|
||||||
|
<h2>skills are unmanageable as is </h2><br>
|
||||||
|
The effect of a Blessfrey skill is broken into keywords and conditions. For example, Blessed Purity cures 2 poisons from target and heals for 35 per poison removed. Technically, it's a skill with the cure keyword and a conditional heal keyword. This way, "heal" code is reusable, and players can rely on "heal" skills to be consistent. <br>
|
||||||
<br>
|
<br>
|
||||||
<h2>the basics </h2><br>
|
Phases are necessary for skills to be reactive. For Blessed Purity, cure is first, and heal cannot activate until it received the outcome of cure. To achieve this, 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 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>
|
||||||
RPG classes are called "jobs" in Blessfrey. Characters will have a primary job, but they will have limited access to other jobs through multiclassing. It's similar to Final Fantasy Tactics. I think it's cute to call secondary job a "side job." <br>
|
|
||||||
<br>
|
<br>
|
||||||
<h2>job requirements </h2><br>
|
Naturally, I had a lot of problems with the flow of the skill. 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 ran long before earlier keywords finished up. When I forced keywords to execute one at a time, I had projectiles that awkwardly persisted until an unrelated keyword timed out. Timing was unpredictable, and instead of implementing a third fix, I wanted to critically assess the internal structure of the skill. <br>
|
||||||
Guild Wars and Magic: The Gathering are my main inspirations for Blessfrey's game mechanics. I had trouble getting into other MMORPGs after Guild Wars. Others have so many mechanics, classes, levels, consumables, and levels of equipment that they begin to feel so chaotic, random, and unlearnable, or (even worse) the meta's so obvious that players only use a 1% of the content doesn't matter because there's a
|
|
||||||
, and all your successes are owed to time, micro-transaction money, and RNG. Guild Wars
|
|
||||||
because they are never as tight in their design or allow player skill to shine as often. In contrast with standard MMOs with more class ArenaNet self-labels their game as a CORPG (competitive online role-playing game), so it's not surprising it plays so differently. Guild Wars, especially before expansions started coming out. <br>
|
|
||||||
<br>
|
<br>
|
||||||
<h2>lucrest, the mundane </h2><br>
|
|
||||||
Lucrest is more or less representative of a typical town, with a shopping center, school, church, a neighborhood, and some natural beauty. Functionally, it will have story events and side quests, but it will mainly serve as the hub for recovering and gearing up between dungeon crawls. I think of it as Torchlight a lot. (At least, the hub from the first game.) Artistically, it's an opportunity to work with what's familiar to me. <br>
|
|
||||||
<br>
|
<br>
|
||||||
I think it's a chance to do something a little different in a game, too. I learn lots of interesting little tidbits of Japanese culture through Japanese media, but I feel like my day-to-day life and childhood rarely come up in games with American settings. Some games do have detailed settings, like Bloodlines's L.A, Mafia II's generalized 1950s east coast, and all the Night in the Woods's, Life is Strange's, and David Cage games out there, but America is so patchwork that I enjoy them for their cultural differences as much as I do for their cultural simularities. <br>
|
<h2>building the skill like a manor</h2>
|
||||||
|
<center><a target="_blank" href="/static/img/ent/SkillManor.png">
|
||||||
|
<img src="/static/img/ent/SkillManor.png" alt="(image: diagram of a skill. 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.)" width="500" height="662">
|
||||||
|
</a></center><br>
|
||||||
|
It makes sense if you don't really think about it. After all, that makes the flow look clean and straight. <br>
|
||||||
|
<center><a target="_blank" href="/static/img/ent/SkillManorFlow1200.png">
|
||||||
|
<img src="/static/img/ent/SkillManorFlow1200.png" alt="(image: diagram of a skill. All initial keywords activate in order, the initial phase is complete, all main keywords activate, phase complete, same for end keywords and effect.)" width="500" height="80"></a></center> <br>
|
||||||
<br>
|
<br>
|
||||||
This is due to an urban vs rural divide, but it's also a regional divide. Writers favor other regions heavily, then limit the South to Louisiana and Florida, which are both geographically southern but culturally divergent with stronger ties to France and Spain respectively than the English derivative Deep South. Wikipedia agrees. In their <a href="https://en.wikipedia.org/wiki/Category:Video_games_set_in_the_United_States_by_state">list of games by state</a>, California, Alaska, the West, and the D.C. metropolitan area dominate American representation. It's not like the Deep South is the most romanticized setting, but there's only 1 <a href="https://en.wikipedia.org/wiki/Wikipedia:Notability">notable</a> game in Alabama for me to compete with, and it's a sports game. <br>
|
The concept of a phase brings nothing to skills. Even Guild Wars seems to use "initial effect" and "end effect" more like conditions than integral structure. The majority of skills don't operate in phases anyway. <br>
|
||||||
<br>
|
<br>
|
||||||
Really, I just want to put the things meaningful to me and my world in this game, good and bad. Looking around, though, it seems like a little portal into suburban Alabamian life could be novel. <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. Also, in general, keywords within the same phase run sequentially when that isn't necessarily my intention. It kind of invalidates the entire concept of phases, too. Sure, an end effect keyword is certainly called after an initial effect keyword, but in most versions of Blessfrey's skill.gd, the flow is identical when putting the same keywords one after the other into the main phase. <br>
|
||||||
<br>
|
<br>
|
||||||
<h3>what's there to do in alabama? </h3>
|
It makes me wonder what a phase even is. I can't even define the boundaries of the phase in the diagram because it's so arbitrary. Do my skills need phases at all? <br>
|
||||||
This isn't my first iteration of game world that's more of a personal diary for things I encountered growing up. I spend a lot of my middle school years filling out a GDD for a game named after the fictional neighborhood it was set in. The protagonist was Walker, a girl who she ripped out all the pages of her diary in a moment of grief and set them to the wind. All you did was walk around, watch events, collect diary pages, and do some basic puzzle-solving. There's an entire subdivision to explore, each neighborhood with its own flair and obstacles. As you collect diary pages, you unlock a clearer image of who Walker is and why she was sad. At the time, I was inspired by Tale-of-Tales, especially The Path and The Graveyard, but similar genres have since emerged like walking simulators and whatever those Slenderman collect-all-the-pieces-of-paper games were. The only remnant I have left of the game is an old <a href="https://sixthview.tumblr.com/">tumblr blog</a>. If only Unity went free earlier; I would totally be sharing an broken demo instead of a moodboard with a broken theme. <br>
|
|
||||||
<br>
|
<br>
|
||||||
<center><img src="/static/img/ent/sixth_view.png" alt="(image: a screenshot of my old game project moodboard. There's flowers, home gardens, fortune-tellers, cute girls, fairy rings, polaroid cameras, and meandering prose about Walker's encounters in her neighborhood. Overall, the writing was meant to evoke Kafka or Sisyphus, like how she watches a boy recreate a Michelangelo masterwork in sidewalk chalk, only for the first drop of rain to fall on it as he finishes the last stroke. Deep stuff.)" width="500" height="551.19"></center> <br>
|
Keywords already have structure built into them. Keywords lock their effect behind an entry condition (like curing 1 or 2 poisons) and guard the exit with another condition (like bleeding lasting 30 seconds). It would make more sense if end effect keywords were replaced by keywords that trigger upon the completion of earlier keywords, while other keywords are free to fire off simultaneously. <br>
|
||||||
<br>
|
<br>
|
||||||
Sixth View's gameplay is really basic, the narrative is really linear, and a lot of it is middle school cringe, but there's a tiny glimpse of Lucrest in there. Like Sixth View neighbors, Blessfrey townspeople are going to be drawing with sidewalk chalk, having yard sales, playing Concentration 64 and Big Booty, painting clear nail polish over chiggers, avoiding water serpents in the brook, doing Bible drills, folding fortune-tellers, finding golden orb weavers in their gardens, wondering why pairs of shoes were hung over telephone lines and trees, wearing clover crowns, making sock monkeys, blowing dandelion puffs, finding arrowheads in the river, four square, cutting through cotton fields, and all the stuff I think of when I think of home. <br>
|
|
||||||
<br>
|
<br>
|
||||||
Last updated January 16, 2022
|
<h2>skills should feel like going to the DMV</h2>
|
||||||
|
Most DMVs I've suffered through in my life have been all-day affairs of standing in lines that stretch around the building through the bad side of town, attended by only one service desk manned by a slow, error-prone clerk. Honestly, that's not too far off from my original skill design. I'm not referring to <i>those</i> DMVs, though. The DMV that's closest to my new location is much more efficient, lets you sit as you wait, and has (novel concept) multiple service windows. That's a much better model for my skill. <br>
|
||||||
|
<center><a target="_blank" href="/static/img/ent/SkillDMV.png">
|
||||||
|
<img src="/static/img/ent/SkillDMV.png" alt="(image: illustration of a skill. 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.)" width="500" height="351"></a></center> <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>), the fate of the skill is less important when it comes to data it holds inside. Flow is also more controlled, since the skill itself cannot progress its own current state. <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 could trigger the keywords. Once a keyword's conditions are met, it will become active and be applied to the target. The DMV also sets up a timer for its duration or listens for exit cues to know when to remove the keyword. Some keywords will never activate, but they will be freed once they had their chance. If Blessed Purity cures 0 poisons, heal will receive a sad "0" and free quietly. <br>
|
||||||
|
<br>
|
||||||
|
Under the DMV model, the skill's flow becomes more circular. <br>
|
||||||
|
<center><a target="_blank" href="/static/img/ent/SkillDMVFlow1200.png">
|
||||||
|
<img src="/static/img/ent/SkillDMVFlow1200.png" alt="(image: diagram of a skill. 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.)" width="500" height="180"></a></center> <br>
|
||||||
|
<br><br>
|
||||||
|
<h2>superior design? hopefully </h2>
|
||||||
|
Nothing's ever going to be perfect, but taking time to plan and be intentional gives a better outcome. Never thought I'd prefer the DMV, but you can learn design concepts from anywhere. <br>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
Last updated April 7, 2022
|
||||||
<br>
|
<br>
|
||||||
|
@ -1,12 +1,31 @@
|
|||||||
<!--220301,220501-->
|
<!--220301,220501-->
|
||||||
<h1>march 2022: demo skills </h1>
|
<h1>april 2022: the flowers bloomed </h1>
|
||||||
april 1, 2022<br>
|
april 1, 2022<br>
|
||||||
#diary <br>
|
#diary <br>
|
||||||
<br>
|
<br>
|
||||||
<h3>tuesday, march 1 </h3>
|
<h3>monday, april 4 </h3>
|
||||||
|
<iframe width="500" height="218" src="https://www.youtube.com/embed/eN5mG_yMDiM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||||
<ul>
|
<ul>
|
||||||
<li>...I'll document this soon. </li>
|
<li>we've waited through 4 years of silence, 6 years since the last album, military service, Burning Sun, Seungri's retirement, Taeyang's marriage and birth of his first child, the forced cancellation of their tour due to COIVD, TOP's termination with the label and founding of his own label. Big Bang finally came back, even if it feels more like a good-bye. I appreciate other directors, so I almost forgot G-Dragon is the more masterful director in KPOP after such a long silence. The video says everything in 3 minutes. Still Life blows everything away. So much joy. </li>
|
||||||
|
<li>it means everything that Seungri's battered chair is present beside the others (G-Dragon's chair is the director's chair) and all five of the lines in the final logo are intact. They aren't cowards and didn't abandon him, even if the media, corrupt courts, and public opinion did. I wish I had that level of strength and loyalty. </li>
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
Last updated April 7, 2022 <br>
|
<h3>saturday, april 9 </h3>
|
||||||
|
<ul>
|
||||||
|
<li>starting to get my bearings with Angular after spending an hour on tutorials before bed the past two days. </li>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
<h3>sunday, april 10 </h3>
|
||||||
|
<ul>
|
||||||
|
<li>finally got a new refrigerator installed. The old one's been broken, and new ones have been delayed. I missed ice cream. ;-; Delivery got rescheduled to during church, though, which was disappointing. </li>
|
||||||
|
<li>implementing the CSS grid with Angular...so hard. </li>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
<h3>monday, april 11 </h3>
|
||||||
|
<ul>
|
||||||
|
<li>painted my nails OPI Quest for Quartz - it's from the XBOX collection. The quality is way below normal OPI nail polish, it's so packed with glitter that it's difficult to get a smooth finish with but somehow still looks matte once dry, and the color has as strange undertones as first-party 360 controllers. Flattering pinks and nudes are difficult colors for me to find, though, and this nearly nude mauvey medical pink is perfect. Yay, finally a nude polish that doesn't turn orange or brown on me...thanks, Microsoft? </li>
|
||||||
|
<li><a href="../220505">documenting my process so far</a> and making a nested grid within yesterday's grid </li>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
Last updated April 12, 2022 <br>
|
||||||
<br>
|
<br>
|
||||||
|
@ -0,0 +1,140 @@
|
|||||||
|
<!--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>
|
After Width: | Height: | Size: 134 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 202 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 225 KiB |
After Width: | Height: | Size: 190 KiB |