October Postmortem


Postmortem

I started the Devtober challenge with the intention of doing daily devblog posts. But, two weeks in, I stopped doing daily posts, because I grew self-conscious about the volume, and I didn’t like that the daily posts were causing me to split my attention between demo and main game. Nevertheless, I continued working on my project every single day. I decided to focus primarily on the demo, so that I could apply feedback from it back to the main game in a longer development process.

What went right

  1. Continued usual development rhythm
  2. Digital drawing and painting is always satisfying
  3. I submitted a demo for feedback!

Near-Daily Dev was Already my Habit

There weren’t any major changes to my routine. I had a checklist in my notebook of what to work on. I tackled a few of those items per day. Code, test, paint, or fiddle with values in the inspector, then check off things that are finished. My only change was that instead of occasional days off, I did no days off.

I did spend longer work days and refused opportunities for social events to fit with the challenge (or, when I dropped the challenge initially, just fit with having a woof demo up by the end of the month). I don’t think this was necessarily a good idea for mental health, however, and I definitely would like to make time to actually play video games rather than just do dev stuff.

I think I improved my animal illustration and digital painting skills significantly this month. The current climate for online digital artists is pretty tense right now, so I haven’t been posting much online. It’s also more of a struggle to find reference material to inform my studies and illustrations, as it now takes longer to find real photos of real nature for learning purposes in web searching. Still, it’s very satisfying to use my pen tablet, place each stroke myself, and keep refining until things look close enough to the way I intended. There are improvements in my wolf anatomy to the point that there’s a pretty obvious difference (to me, anyway) between wolves I drew at the beginning of the month and the end, because I went through so many rough sketches to refine my understanding. It’s to the point that my initial images for the wolf template (and patterns) are no longer up to my standards, which is fine because I can promise a new, improved version for the final game.

What went wrong

  1. I underestimated my internal dependencies
  2. I underestimated the quality of the code for the feature I started out trying to demonstrate
  3. There wasn’t time to make all of the assets I wanted to make for the quality I intended

Dependencies and Difficulties with Export

Some of this was engine related: the dependency checker in the export dialog only looked for scene dependencies, not script dependencies (a holdover from older versions when GDScript had no class_name keyword). Some of this was my realizing the costs of using singletons to hold game state, because it tightly couples code in a way that is difficult to disentangle if I am trying to exclude irrelevant code and assets. This is not a problem for the final game because a lot of gameplay code in a complex strategic system may be coupled together by design (more ways for different systems to interact with each other to make a deep whole), but it’s a stumbling block for a slice meant to demonstrate one system in isolation.

I am pleased that I was able to find a solution to hard dependency issues on short notice, but it still took a full day to do my rewrites, having me miss my soft deadline to post a demo by Halloween.

Untested Code

This was an issue because new code I had written for the main game wasn’t being tested appropriately (because its only consequences were cosmetic). The demo exposed that much of this code wasn’t working as expected, because combat-statistic-affecting traits were no longer present and no longer taking my attention away. It can feel faster to just add and add and add code, even adding features on a whim, but lacking the discipline to make sure code was properly tested before moving onto the next thing was a recipe for frustration later. I dusted off my rarely-used unit testing framework to help me get out of trouble when I needed it, but a balance still needs to be found between the tedium of boilerplate to stub all my dependencies and related slowdowns and the risk of including untested code.

Asset Crunch

There isn’t enough time to do all the art you want to include in a game. There isn’t ever enough time. Even though I was able to allocate entire days to just digital painting and technical art, a lot of pieces I wanted to include were either cut or included as unfinished. I reused the same moon from my title screen painting layer multiple places because I couldn’t paint bespoke assets for each place, and had to leave out other particle animations I was developing because they weren’t finished, either.

I even started composing some music that I was going to use in the demo, too. I came up with a simple instrumental texture that I thought would convey a “wolves at night” theme musically. But, because this was a lower priority than the art and critical bugs, it didn’t get finished, and I had to hide the corresponding volume controls at the last minute.

Takeaways for the Future

Freeze the Feature List

A.k.a. “New Features Have a Cost”, and that cost is months of real time to do them properly. This isn’t just the code, it’s content to support the code, tools to support designing the content, integrations between content and other code, as well as assets. All of these take real time to be produced, and the larger the project gets, the more nontrivial these supporting elememnts become.

I’m going to be more reactive about adding features in response to player feedback, and leave alone my ideas for features that I want. I don’t have enough experience anticipating player desires to make “I didn’t even know I wanted that!” features, for the time being (my existing hunches about those have not been tested). From this point forward, my feature list is soft-frozen: only the ones most critical to the genre will be added. Every feature not part of this critical list I intend to add should solve a real problem that a player has approached me with.

Go Back to Using Artist Sites

and get feedback on visuals before I commit a lot of time to working on code. I haven’t posted to gallery sites in almost a decade, largely because of social anxiety but also because I spent too much time scrolling through art and not enough time making it, but now that I’m older and wiser I think I could put some boundaries around it and find a balance. I’m going to start fresh with a new username, though. The deviantArt account I made in the late 2000’s can remain, untouched, as a time capsule to the artist I was before I learned to make games, with no links between them.

Do Copy Writing Well in Advance

“Copy” is the text that goes on the demo page, in devblogs, etc. Basically, the rush at the end to fix export issues led to a kind of exhaustion where it’s hard for me to remember what I wanted to demonstrate and how I wanted to present it in a way that would appeal to strangers who have never seen this. I always procrastinate this part until I am no longer excited about my project and can’t think of anything to say, whereas if I had done it earlier in the process where what I intended to direct players towards was fresher in my head (before being crowded out by ugly behind-the-scenes details), I would have a stronger page and submission. In short, the advice: “Make it work. Then, make it pretty,” isn’t quite correct. For a visuals demo, make a pretty page first, and maybe some fake screenshots. Then make it work.

Commits for the month

Putting this at the end because it’s trivia, but I’m sharing my commit messages from the whole month.

in reverse-chronological order (clipped output of git log --oneline):

82954fa More dependency injection. NOTE: revert this commit later and put each one under ONE static var, probably in the main demo script.
6be9e21 Do similar dependency injection for FaunaColors
70548ee Add injectable dependency to PatternsFromGenetics and set it to new demo main scene export
ee0ca8e Add exports for StaticData objects in isolation to demo
702a8ea Add methods to Fauna and UserFaunaSanctuaryStorage for storing data without the latter depending on the former (relevant for demos) and add deprecation warnings to methods that need to be removed.
eb1f425 Fiddle with export templates and feature tags. Export kind of works, but there are problems and this probably can't be posted (not to mention it's requiring nearly all of the project's files, which is not acceptable
c68e7e7 Rework textures and sprite on back to menu button. there is a moon now, and stars light up on hover
6ea89c8 Make buttons in the demo theme opaque
f9b2c39 Make pretty starmap backgrounds with subtle animation for text popups
c9965a3 It doesn't look like the demo is getting audio anytime soon, so make the particle animation on main menu a little faster
5721075 Add star background to main menu panels
2187f7c Add export to prevent in-menu lag spikes with web export
7d97dae Add painted title graphic and update boot splash and main menu
c50fb8c Add moon graphic and add to loading screen
a259a20 Add background assets to loading screen and switch on for testing animation
904e95d Replace display from password button with PrettyCustomButton. more configuration required
eee81a4 Display: change back button to PrettyCustomButton (more configuration required later)
1e3f5bf Change buttons in column scene used in compare to be PrettyCustomButton. More visual configuration is required
d477aa6 Update submenu colorizer shader to use params from PrettyCustomButton. Actual materials need a little bit more configuration (but enable/disable works)
79156a3 Adjust sorting of fauna buttons to use raw ids
cd94a15 Add a paw print texture for a particle emission
bb204d4 Add pretty button parameter and lerping logic: disabled_amount
d4d701e Set more panel params in Display to separate password entry/display from the rest (and have a cancel method, too
d21236a Add a wood grain texture for layering with certain buttons. Buttons and shader need more configuration, current appearance looks "focused".
b184d74 Replace base buttons in Inherit with pretty buttons. Some configuration still required
2e625d5 Set up audio player nodes to go to correct buses
2be6338 Compare screen: freshen up consistency of no-selected behavior and selection toggle behavior
a062e4c Fix crashes and issues with Compare screen and switch on
d430be4 Fix selected panels being shown/hidden inappropriately on fauna buttons
2f6dd5a Add some assets for panels behind fauna (disps and buttons) and gradients behind sub-screens (for lack of illustrated assets to go there)
be41ebb Add rules for image use (to be popped up when an image is saved). Not hooked up yet. Add the url and implement linking behavior when the demo has a webpage
385ef89 Add some data types to selected panels to prepare for refactor
dc37929 Make pressed color changes more responsive in wolf demo
1493f82 Make colors slightly more vivid in wolf demo
611f988 Make buttons prettier with new assets and some code reactions
18fe810 Add a new button scene type called PrettyCustomButton which has shader-param-setting methods for reacting to focus, hover, and pressed, and emits a different signal (all pressed animations are finished) intended for use for scene transitions. Implement this button in illustration demo (though it will eventually be used for the game itself) with default textures
8709418 OK, new folder for the component assets then. Get them moved and backed up
0d625a0 Make first attempt at backing up the new leaf assets
2f95633 Adjust vector amounts of colors to make vivid colors easier to achieve through selective breeding
7d73ad4 Add main menu illustration to demo background
e394043 Adjust pairing grade and maximum allowed similarity thresholds to make heterozygosity the more important factor in the calculation
85da3ec Rewrite handling of lineart mixing in shader to better handle big contrasts between a light main color and dark major pattern color and get rid of the halo on the outside of the image
9ba203e Put more information in tools and get probabilities (for current pattern design) in a more balanced state
b79ba38 Put an alternate way of getting names into the tool (without the editor part) and put outcomes into a consistent order
29a5c7a Probability calculation and display now technically works
9e9999f Modify the probabilities tool to only calculate probabilities and hide sheet editor stuff (out of scope for current milestone, LibreOffice is sufficient for this step). Fix some bugs (but more to come, still doesn't run yet).
a5de8cb Fix bugs in genetic outcome tables where extra data was being written to scores table and gene/outcome data for early tables was getting overwritten with integer data from later tables due to a math error
09c6eec Reduce the probabilities for melanism and leucisticism to make them more special (and less annoying when trying to breed for solid colors). Still in demo datapack.
8d7f086 Attempt to hook up probabilities calculation and disable editor parts
af91454 Implement incrementing for all probability calculations and access of table displays, fixing current warnings
890ec4c Add some gui functionality
d1da875 Implement more UI code for the tool and start hooking things together (validation/calculation)
e3aadd7 Add a script for displaying region-wide probabilities
cc6df70 Add code to collect table nodes and validate the presence of all expected tables (not quite finished yet, completeness check still missing though duplicate checks are there) and pass outcome names from the first column (which aren't otherwise used in creating the datapack) elsewhere. Probability display code isn't fully written yet, but it would be better to show outcome names there than meaningless raw numbers.
cfd6f45 Flesh out tool a bit, add code for generating the genomes, accessing result computation, and putting results into a data object that will tally up the outcomes (the actual tally has not been implemented). Other scenes have been added to be instanced on-demand for purposes of the tool
3db73b3 Add more scene content to genetic tables tool
57ac141 Begin working on scenes for an editor tool. Editor uis have a layout, no functionality yet
1a379e7 Add optional parameter to ResourceFromCSV.init_from_csv_file(). Some time in the distant future, this is going to support mod loading in the live game, but for the time being, it's going to support the genetic outcome scores editing tool I'm about to make.
766b559 Add goodies to compare and columns scenes (mostly copied from others)
d63f4cb Change sub-menu to 2-column layout
c11053e Add more content to Compare screen (not finished yet)
4fd76df Add a rename fauna button with implementation in UserFaunaStorage
c3552f1 Change pattern percentages in advanced display to have a sign (negative for not meeting the display threshold, positive for meeting it)
901422d Fauna deletion and management: correct oversight (that fauna of different data packs have different genome sizes) and make deletion functional now? (for small sanctuary sizes, at least)
bb65a00 Move buttons between scenes (instead of having multiple copies of lists of buttons). May be some inconsistencies for a while as bugs show up.
af325f3 Add a favorite button in Display sub-scene. Marking a fauna as favorite doesn't do anything yet, but it should be written in the data.
857a7a6 Implement copy-on-write for fauna storage with backup management
6ddd06d Fixup enabling advanced settings
8f162c1 Allow a way to back out of the sub-menu back to the main menu, where the settings menu can be accessed once again
7c07664 Stop being cute with the one-shot button connections and just connect every button in Inherit to a toggle method, which cleans up the inconsistency bugs
3033e45 Fix more Genome related bugs. Stop using the size of the data arr, it's not accurate! (when number of genes is not divisible by 8)
871e820 Fix more password bugs (where restoring passwords wasn't getting reciprocal data from created ones)
60ce7ec Address bugs with creating/reading passwords (after non-divisible-by-eight gene numbers implemented)
8254ac5 clean up extracted code in information sub-scene, make it reusable in other screens of the demo
b5cf5fe Set up new "Compare Fauna" screen for illustration demo
95838b0 Spin off detailed information display into sub-scene
88fb6ed Implement basic info display
9352a41 Add Settings panel and Settings button to main menu. Add one setting for background volume (will be used when music is implemented) and one setting for showing advanced information (currently the default, basic information and actual functionality needs to be added later), with data being saved in PlayerSettings.
baedf33 Display pattern and hidden color information
7506697 Begin adding folder colors for organization
0737b62 Add sub-menu quit button functionality
c7633f1 Add placeholder filling and forward/back buttons to Display
8a109e6 Use FaunaData as glue for Inherit screen as well, and do all necessary hook-ups
b596869 Add assets and coloration to sub-menu buttons
833b078 Implement back-and-forth between main scene and Display subscene with fauna data and add and delete signals
cb23417 Add more precise signals to UserFaunaStorage to allow for smarter UI updates
c626a13 Data caching: create class to hold data because this is going to go in main scene (to avoid duplication)
0c7d134 Separate out the generation signal from the loading finished signal so that there isn't really long lag between scenes (also disable the long animation temporarily, for developer use)
73bf934 Fix saving fauna image
0758ed9 Add a visibility notifier in FaunaIconInList so that colors/patterns aren't computed until needed, and cache some data (so that additional allocations don't happen when displaying). The cached data and notifier isn't used yet.
5ca6a1d Display information about melanism and leucisticism (fixing the exposed bugs), fix exposed bug about display ordering not matching up with the section it was numbered for, and adjust the intensity of color genes to be higher (though less so for genes in the orange range) so that highly saturated colors are once again possible. Changes to color vector genes only apply to the demo, for now.
9497660 Add informational display of gene information (only works for color genes for the time being)
553a38c Make sure extra-melan or extra-leuc scores fit in the match block for accurate application of melanism/leucisticism
5aec718 Fix shader param setting bugs, which prevented fauna from displaying consistently
c35afcc Add genetic color information displays to display scene in new demo. Not implemented yet
4d65eb4 Add back buttons to illustration demo sub-scenes
25dd54a Color determination fix: read nominal color genes correctly after naming convention was applied, allowing lightness and darkness to apply once again!
346e4ea Fix Genome math to work when inheritance data isn't cleanly divisible along byte lines
4fc7bbe fix the color math for new shader
db5ce42 Illustration demo: get out of loading screen lock and be able to see the generated fauna
ca0c132 Reserve an Operation type for melanism/leucisticism genes. In addition to preventing hardcoding, also lets the modifier be localized to a specific color
87738d0 Oops, there in fact were more bugs with applying ordering. Should be fixed now, seems to order patterns from a couple different genome types better
ce69f0b Add melanism/leucisticism genes/traits to limited datapack (because the hardcoding checks for that, apparently) and fix remaining bugs preventing generation from finishing
a0122f2 Add content to a ui scene (no impl yet)
d27ec63 Try an optimization for time > memory in NaturalResources?
973cadc ok fine, editor, you can have this automatic change to my importfiles. please stop trying to get in my other diffs
3a92c18 Fix table writing for Coverage tables, then make a comment in a place where code needs to be rewritten (handling fewer than 5 patterns)
32a8b57 More genetic result table fixes. Coverage tables were apparently supposed to be sub-tables
e315129 Fix issue with creating and writing sub-tables
da7de38 More fixes to outcome table reading
17604ea Fixes to help with limited datapack data, data reading (both within and outside the demo), and other bugs by attempting to run demo in current state
32208bf Optimize PlayerLayer interfaces. This involves reducing number of calls to ecosystem health change for the location time display, and ensuring that inefficient RefCount allocations are not performed (MapNamesBiomesPositionsStaticData now creates list of Level refs that are returned for all queries later)
bc6a034 Add test seasonal leaf assets and update editor scripts to actually use seasonality. Also auto-rotate the forest assets because doing it by hand is bad. The forest (one of them, anyway) kind of looks like a forest again, now!
d5fd439 Functionality additions to demo subscenes
152e2f3 Add more functionality to demo, talk back and forth with UFS more
bbe3a7c Add newly compiled limited datapack to demo scene
e19cd41 Add math to compute derivative colors from the five genetic colors (basically, use multiplication and modulo to make the hue as chaotic as possible, and then have some simple rules for saturation and then value), add property names of the shader parameters on the new shader, and add static methods to stitch it all together
995dacf Make necessary changes to alpha patterns, genetic result tables, to properly add fauna_patterns to the "real" datapack (even if there is currently no relevant data)

There are some additional commits between the end of October and the build I put up for my submission:

12520c9 Update imported textures
2d00bf6 Set up demo presets for other platforms
c577e83 Make buttons populate in Display one per frame to prevent pattern-calculation slowdowns. Also move the timing of the await and hiding of loading screen to do more calculation while screen is up and prevent a blank screen can show up
4def70f Fixes for web export
240398d More tweaks (hide unused setting, set feature tag specific title which should separate save data)
b082cbf Lossy was a bad idea, just get top quality in there
c3b4ccc Refine appearance of buttons and shaders
e2e935e Do remainder of dependency injection for scripts to allow demo to be properly exported (with all singletons disabled)
eedabce Set up export template for demo
fdfb95f Remove deprecated code from UserFaunaStorage to not pull in dependencies
d9b6567 Last dependency injection pass. Should remove script dependencies from scripts that included scripts depend on (a mouthful; really it means changing the singleton dependence from a hard (required for parsing) to soft dependence)
2a4eea3 Remove "partial datapack" param on IllustrationInheritanceDemo, allowing it to have fewer script dependencies
f43600a Remove script dependencies on StaticData singleton and make them injectible for the sake of smaller demo run/export sizes
54fc20b Dependency-inject for Genome and GeneticsTraits as well
976a2a5 Change singleton access to self static variable access in IllustratedInheritanceDemo and its main menu
eb14907 Set static vars on FaunaIllustratedDisplayButton and make sure it can be nulled in StaticData singleton
bf76b52 Add class_name to demo main scene so that it can be used to hold resources as a static variable
9e0b2de StaticData singleton: Add a way to reset static variables set at script level. This prevents leaving them in a funny state when datapacks are loaded and unloaded.

Get War for the Fauna Wilds

Leave a comment

Log in with itch.io to leave a comment.