                ╙ N,                                 ┌▄,╙╜"╙
              ▀     █▓                              ▄M#╙  #⌐
              ╙▌#., █▌   #─                    ╓   ╠▓└╓,▓█Ñ
                 ╙╩▀███▓▄▀b                   ▄╬ ╓╢▒█▀▀
                  ,,,╙╢██╫█▄                 #█▄▄██▀.╓##æ
               º╙  :▀▓║█████▄▄▓███▄▄ .m╓╢M▒▒▒██████▓█▌.
             '    #▒▀██████████████▓▒▒▒▒▓▒██████████████▄▄
              ▄╗#▒▓██████████████████▒█████████████████████▓▓▒,
           .#▒▓▓█████▀▀▀▀███████████████████████████▀▀█████████▄
      ,≈ ,#║▒██████" ,     ▀██████████████████    .  (╢▒████████▌.#
      ▀▄╔╫▒▒███████, ▐█▄ ▄  ▐███████████████▀  ╔,(█Γ ⌠████████████Γ
  ╔┌▄ .▒▒▓██████████▄  ▀"▀Ç▄▄ ▀████▀║▌█████╜   ╙"▀. ▄████████████▌,  ╓▄
  @██▒▒▓▒▒█████████████▓▓█████████▀.╫Γ└▀███████▓▓▓████████████████▓▒▓▓█
  ║█▓█████████████████████████████∩ ╫Γ ████████████████████████████████
  ╫███████╜└▀███▓█████████████████▓▓██#█████████████████████▀  ▒███████
  ╠╫████▀    └██▓▀█████████████████████████████████████████▀    ╙╢█████
  ║▓████▌     ▐██▒║▒▒▀▒█▀▒▒▀█████████████████████████▀╓████⌐    `╢████⌐
  ╙█████▌     ╞███▒  ▄╓,│▄,└▄▄▄│▄╓▄▒╓,▄▄,'│▄▄└┌»'▄▄╢  ║███▌     ┌▒████⌐
  ║██████∩     ▀███Γ ╙╜█ ╘█∩╙██∩╢█▀└ └╝██"╙█▌ ╙█Γ╙▀└ (████▌     ^╢████▓
  ╓████▀       "▀███▄ ╓#.▄▓⌐▄M╙▄M╠▄▓╙▓▄▒ ▓▓,#▄(▄ #╘▓∩▓████`      4█████
  ╓████,        ╙╫██▄╒▄╬▄█▄,▀\╙╙▄╫▒Ñ ╙Ñ▄#▄▒Ñ╠▒,▐`╬Q,#███▀       ╘▓╫██Γ█
  ▀█████m         ├▒██████████████▒    ╫▀█████████████╙          ╔▒██Γ
   ║███▀▌           ║██▀│╠'''╙████▒    ║▓▀▀''''''└███'           º▒███⌐
   (██▓             └╫▌         ▀█▀    ▒=         ║█⌐            ▐▒███⌐
    ║██▀             ▒½         ▐█▀    ▌          ╔█              ║██▓
    │▒█              #           ║∩    ▌           @              ╫█▌╫
   #▀██              ,           ║∩    æ           ╫⌐             ┌█Ñ└
   ▐▌██              ╡           ║∩                ╙              ║▒
    ║Γ│▌                         ║,    `                          ▒┘
 .__ ___________   _________  ________  _____________________  _________¨
 |__|\      \   \ /   /  _  \ \______ \ \_   _____/\______   \/   _____/
 |  |/   |   \   Y   /  /_\  \ |    |  \ |    __)_  |       _/\_____  \
 |  /    |    \     /    |    \|    `   \|        \ |    |   \/        \
 |__\____|__  /\___/\____|__  /_______  /_______  / |____|_  /_______  /
            \/              \/        \/        \/         \/        \/
 :::::::::::::..  D   E   M   O     G   R   O   U   P  ..:::::::::::::
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
             ____  ____  ____  ____  ____  __ _  ____  ____
            (  _ \(  _ \(  __)/ ___)(  __)(  ( \(_  _)/ ___)
             ) __/ )   / ) _) \___ \ ) _) /    /  )(  \___ \
            (__)  (__\_)(____)(____/(____)\_)__) (__) (____/

   _______    ______         ____        ____________    ____________
   \      |  |      |    ____\_  \__    /            \   \           \
    |     /  /     /|   /     /     \  |\___/\  \\___/|   \           \
    |\    \  \    |/   /     /\      |  \|____\  \___|/    |    /\     |
    \ \    \ |    |   |     |  |     |        |  |         |   |  |    |
     \|     \|    |   |     |  |     |   __  /   / __      |    \/     |
      |\         /|   |     | /     /|  /  \/   /_/  |    /           /|
      | \_______/ |   |\     \_____/ | |____________/|   /___________/ |
       \ |     | /    | \_____\   | /  |           | /  |           | /
        \|_____|/      \ |    |___|/   |___________|/   |___________|/
                        \|____|

--------------------------
Nick/Realname: omega       / Jan Palenicek (code, gfx, story)
             : Lamer Pinky / Petr Klusal   (musics, gfx)
Group: Invaders
Full name of work: Void
Compo: ZX Spectrum
Requirements: ZX Spectrum 128k/+2
Duration (minutes): 7:45 (11:17 with end-titles)
Contacts: invaders@outlook.cz
P.S.: Demoscene forever!
--------------------------

Version history:
================
12.01.2021:  V 1.3 - Universal binary, CPU test, Speed up of fade-in/out (Ped7G)
                   - Story additions, in-demo text corrections
10.01.2021:  V 1.2 - Recompiled with sjasmplus 1.18, minor fixes
                   - Compatibility improvements, memory and CPU test
26.12.2020:  V 1.1 - Party version, initial release


Void package contains following files:
======================================
1) void.tap            - tape file image with the demo
2) void_cluesheet.png  - Hint to decode alien font to get HWID
3) void_ost.pt3        - Original movie soundtrack
4) fileid.diz          - THIS file
5) invaders.stl        - 3D step file with invaders table stand :)

Demo was developed primarily for ZX Spectrum 128k/+2/+3. It is best viewed on
these machines. We timed multicolor routines also for Pentagon nevertheless it
was tested only inside emulators.

Hardware test is performed at the beginning of demo. You'll see a blue Alien
head on a white background.
- Test PASS - Alien head disappears within 2 seconds.
- Test FAIL - Alien head stays with a flashing border.

Color of the planet's reflection in Alien's eye indicates HW configuration.
Compatibility table of different computer models and version of the demo:

              +==============================+============+
              |Machine Type                  | Moon color |
              +==============================+============+
              |Sinclair ZX Spectrum 128k/+2  | Red        |
              |Sinclair ZX Spectrum +2A/B/+3 | Magenta    |
              |Pentagon                      | Green      |
              |Error: Unknown slow           | Dark blue  |
              |Error: Unknown fast           | White      |
              +==============================+============+

Pentagon version has different paging and has a bit more frames rendered between
the keyframes. In case you have Pentagon 512 make sure to run this version.

You can contact authors with the hardware identification ID in case you
encounter issues with this demo. HW ID is displayed on the left side of the
void logo. Guide how to decode the alien font to obtain HW ID can be found in
void_cluesheet.

HWID contains CPU type and CPU speed in memory page 1. Recognized CPUs are:
- Z80 NMOS
- Z80 CMOS
- Z80N

Music:
======
Lamer Pinky composed the beautiful soundtrack for this demo. Whole PT3 song is
almost 11 minutes long utilizing 23kb of memory without sound play routine.
One of the technical challenges was to get this soundtrack into the available
memory (#db00-#ffff). We teamed with mborik who had previous experience with
PT3 data optimizations. He was able to optimize the song data and slice it
into 4 parts that are dynamically loaded and decompressed in real time. He
reduced data size of the original song to 12kb and also provided optimized pt3
player for this demo.

Rotoid engine:
==============
Credit to whom credit is due - Pete Cooke. He came with the rotational object
representation idea first and also developed two great games based on that
concept - Tau Ceti and Academy. Rotoid engine is inspired by those two games
nevertheless it is written completely from scratch with different design goals
in mind.

Segments, Objects, Multi-Objects, Bitmaps, Scenes, Animations, Screenplay...

Main philosophy of the engine is that objects are vertically symmetrical. Each
object is then defined by its right side where the other side is automatically
mirrored. E.g. to draw a box we need to define a vertical line, mirror
coordinates of the line along its virtual Y axis and connect points between
both sides. Likewise, if we want to draw a circle. We'd calculate right side
arc and then mirror it to the other side. As a result, we have a filled
circle. Rotoid engine calls those elementary shapes "segments". Each object
consists of several segments. For example, a diamond shaped object is composed
of two lines (segments).

                              /\ line 1
                              \/ line 2

Data model with segment definitions is interpreted and x-positions of the
lines are stored in 256b table (since we need coords for the left, middle and
right - then 3x256b are needed). Segment data model has additional attributes
to enable a bit more flexibility to object designs. For example, shading
pattern of each segment (lights used on buildings, blinking lights or
different shadow patterns of several ships). Another important attribute is to
position each segment individually within the object. There are two offsets X
and Y that positions current segment relatively to its display position. This
helps us to overcome limitation in drawing only symmetrical objects. For
example it is possible to draw a box on the left and a circle on the right
within the same segment data model. More practical use is for example
Nostradamus ship with different structures, two blinking lights on the
Narcissus ship or Alien mothership in the city scene. Engine can also apply
shadow to emphasize 3D effect. Since objects are in fact flat, 3D effect is
achieved by splitting the line and using different dither patterns for shadow
and light. The assumption is - object are rotational (thus rotoid engine).
Shadow position is calculated from radius and light angle. Technically it is
just a lookup table to get x-position of the point between the left and right
side.

Rotoid engine enables further abstraction into "objects". Those objects have
additional attributes to position "segments", and apply global scale and
global light angle. This is used for example in the Calpamos scene with a big
planet and small moon. In fact this is one segment definition with two
instances of different scale and position.

Grouping "objects" into "multiobjects" enables us to draw complex objects
consisting of several "objects". Multiobject has XYZ location and can be
manipulated using the animation functions.

Bitmaps... engine can use masked, non-masked, monochrome or color sprites.
Sprites can be pre-rotated by the engine at the scene initialization phase.
This was used in several places of the demo (landing scenes, moving cursor
above pyramids, explorer... etc.) for moving objects. Bitmaps were also used
for drawing backgrounds once scene was calculated (e.g. in the first Calpamos
scene and in the second Alien world scene). Bitmap objects are sharing the
same object definition structure as "multiobjects" thus the same animation
routines can be used for bitmaps.

There is a lot more that is needed to make a "movie like experience". We need
to define what will be seen, how it will be seen, how long and how it will be
animated. For that purpose we have "Scenes". Scenes are complex structures of
executable code and data pointers. Each scene has following sections:

- init
- erase
- draw
- anim

It is quite self-explanatory. In the init section we define the camera
position, brightness, contrast, field of view, z-clipping, screen centre
offset, and y-crop. We also unpack bitmaps and other scene resources and wait
for the soundtrack. Erase, Draw, Anim are pointers to different routines
followed by data.

Huh! Still reading? And we just scratched the surface. Perhaps next time... At
least you got very rough idea of how it works.

VOID story
==========
Timeline

*** Hundreds of thousand of years ago ***
The colonization of space, life was spread by an unknown developed
civilization to thousands of planets in the universe.

*** 2107 ***
The Earth is exhausted. There has been no ice on the surface since 2090. The
weather on the planet is very unstable, and the temperature is on average
three degrees higher than in 2000. Wild life does not exist and most of the
human population is living in big cities. The human race is trying to solve:
over population, global warming and because of that the lack of food and
resources. Several mining corporations are travelling to nearby planets and
satelites to excavate precious raw material and natural resources needed for
production. A Chinese-Japanese company has developed the first atmospheric
generator. Zeelog Mining Industries sent its mining ship Nostradamus to the
planet Calpamos in the Zeta Reticuli 2 solar system.

*** 2125 ***
Nostradamus arrived at Calpamos. This planet has three satellites and
Saturn-like rings that are thought to be the remnants of a disintegrated
satellite.

The Calpamos incident:
Nostradamus landed on one of the planets' satellites. Structures built by an
unknown intelligent species were found on the satellite’s surface. The
Nostradamus crew explored three pyramid shaped structures. The tips of the
pyramids had a bright light showing some activity. During the exploration of
one of the pyramids, the crew were teleported to an unknown alien planet
millions of light-years away. The crew were able to see two alien cities with
tall tower shaped buildings and flying saucers. While exploring the second
city they could see that the alien planet is orbiting a collapsing star. A
deadly magnetic field was creating a big corona around the sun. The city's
structures were protecting its citizens from solar radiation and certain
death. The aliens tried to find a second Homeworld. They undertook a number of
missions to find a new habitable planet. All attempts failed and they almost
ran out of all available resources needed for transportation. One planet, far
far away, has ideal conditions for their species. Until now, they were not
aware that Earth existed.

Alien response:
Aliens sent two ships. The first ship was sent to Calpamos to bomb its
satellite. The bomb destroyed the teleporter with the rest of the Nostradamus
crew on a cargo ship. One Nostradamus crew member was able to escape before
its destruction. His rescue ship is heading back to Earth to warn people. He
will soon become the most important human in history. The second Alien ship
was sent straight to the Earth. It was a colonization ship.

Earth - Arrival:
Once space defense and military intelligence confirmed the arrival of a
gigantic alien mothership, people went crazy. The streets were full of them
waiting for arrival of Aliens, Gods, Saviors... Dancing, singing, praying...
We were begging for help to solve our own problems. There were also people
full of skepticism and animosity towards the new visitors. For those Aliens
were an obvious threat. Our overpopulated planet could not take on another
burden, hungry locust. Nobody expected the first contact with intelligent
civilization like that. We expected communication, arguing about principles or
fighting in the worst case. Nothing like that has happened.

There is not much information available about the arrival. We do not know what
exactly happened. From some pieces of information, we know that people
witnessed an event that could be described as "a black hole or endless black
funnel". This event took several hours. During this event there was no
electricity on the planet. A full black-out. People could not hear sound
coming from the environment. It was like being in the gigantic anechoic
chamber. The arrival of the aliens was followed by a deafening high-frequency
sound. A lot of people were trying to hide or protect their ears. The final
stage of the arrival was a bright white blinding light. Who wasn’t mad before
the arrival soon did after that. Alien ships arrived and Aliens took control
of everything. Earth and its people were defeated without fight.

No more records were retrieved.

*** 2173 ***
Nostradamus rescue ship is returning back to Earth. 48 years after the Calpamos
incident. Events haven’t been disclosed yet. To be continued...

Invaders, December 26, 2020, Olomouc, Czech Republic


                                 #█▌███▄.
                              ▄▓▓████████BQ▄
                ▄▄▓███████████████████████████▓▓▓ººª└╙▀╙B½▄
           ,▄▓████████████████████████████████▓▓▒╢╗»~-~     ╙Ræ»
      .▄▓██████████████████████████▌▄▄▄▄███████▓█▒▒▄▄▄▄▄▄,       ╙▀╖,
  ▄▄▓████████████████████████████████████████████▒█▒▒╠░\             └⌠@╖,
 ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█▀▀▀▀▀▀▀▀▀▀███▀▀▀▀▀███████▀▀███▀▀▀▀█▀█▀╙╙╙╙╙╙╙╙╙╙╙╙╙╙╙╙"
                    ╙▀████████████████████████████████▀.
                       ▀██████████████████████████▀╙
                           ████████████████████▌
                           █████████████████▒É7▌
                           ██████████████▀▀▀▀Γ"Γ
                           ██████████████████▒▄Γ
                      ╓▓█████████████████████▒╬▄▄╬█▄
                     #██████████████████████▓▒░    ╜▒▄
                   ┌██████████████████████████▀╝╝êê╝██▓
                  ┌██████████████████████████▒▒N     └╚▓
                  ████████████████████████████▒▒M7+```╚▓▌
                 ▐████████████████████████████▓▒▄⌐⌐⌐⌐⌐▄▒█
                 ▀▀███████████████████████████████▄▄▄╫█▀▀─
                           └▀█████████████████▀
                             ████████████████▌
                             ████████████████▌
                             █████████████▒║╫▌
                             ████████████████▌
                             ████████████▒, .k
                             █████████████⌐:╓]
                             █████████████Ñ╜Ñ▌
                             └▀██████████▓=╗º
                              ▐██████████Ñ █
                              ▐█████████▓M ║
                              ▐█████████▒└ ║
                              ▐█████████▓M ╫
                              ▄█████████▓▓▓█,
                            ▄██████████▀▀▀▀▀█▓
                           ╓█████████▓░    │║██
                           ███████████▒»  .╔▒██b
                           █████████████▓▓▓████▌
                           ╙███████████████████
                            ╙█████████████████
                              ▀█████████████▀
                                 ████▌...└
                                 └██▀
                                  k▀=╫




                       ┌            ║███▌  ████b
             █████M    ╠            ║███▌  ████b  ╓▒  ▄
             ▓█▀█Äb  ╓███w     ▄▄▄▄▄▐███▌  ████Ω ███  ██▓▄
        .▄██¬▀█▀██▌, ║██▌¬.,   ╓▄██▄▐███▌  █████▄███  ████⌐  ╒▓@%▓#
        ▌▀█▀⌐██▒█▒██ ║██▌Γ██▌  ║██▀▀║███▌  █████▀"██  ████─  ▐▓███▌
        ▌▄╫▀⌐██╫█╫██ ║██▌▄█████╠▌█▀█╚▀▀▀▀═ █████º`█▌▓▓▓█b██▒ ▐██▀██▄▓
      ╓╓▌██▓─▌██████▄╚█▌███████║█▓█═███▓▓█.█████▓b█▌████b█▌█ ▐███████
     ▐███▓██¬██╝██j█▌██▌█▌▓████║███M██████▐█ÉÑ╫██▌█▌████b██▌▒▄█▐█████▓▌`,
 å▒▓▓▐███Q▐▀⌐████╬j▀▀▒▀▌█▌@▒▒██╫███▌████████╣▒╫██▌█▌████b██████▐██████╬╫█╠▓
█████▐█████▓⌐██▒█åj██▀▀▌█▌███████╫█░██████████╫██▌█▌████b██████▐███████████
