Deprecated: Optional parameter $save_options declared before required parameter $required_plugins is implicitly treated as a required parameter in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/includes/feed-them-functions.php on line 1832

Deprecated: Optional parameter $_api_data declared before required parameter $item_name is implicitly treated as a required parameter in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/updater/updater-check-class.php on line 46

Deprecated: Optional parameter $fb_type declared before required parameter $location is implicitly treated as a required parameter in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/feeds/facebook/class-fts-facebook-feed.php on line 866

Deprecated: Optional parameter $fb_post_id declared before required parameter $post_data is implicitly treated as a required parameter in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/feeds/facebook/class-fts-facebook-feed.php on line 1343

Deprecated: Optional parameter $fb_post_user_id declared before required parameter $post_data is implicitly treated as a required parameter in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/feeds/facebook/class-fts-facebook-feed.php on line 1343

Deprecated: Optional parameter $fb_post_single_id declared before required parameter $post_data is implicitly treated as a required parameter in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/feeds/facebook/class-fts-facebook-feed.php on line 1343

Deprecated: Optional parameter $single_event_id declared before required parameter $post_data is implicitly treated as a required parameter in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/feeds/facebook/class-fts-facebook-feed.php on line 1343

Deprecated: Optional parameter $num_words declared before required parameter $more is implicitly treated as a required parameter in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/feeds/facebook/class-fts-facebook-feed.php on line 2024

Deprecated: Return type of FeedThemSocialDOMWordsIterator::current() should either be compatible with Iterator::current(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/includes/trim-words.php on line 217

Deprecated: Return type of FeedThemSocialDOMWordsIterator::next() should either be compatible with Iterator::next(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/includes/trim-words.php on line 179

Deprecated: Return type of FeedThemSocialDOMWordsIterator::key() should either be compatible with Iterator::key(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/includes/trim-words.php on line 174

Deprecated: Return type of FeedThemSocialDOMWordsIterator::valid() should either be compatible with Iterator::valid(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/includes/trim-words.php on line 223

Deprecated: Return type of FeedThemSocialDOMWordsIterator::rewind() should either be compatible with Iterator::rewind(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/feed-them-social/includes/trim-words.php on line 228

Deprecated: Return type of WPForms\Logger\Records::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/wpforms-lite/src/Logger/Records.php on line 96

Deprecated: Return type of WPForms\Logger\Records::current() should either be compatible with Iterator::current(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/wpforms-lite/src/Logger/Records.php on line 40

Deprecated: Return type of WPForms\Logger\Records::next() should either be compatible with Iterator::next(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/wpforms-lite/src/Logger/Records.php on line 50

Deprecated: Return type of WPForms\Logger\Records::key() should either be compatible with Iterator::key(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/wpforms-lite/src/Logger/Records.php on line 62

Deprecated: Return type of WPForms\Logger\Records::valid() should either be compatible with Iterator::valid(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/wpforms-lite/src/Logger/Records.php on line 74

Deprecated: Return type of WPForms\Logger\Records::rewind() should either be compatible with Iterator::rewind(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/wpforms-lite/src/Logger/Records.php on line 84

Deprecated: Automatic conversion of false to array is deprecated in /home/mixelmag/public_html/wp/wp-content/plugins/loginizer/init.php on line 250

Deprecated: Automatic conversion of false to array is deprecated in /home/mixelmag/public_html/wp/wp-content/plugins/loginizer/init.php on line 265

Deprecated: Return type of ActionScheduler_DateTime::setTimezone($timezone) should either be compatible with DateTime::setTimezone(DateTimeZone $timezone): DateTime, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_DateTime.php on line 60

Deprecated: Return type of ActionScheduler_DateTime::getOffset() should either be compatible with DateTime::getOffset(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_DateTime.php on line 48

Deprecated: Return type of ActionScheduler_DateTime::getTimestamp() should either be compatible with DateTime::getTimestamp(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/classes/ActionScheduler_DateTime.php on line 27

Deprecated: DateTime::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated in /home/mixelmag/public_html/wp/wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/functions.php on line 272

Deprecated: Return type of Requests_Cookie_Jar::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-includes/Requests/Cookie/Jar.php on line 63

Deprecated: Return type of Requests_Cookie_Jar::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-includes/Requests/Cookie/Jar.php on line 73

Deprecated: Return type of Requests_Cookie_Jar::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-includes/Requests/Cookie/Jar.php on line 89

Deprecated: Return type of Requests_Cookie_Jar::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-includes/Requests/Cookie/Jar.php on line 102

Deprecated: Return type of Requests_Cookie_Jar::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-includes/Requests/Cookie/Jar.php on line 111

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 40

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 51

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 68

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 82

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/mixelmag/public_html/wp/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 91
Zombie Holiday (RIP) – Mixel's Lab

Zombie Holiday (RIP)

A retrospective on Zombie Holiday, my abandoned Mac platform game project. You can still download Zombie Holiday Prologue but it only really runs on OSX versions before Mojave. Zombie Holiday’s spiritual successor is Creeping Me Out: Hex Night – currently in development for Amiga computers.

Francis is hanging out at his favourite haunt when he receives a call from a friend. There’s an emergency! Undead creatures and strange animals are getting aggressive around town. Time to find the only person he knows who can deal with this sort of thing, Annabel.. But she’s at her mansion.. And there’s a whole lot of swamp to get through, first.

Tenuously, ZH’s plot..

Back in 2007 – 2008 I produced Zombie Holiday: Prologue A sort of Castlevania meets Shadow Of The Beast platform game with painterly pixel graphics, branching paths and fast action. (and yes, even in prologue there are branching paths, they’re just largely hidden.)

I used Power Game Factory, an engine and editor suite designed for making platform games for PPC Macs. Scripting in PGF is visual, but things like AI and physics are often quite complex to set up. I would spend many hundreds (thousands?) of hours drawing sprites, backdrops, composing music and setting up the gameplay.

The result was a four(ish) level demo that I was aiming to add similarly sized chunks to, releasing every month or so until the game was complete.

The first large level was such an undertaking that I learnt the hard way why platform games use tiled maps. (Honestly, I knew before I started, but thought I knew better) Drawing level maps as single, giant canvases (with parallax scrolling!) might be pretty, but it takes forever. I was never able to polish the stages as much as I’d have like, as I could have embellished them with particles and foreground layers almost indefinitely.

The later levels of the demo used tiles though, and comparatively, these could be produced at an alarming rate. A lot of things conspired to kill ZH’s development; being burnt out, starting my degree, having a lot of RL commitments,  and the uncertain future of the engine, dev tools and target platform. I’d love to undertake a similar (though probably simpler) project with a more flexible engine or programming language, but doing all the assets, scripting, level layouts etc as well as learning a new toolset seems unsurmountable. Enter Scorpion Engine, and my beautiful old Amiga. We’re back on track!

Eventually things came together and Zombie Holiday Prelude was included with PGF commercially, as an example working project. It’s still prominent on the engine’s website.

It makes me happy that it could be of some use to others, and I became a helpful member of the engine’s forums, posting tutorials and encouraging others. I really miss PGF and it’s community!

The demo is available below! Updated 10th August 2020 with some bug fixes. It should work on big cat era Mac OS and YMMV up to around Mojave. Sadly it doesn’t seem to work well in VMWare or Parallels. It was largely developed on a G5 PowerMac. Sheesh. 😅

Download Zombie Holiday OSX

You can still see Zombie Holiday at the Sawblade Software site, where you can buy Power Game Factory – and get the working project files to tinker with. Sadly PGF doesn’t run on intel Macs, making working on it’s games nigh impossible. Zombie Holiday is therefor dead, undead undead. Follow it’s second incarnation here.

2 thoughts on “Zombie Holiday (RIP)”

  1. Pingback: Creeping Me Out: Hex Night – MixelMagic

  2. Pingback: New Year Update – MixelMagic

Leave a Comment

Your email address will not be published.


Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/mixelmag/public_html/wp/wp-includes/formatting.php on line 2772