Transition animations & Map phase work - Fossil Sweeper Progress Update XXXV
Cheeseness
[{'start': '2.520', 'end': '7.140', 'text': "Hi! My name's Cheese, and welcome to another Fossil Sweeper progress update video."}, {'start': '7.140', 'end': '9.990', 'text': "If you haven't heard of the project before, you can find an overview here"}, {'start': '9.990', 'end': '13.950', 'text': "But the tl;dr is it's like Minesweeper, but you're digging up fossils"}, {'start': '13.950', 'end': '17.350', 'text': 'And you get to build skeletons out of the stuff that you find.'}, {'start': '17.350', 'end': '24.140', 'text': "Over the past month or so, I've continued to work on polishing some misc bits and pieces for the Map phase."}, {'start': '24.140', 'end': '28.690', 'text': "Building on work I'd done in the previous month on Map phase icons and transitions"}, {'start': '28.690', 'end': '33.340', 'text': 'I refactored Dig site layout generation to happen when a site is "spawned."'}, {'start': '33.340', 'end': '35.890', 'text': 'This means that the layout information is available sooner'}, {'start': '35.890', 'end': '41.320', 'text': "And the icon for the Dig site's shape can be shown before visiting for the first time."}, {'start': '41.320', 'end': '46.440', 'text': 'Initially, I replaced the local travel destination icon with the Dig site layout,'}, {'start': '46.440', 'end': '51.660', 'text': "But with so much possible variation in shape and size, it didn't feel quite right"}, {'start': '51.660', 'end': '55.940', 'text': 'And I eventually settled on displaying it as a map inset'}, {'start': '55.940', 'end': '60.600', 'text': 'With a red dot representing the local destination on the globe.'}, {'start': '60.600', 'end': '64.200', 'text': 'I like this kind of presentation a little bit more than I was expecting'}, {'start': '64.200', 'end': '66.750', 'text': 'It helps maintain a sense of scale in a fun way'}, {'start': '66.750', 'end': '70.980', 'text': 'And allows all the travel line and dot stuff to feel consistent.'}, {'start': '70.980', 'end': '73.770', 'text': "For now, it's presented as a silhouette of the Dig [site] shape"}, {'start': '73.770', 'end': '77.190', 'text': 'Without the detail of dug tiles or found fossils.'}, {'start': '77.190', 'end': '79.900', 'text': "At this stage, I'm uncertain of whether I'll bring that back"}, {'start': '79.900', 'end': '83.020', 'text': "But since I'm looking at changing how the data is stored"}, {'start': '83.020', 'end': '87.740', 'text': 'So I think it makes more sense to decide that afterward.'}, {'start': '87.740', 'end': '90.320', 'text': 'Before settling on the map inset presentation'}, {'start': '90.320', 'end': '94.290', 'text': 'I decided to give some attention to how local travel lines are drawn.'}, {'start': '94.290', 'end': '99.280', 'text': 'The old implementation, which goes back to October 2022, was a kind of "noise worm"'}, {'start': '99.280', 'end': '104.950', 'text': "Sampling values on a noise texture, and selecting the direction that's lowest."}, {'start': '104.950', 'end': '111.840', 'text': "I'd updated it to aim for specific target coordinates and jump peaks to get a more desirable path"}, {'start': '111.840', 'end': '116.330', 'text': "Or bail if it's taken too long to get there, and while the results were passable"}, {'start': '116.330', 'end': '121.910', 'text': 'I had a couple of ideas for alternative methods that would let me do a little bit better.'}, {'start': '121.910', 'end': '125.020', 'text': 'Instead of stepping "forward" and then picking a new direction'}, {'start': '125.020', 'end': '127.860', 'text': 'I now make a line directly to the destination'}, {'start': '127.860', 'end': '132.660', 'text': 'And then bisect it and offset the new point in a perpendicular direction'}, {'start': '132.660', 'end': '135.770', 'text': 'Based on the lowest value in the noise texture.'}, {'start': '135.770', 'end': '140.000', 'text': 'This happens again and again, dividing each path segment and offsetting'}, {'start': '140.000', 'end': '144.800', 'text': 'Until the path is an appropriate length or until the segments are too small.'}, {'start': '144.800', 'end': '149.340', 'text': 'As with the noise worm path, I smooth it out into even curves.'}, {'start': '149.340', 'end': '153.560', 'text': 'The results are still winding, but feel less random and less grid-aligned'}, {'start': '153.560', 'end': '155.870', 'text': 'Which was a side effect of a quick-and-dirty approach'}, {'start': '155.870', 'end': '160.790', 'text': "I'd used to avoid overlaps with my initial noise worm implementation."}, {'start': '160.790', 'end': '163.050', 'text': 'I think there are a couple more things I can do'}, {'start': '163.050', 'end': '166.640', 'text': 'To make the destruction of bisections feel more organic'}, {'start': '166.640', 'end': '172.310', 'text': "But overall, it's more reliably producing nice-looking results than the old system did"}, {'start': '172.310', 'end': '178.250', 'text': "And I'd be content to ship what's here if I don't end up with time to revisit it."}, {'start': '178.250', 'end': '180.240', 'text': 'While doing work on the Map phase stuff'}, {'start': '180.240', 'end': '184.260', 'text': 'I tidied up and improved a few other miscellaneous bits and pieces.'}, {'start': '184.260', 'end': '190.210', 'text': 'The updated advanceDigs() function I mentioned in the last video has been optimised a little bit'}, {'start': '190.210', 'end': '194.730', 'text': 'And time can now progress multiple turns for particular Dig sites'}, {'start': '194.730', 'end': '201.120', 'text': 'A sort of travel cost that will become more relevant once I add more regions to the Map phase.'}, {'start': '201.120', 'end': '205.070', 'text': 'While refactoring how Dig sites and their layouts are generated,'}, {'start': '205.070', 'end': '207.780', 'text': 'I tweaked how the Dig site thumbnails calculation'}, {'start': '207.780', 'end': '213.190', 'text': 'And decided to make a start on refactoring how Dig site data is saved.'}, {'start': '213.190', 'end': '219.680', 'text': "Currently, it's a big old json dictionary, with each tile's state flags as named properties"}, {'start': '219.680', 'end': '224.470', 'text': 'For a large Dig site, that might be upwards of 10,000 lines.'}, {'start': '224.470', 'end': '229.020', 'text': "I'm in the progress of migrating that to be stored as a base64 encoded string"}, {'start': '229.020', 'end': '233.540', 'text': 'With a byte for each tile representing four booleans:'}, {'start': '233.540', 'end': '236.090', 'text': "Whether it's an actual tile; whether it's dug;"}, {'start': '236.090', 'end': '240.640', 'text': "Whether it's flagged; and whether or not it contains a fossil."}, {'start': '240.640', 'end': '245.180', 'text': "Instead of storing a null chunk for every tile that doesn't contain something"}, {'start': '245.180', 'end': '248.560', 'text': "I'm storing chunks in their own array, and at load time"}, {'start': '248.560', 'end': '254.520', 'text': "I can read them out and populate the runtime tile data's chunk details as I go"}, {'start': '254.520', 'end': '258.270', 'text': 'Rather than needing explicitly to store coordinates for each.'}, {'start': '258.270', 'end': '262.480', 'text': "All this cuts my test case save's 10,000 lines"}, {'start': '262.480', 'end': '265.490', 'text': 'Down to a couple of hundred lines for chunk details'}, {'start': '265.490', 'end': '269.260', 'text': 'Plus one line to hold that base64 encoded string'}, {'start': '269.260', 'end': '273.720', 'text': 'That ends up being about a few thousand characters long.'}, {'start': '273.720', 'end': '276.850', 'text': 'Human-readable save data has always been important to me'}, {'start': '276.850', 'end': '279.110', 'text': 'But there are a few concerns to balance.'}, {'start': '279.110', 'end': '283.950', 'text': 'My current test save can get up to around 60,000 lines long in total'}, {'start': '283.950', 'end': '287.070', 'text': 'And at that point it becomes cumbersome to navigate in a text editor'}, {'start': '287.070', 'end': '290.470', 'text': 'Effectively making it less human-readable.'}, {'start': '290.470', 'end': '294.000', 'text': "The impact of large saves on load times is something I've noticed as well"}, {'start': '294.000', 'end': '299.050', 'text': "And that's also been a motivation behind these optimisations."}, {'start': '299.050', 'end': '303.290', 'text': "Another thing that's important to me is preserving compatibility with legacy saves."}, {'start': '303.290', 'end': '306.410', 'text': "Partly that's so that I can build and test the general infrastructure"}, {'start': '306.410', 'end': '310.080', 'text': "I've written for updating old saves before the game is released"}, {'start': '310.080', 'end': '314.190', 'text': 'But I feel like I also have a responsibility to allow'}, {'start': '314.190', 'end': '317.320', 'text': 'Pre-release players to carry something forward'}, {'start': '317.320', 'end': '321.280', 'text': "If they've invested time, I want the game to recognise that."}, {'start': '321.280', 'end': '327.690', 'text': "That said, for this Dig site data format stuff, I'm tempted to just drop legacy save data."}, {'start': '327.690', 'end': '333.260', 'text': "A player's fossil inventory from in-progress Dig sites would still be preserved"}, {'start': '333.260', 'end': '337.390', 'text': 'The in-progress ones would just be treated as new.'}, {'start': '337.390', 'end': '340.890', 'text': "I'll see how I feel once the work is done."}, {'start': '340.890', 'end': '344.770', 'text': 'Because the changes to stored Dig site data is significant'}, {'start': '344.770', 'end': '347.540', 'text': "And because I'm on the cusp of some other significant additions"}, {'start': '347.540', 'end': '349.800', 'text': "I'm planning to bump the minor version up"}, {'start': '349.800', 'end': '354.930', 'text': 'And tag the first build with the new save format as version 0.3.'}, {'start': '354.930', 'end': '357.770', 'text': 'If I do end up deciding to break some legacy compatibility'}, {'start': '357.770', 'end': '364.330', 'text': 'That will be the time to do it.'}, {'start': '364.330', 'end': '367.180', 'text': 'A very big thank you to the supporters going by on screen at the moment.'}, {'start': '367.180', 'end': '373.950', 'text': 'Their support has helped me eat while making this game, and I am so very appreciative.'}, {'start': '373.950', 'end': '380.020', 'text': 'A huge thanks also to Screen Tasmania, who supported this project with a small grant.'}, {'start': '380.020', 'end': '382.280', 'text': "Anyway, that's about it for today."}, {'start': '382.280', 'end': '385.410', 'text': "If you'd like to keep track of development or try the playable prototype"}, {'start': '385.410', 'end': '387.390', 'text': 'You can find some links in the description.'}, {'start': '387.390', 'end': '390.500', 'text': "And if you're super keen to check out what we talked about here today"}, {'start': '390.500', 'end': '394.180', 'text': 'I make early test builds available to my supporters on Patreon.'}, {'start': '394.180', 'end': '396.313', 'text': 'Thanks for watching and goodbye!'}]