Compare commits

...

9 Commits

Author SHA1 Message Date
Eric Lasota
75e5cceaf5 Merge pull request #25 from fpiesche/master
Optimise icon SVG and merge releases.xml into main metainfo
2025-07-21 12:10:29 -04:00
Florian Piesche
baa7bbde7f add trailing newline 2025-07-18 19:47:33 +01:00
Florian Piesche
bdb51862f4 Install freedesktop files on Linux 2025-07-18 19:47:21 +01:00
Florian Piesche
81f963cfeb Optimise icon SVG and merge releases.xml into main metainfo 2025-07-18 19:13:02 +01:00
elasota
89ed6ae29b Discontinue Android version 2025-07-06 18:01:49 -04:00
Florian Piesche
f6069e7a58 Add FreeDesktop metadata (#22) 2024-10-27 22:10:27 -04:00
elasota
e8028920aa Update user houses documentation 2024-09-07 04:39:04 -04:00
elasota
e3b481093a Add some info about getting logs 2024-08-07 02:07:43 -04:00
elasota
b866b0e67c Update credit lines 2024-08-07 02:00:45 -04:00
9 changed files with 141 additions and 30 deletions

View File

@@ -18,7 +18,7 @@
"enabled" : false
},
{
"name" : "Aerofoil ©2019-2021 Gale Force Games LLC",
"name" : "Aerofoil ©2019-2024 Eric Lasota",
"itemType" : "Label",
"pos" : [ 16, 21 ],
"size" : [ 406, 20 ],

View File

@@ -734,3 +734,15 @@ install(TARGETS "${EXECNAME}" COMPONENT Executable)
install(FILES ${DATA_FILES} DESTINATION lib/aerofoil/Packaged COMPONENT Resources)
install(FILES ${HOUSE_FILES} DESTINATION lib/aerofoil/Packaged/Houses COMPONENT Resources)
install(TARGETS ${TOOL_EXES} DESTINATION lib/aerofoil/tools COMPONENT Tools)
if (UNIX AND NOT APPLE)
install(FILES Resources/Linux/io.github.elasota.aerofoil.metainfo.xml
DESTINATION share/appdata
PERMISSIONS WORLD_READ GROUP_READ GROUP_EXECUTE OWNER_READ OWNER_WRITE)
install(FILES Resources/Linux/io.github.elasota.aerofoil.desktop
DESTINATION share/applications
PERMISSIONS WORLD_EXECUTE WORLD_READ GROUP_READ GROUP_EXECUTE OWNER_READ OWNER_WRITE OWNER_EXECUTE)
install(FILES Resources/Linux/io.github.elasota.aerofoil.svg
DESTINATION share/icons/hicolor/scalable/apps
PERMISSIONS WORLD_READ GROUP_READ GROUP_EXECUTE OWNER_READ OWNER_WRITE)
endif()

View File

@@ -5,38 +5,61 @@ files, if necessary, to the "Houses" directory inside of the "Aerofoil"
directory in your "Documents" directory, then restart Aerofoil.
IMPORTING EXISTING COMMUNITY CONTENT TO AEROFOIL
-------------------------------------------------------------------------------
If you want to import an existing third-party Glider PRO house to Aerofoil,
a few steps are required.
a few steps are required. All Aerofoil import tools are currently command-line
only, so you will need to use a command prompt to use them. Launch the tool
programs without any arguments and they will give instructions for usage.
You need to convert the file into Aerofoil's "triplet" format, which consists
of a metadata file (extension .gpf), and file forks (.gpd for data, .gpr for
resources). How you get these depends on the input format:
- For MacBinary files (.bin), use the "bin2gp" utility
- For BinHex files (.hqx), use the "hqx2gp" utility
- For StuffIt (.sit) and Compact Pro (.cpt) archives, use the "unpacktool"
utility to extract the contents in triplet format. The "unpacktool"
utility should support most vintage StuffIt archives made with StuffIt
Deluxe 6 or lower.
(NOTE: ".sea" files are self-extracting archives, typically StuffIt or Compact
Pro archives with the self-extractor program in the resources. These will
always be distributed in a fork-grouping container like MacBinary or BinHex.
For cases like these, you need to split the self-extracting archive using
"bin2gp" or "hqx2gp" and then pass the ".sea.gpd" file (which contains the
archive data) to "unpacktool" to decompress it.)
Some history: On most modern operating systems, files are a single stream of
data, and the file type is represented by an extension at the end of the file
name. On classic Macintosh systems, files have 2 streams: The data fork and
resource fork, and the file type (among other things) is stored in a metadata
block that is separate from the file data itself.
Once you've done that, if the house has custom resources (i.e. a .gpr file),
you need to convert it to an Aerofoil resource archive, which you can do using
the "gpr2gpa" tool.
Macintosh Glider PRO house files use the data fork to store the level data and
the resource fork to store custom features like sounds.
However, most server software only supports transmitting files as a single data
stream, so Macintosh files were shared in formats that bundle the 3 types of
data into a single data stream, and were converted into the full Macintosh
format files using conversion software on a Macintosh machine.
Aerofoil's unpack tools will always extract Macintosh files as a triplet of 3
files:
- The resource fork will be split to a file with a ".gpr" extension
- The data fork will be split to a file with a ".gpa" extension
- The metadata will be split to a file with a ".gpf" extension
Some file types you may encounter in the wild:
- MacBinary files (.bin): These encode a single file. Use the "bin2gp"
utility to unpack it.
- BinHex files (.hqx): These encode a single file. Use the "hqx2gp" utility
to unpack it.
- Compact Pro (.cpt) and StuffIt (.sit) archives encode multiple files.
Use the "unpacktool" utility to extract it.
- Self-extracting archives (.sea) are programs that contain archive data,
usually in StuffIt or Compact Pro format, in the data fork, and a
decompression program in the resource fork. Typically you will encounter
these as ".sea.hqx" or similar. For these, you need to extract the .sea
file from its original encoding, and then pass the data fork file (.gpd)
to the "unpacktool" utility.
Once you've unpacked the data for the house, you may need to convert the
resources (.gpr file) to Aerofoil's resource format. Aerofoil can not read .gpr
files directly.
To convert resources for a house, use the "gpr2gpa" utility. Note that
gpr2gpa's PICT converter may not support all PICT encodings. If you find a
house with custom PICT resources that isn't supported, please submit a sample
to Aerofoil's issue tracker.
Once you've done this, you should have a .gpf, .gpa, and .gpd file for the
house. Put them in the Houses directory to add the house to Aerofoil.
IMPORTING TV QUICKTIME MOVIES
-------------------------------------------------------------------------------
@@ -79,12 +102,9 @@ with an asterisk (*) and omit the output filename.
SECURITY CONSIDERATIONS
------------------------------------------------------------------------------
Glider PRO didn't really do any validation of houses. Currently, Aerofoil
doesn't do any additional validation either, and it's possible that invalid
house data may lead to crashes or even remote code execution.
Aerofoil 1.1 has a significantly stricter validator, which will reject data
that seems excessively large or invalid.
Glider PRO didn't really do any validation of houses. Aerofoil 1.1 has a
significantly stricter validator, which will reject data that seems
excessively large or invalid.
Also, Glider PRO houses were able to take advantage of a resource overlaying
feature of the Macintosh operating system, where a resource being present in

View File

@@ -344,6 +344,7 @@ void DoAboutFramework (void)
surface->DrawString(Point::Create(creditsHorizontalOffset, verticalPoint + spacing * (lineNum++)), PSTR("Eric Lasota - Programming, admin"), blackColor, font);
surface->DrawString(Point::Create(creditsHorizontalOffset, verticalPoint + spacing * (lineNum++)), PSTR("Thijs Verboon - macOS programming"), blackColor, font);
surface->DrawString(Point::Create(creditsHorizontalOffset, verticalPoint + spacing * (lineNum++)), PSTR("Phil Marell - macOS programming"), blackColor, font);
surface->DrawString(Point::Create(creditsHorizontalOffset, verticalPoint + spacing * (lineNum++)), PSTR("Iain King-Speir - Linux programming"), blackColor, font);
(lineNum++);
surface->DrawString(Point::Create(horizontalOffset, verticalPoint + spacing * (lineNum++)), PSTR(GP_APPLICATION_NAME " is an unoffical third-party port of Glider PRO."), blackColor, font);
(lineNum++);

View File

@@ -47,3 +47,6 @@ to install them.
Please report any issues that you experience with this to the issue tracker on
GitHub.
If the executable doesn't start, try running with the -diagnostics flag to
output a log file, typically to ~/.local/share/aerofoil/aerofoil/Logs

View File

@@ -9,6 +9,6 @@ To play:
Windows, macOS:
Download from the Releases page, or from https://galeforcegames.itch.io/aerofoil
Android: Download from Google Play Store: https://play.google.com/store/apps/details?id=org.thecodedeposit.aerofoil from itch.io: https://galeforcegames.itch.io/aerofoil, or from the Releases page
Browser (HTML5): Visit https://galeforcegames.itch.io/aerofoil
Android: Unfortunately, the Android version has been discontinued due to high maintenance requirements. The Google Play Store listing will be retired in August, 2025. You can try downloading an APK from the Releases page, but it may not work on newer devices.

View File

@@ -0,0 +1,9 @@
[Desktop Entry]
Categories=Game
Comment=A modern port of Glider PRO, the classic Macintosh paper airplane game
Exec=AerofoilX
Icon=io.github.elasota.aerofoil
Keywords=glider;glider pro;paper airplane
Name=Aerofoil
StartupNotify=true
Terminal=false

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<component>
<id>io.github.elasota.aerofoil</id>
<name>Aerofoil</name>
<developer id="io.github.elasota.aerofoil">
<name>John Calhoun, Eric Lasota, Aerofoil Contributors</name>
<url>https://github.com/elasota/Aerofoil/graphs/contributors</url>
</developer>
<branding>
<color type="primary" scheme_preference="light">#ffcc99</color>
<color type="primary" scheme_preference="dark">#6b3838</color>
</branding>
<summary>A modern cross-platform port of Glider PRO, the classic Macintosh paper airplane game</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-2.0</project_license>
<url type="homepage">https://github.com/elasota/Aerofoil/</url>
<description>
<p>Aerofoil is a port of John Calhoun's Glider PRO, the classic paper airplane game
for Apple Macintosh computers released in 1994.</p>
<p>The port features a 90's-style GUI, gamepad support, high-quality upscaling and
color correction, a full port of the level editor, a set of import tools for unpacking
and converting the vast majority of existing community content, and a new touchscreen interface
for mobile devices.</p>
</description>
<screenshots>
<screenshot type="default">
<image type="source">https://cdn.jsdelivr.net/gh/elasota/elasota.github.io@refs/heads/master/aerofoil/titlescreen.png</image>
<caption>The classic title screen with the custom menu GUI</caption>
</screenshot>
<screenshot>
<image type="source">https://cdn.jsdelivr.net/gh/elasota/elasota.github.io@refs/heads/master/aerofoil/demomode.png</image>
<caption>Demo mode</caption>
</screenshot>
<screenshot>
<image type="source">https://cdn.jsdelivr.net/gh/elasota/elasota.github.io@refs/heads/master/aerofoil/winscreen.png</image>
<caption>You won!</caption>
</screenshot>
<screenshot>
<image type="source">https://cdn.jsdelivr.net/gh/elasota/elasota.github.io@refs/heads/master/aerofoil/nemosmarket.png</image>
<caption>One of the included houses</caption>
</screenshot>
<screenshot>
<image type="source">https://cdn.jsdelivr.net/gh/elasota/elasota.github.io@refs/heads/master/aerofoil/editor.png</image>
<caption>Level editor included!</caption>
</screenshot>
</screenshots>
<recommends>
<input>keyboard</input>
</recommends>
<categories>
<category>Game</category>
</categories>
<releases>
<release version="1.1.2" date="2021-11-10">
<url>https://github.com/elasota/Aerofoil/releases/tag/1.1.2</url>
<description>
<p>Added gamepad support to Android and fixed gamepads not working
on other platforms.</p>
<p>Split off comand-line import tools to a separate package.</p>
</description>
</release>
</releases>
<content_rating type="oars-1.1"></content_rating>
</component>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="512pt" height="512pt" version="1.1" viewBox="0 0 682.67 682.67" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="linearGradient2" x1="79.399" x2="79.399" y1="176.02" y2="120.3" gradientTransform="matrix(2.3332,0,0,2.3332,-111.25,-195.69)" gradientUnits="userSpaceOnUse"><stop stop-color="#d00" offset="0"/><stop stop-color="#f63" offset=".32649"/><stop stop-color="#fc9" offset=".71632"/><stop stop-color="#ff0" offset="1"/></linearGradient></defs><g transform="matrix(3.4895 0 0 3.4895 -98.192 -304.23)"><g transform="matrix(1.1519,0,0,1.1519,4.4555,12.215)"><path d="m170 150a65 65 0 01-64.743 64.999 65 65 0 01-65.255-64.486 65 65 0 0164.227-65.509 65 65 0 0165.763 63.968" fill="url(#linearGradient2)"/><path d="m30 130h26.25l3.75-10h45l20 20 4.8276-5h25.172l5 5h5l15 20h-20l-10 10h-71.128l-3.8724-10h-30z" fill="none" stroke="#336" stroke-linecap="square" stroke-width="5" style="paint-order:normal"/><path d="m30 130h26.25l3.75-10h45l15 15 5.0862 4.9108 4.7414-4.9108h25.172l5 5h5l15 20h-20l-10 10h-71.128l-3.8724-10h-30z" fill="#555"/><path d="m30 130h26.25l3.75-10h45l5 5 15.086 14.911 4.9138-4.9108h25l5 5h5l1.9297 6.5285-4.2904 6.9963-2.6393 6.4752 11.106-11.859-11.106 11.859-10 10h-11.166l-15.198-21.859h-34.614l-10.149 11.859h-7.4876l-11.385-32.431-11.853 32.431h-3.1472z" fill="#888"/><path d="m95.996 148.14h6.2852l-19.119 21.859h-4.2904z" fill="#444" stroke-linecap="square" stroke-width="5"/><path d="m30 130h26.25l3.75-10h45l20 20h40l15 20h-16.197l8.697-10-1.3943-1.8591-11.106 11.859-10 10h-7.5632l-17.437-25h-25l-21.128 25-18.872-50-15 40z" fill="#fff"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB