Home page/Specifications/Specification 1.0
The Educational Game Format (EGF) is an open file format designed to provide a simple and portable standard to represent, package, and play educational games. The objectives of EGF are to make educational games easier for educators to author and easier for learners to access worldwide. The format is explicitly designed for interoperability: any EGF-compliant Editor MUST produce EGF Packages that can be correctly opened and played by any EGF-compliant Reader that supports the features used in those files. EGF Readers and EGF Editors may be implemented as Android applications, iOS applications, web applications, or other types of software.
Copyright © 2025 EGF Project Authors. All rights reserved.
The EGF 1.0 Specification and all related documentation are protected under copyright law. No part of these materials may be reproduced, distributed, or modified without the prior written permission of the author, except as expressly permitted under the EGF Specification License 1.0.
The author's moral rights are asserted and protected.
The EGF 1.0 Specification is released under the EGF Specification License 1.0.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.
At the heart of EGF is the EGF Sequence. The EGF Sequence is based on Scenes. Each Scene is displayed in the order in which it is written, forming the EGF Game.
All href and full-path values in an EGF MUST use relative paths rather than absolute ones.
The value of any full-path attribute (such as the full-path attribute of the META-INF/container.xml <rootfile> element) MUST be expressed relative to the root of the ZIP archive.
The value of any href attribute in the EGF Core File or in any other XML resource (for example, a game_title.xml or mcq_01.xml file) MUST be expressed relative to the location of the file in which that attribute appears.
EGF Package
A ZIP archive that conforms to this specification. An EGF Package MUST contain exactly one EGF Core File and MAY contain additional resources (such as images, audio, video, and auxiliary XML files).
EGF Game
The logical game experience represented by a single EGF Package. An EGF Game is defined by its EGF Core File, its resources, and the behavior implied by the types of its Scenes.
EGF Core File
The XML file referenced from META-INF/container.xml as the rootfile. This file MUST have an <egf> root element and defines the metadata, manifest, sequence, and settings of the EGF Game.
EGF Reader
A software component (for example, a native app or web application) that is able to open, validate, and render an EGF Package according to this specification.
EGF Editor
A software component that is able to create or modify an EGF Package and produce EGF Packages that conform to this specification.
EGF Manifest
The <manifest> element in the EGF Core File. The manifest is a registry of all resources that can be referenced by the EGF Game.
Manifest Item
An <item> element inside <manifest>. Each Manifest Item MUST have at least id and role attributes and identifies a single resource within the EGF Package. Additional attributes (such as href, media-type, or value) MAY be required depending on the value of the role attribute, as defined in Section 9.
Role
The semantic type of a Manifest Item, declared in the role attribute (for example, egf_cover, game_title_simple, mcq_simple, video_simple, and other roles defined in Section 9). The Role determines how an EGF Reader MUST interpret and render the associated resource.
Scene
A logical unit of content that can be presented by an EGF Reader as part of the game flow. In this specification, a Scene is any Manifest Item that is referenced from the <sequence> element by its id.
Special Scene
A Scene whose Role has additional constraints on its position in the Sequence or its behavior (for example, game_title_simple, congratulations_simple, and other roles defined in Section 9).
Game Title Scene
In EGF 1.0, the Game Title Scene is the unique Scene whose Manifest Item has the role game_title_simple.
Congratulations Scene
In EGF 1.0, the Congratulations Scene is the unique Scene whose Manifest Item has the role congratulations_simple.
Game Over Scene
In EGF 1.0, the Game Over Scene is the unique Scene whose Manifest Item has the role game_over_simple.
Credits Scene
In EGF 1.0, the Credits Scene is the unique Scene whose Manifest Item has the role credits_simple.
EGF Sequence
The <sequence> element in the EGF Core File. The EGF Sequence is an ordered list of <scene> references that defines the order in which Scenes are presented by the EGF Reader.
EGF Settings
The <settings> element in the EGF Core File. The EGF Settings define game-level configuration values that an EGF Reader MUST use to adjust the behavior of the EGF Game.
Setting
A <setting> element inside <settings>. Each Setting MUST have a ref attribute whose value is the id of a Manifest Item defined in the EGF Manifest. The Role of that referenced Manifest Item determines the game-level configuration value that an EGF Reader MUST use to adjust the behavior of the EGF Game.
An EGF Package is a ZIP archive with this structure:
mimetype
META-INF/
container.xml
egf/
egf.xml
{files and directories specific to the content}
The file "mimetype" MUST be in mode "STORED", placed first in the ZIP archive, and not compressed. Other files and folders can be either uncompressed (STORED mode) or compressed (DEFLATE mode) using the compression level you wish.
The file "mimetype" MUST contain only this exact string: "application/egf+zip".
The file "META-INF/container.xml" MUST be a valid XML document whose root element is <container> with a version="1.0" attribute.
The <container> element MUST contain a <rootfiles> child element.
The <rootfiles> element MUST contain exactly one <rootfile> child element.
The <rootfile> element MUST have the following attributes:
full-path: its value MUST be a relative path from the root of the ZIP archive to the EGF Core File. While you are free to name the file as you wish, we recommend naming it "egf.xml".id: its value MUST be the identifier you wish to assign to the rootfile.Non-normative example:
<?xml version="1.0" encoding="UTF-8"?>
<container version="1.0">
<rootfiles>
<rootfile full-path="egf/egf.xml" id="main"/>
</rootfiles>
</container>
While you are free to put the actual content of the EGF where you want in the archive, it is RECOMMENDED to place the content in a folder named "egf" (in lowercase) located at the root of the archive. This way, you can avoid potential compatibility issues across different operating systems that are not case-sensitive, and you'll immediately recognize that the ZIP archive is an EGF Package.
Non-normative example of an EGF Core File:
<?xml version="1.0" encoding="UTF-8"?>
<egf version="1.0">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/">
<dc:identifier id="game_id">urn:isbn:9781234567890</dc:identifier>
<dc:title>Example Game Title</dc:title>
<dc:creator id="creator01">John Doe</dc:creator>
<dc:date>2025-11-11</dc:date>
<dc:language>en</dc:language>
<meta property="dcterms:modified">2025-11-12T10:00:00Z</meta>
</metadata>
<manifest>
<item role="egf_cover" href="assets/images/egf_cover.jpg" media-type="image/jpeg" id="egf_cover" />
<item role="game_title_simple" href="game_title.xml" media-type="application/xml" id="game_title" />
<item role="video_simple" href="assets/videos/french_alphabet.mp4" media-type="video/mp4" id="tutorial_letter_video" />
<item role="mcq_simple" href="mcq_01.xml" media-type="application/xml" id="mcq_01" />
<item role="mcq_simple" href="mcq_02.xml" media-type="application/xml" id="mcq_02" />
<item role="mcq_simple" href="mcq_03.xml" media-type="application/xml" id="mcq_03" />
<item role="mcq_simple" href="mcq_04.xml" media-type="application/xml" id="mcq_04" />
<item role="mcq_simple" href="mcq_05.xml" media-type="application/xml" id="mcq_05" />
<item role="congratulations_simple" href="congratulations.xml" media-type="application/xml" id="congratulations" />
<item role="game_over_simple" href="game_over.xml" media-type="application/xml" id="game_over" />
<item role="credits_simple" href="credits.xml" media-type="application/xml" id="credits" />
<item role="max_wrong_answers" value="5" id="max_wrong_answers" />
<item role="background_audio" href="assets/audios/game_background_music.mp3" media-type="audio/mpeg" id="background_audio" />
</manifest>
<sequence>
<scene ref="game_title" />
<scene ref="tutorial_letter_video" />
<scene ref="mcq_01" />
<scene ref="mcq_02" />
<scene ref="mcq_03" />
<scene ref="mcq_04" />
<scene ref="mcq_05" />
<scene ref="congratulations" />
<scene ref="game_over" />
<scene ref="credits" />
</sequence>
<settings>
<setting ref="max_wrong_answers" />
<setting ref="background_audio" />
</settings>
</egf>
The EGF Core File MUST have a root element named <egf> with a version attribute. For EGF 1.0, the value of this attribute MUST be "1.0". This attribute specifies the version of the EGF specification used by the EGF Game.
The EGF Core File MUST have an element named <metadata> placed inside the <egf> element with the attribute xmlns:dc="http://purl.org/dc/elements/1.1/" and the attribute xmlns:dcterms="http://purl.org/dc/terms/".
The <metadata> element MUST include the following elements from the Dublin Core Metadata Element Set, Version 1.1:
<dc:title> a required element that MUST contain the title of the EGF Game.
<dc:language> a required element that MUST contain the language of the EGF Game.
Other elements from the Dublin Core Metadata Element Set 1.1, such as those listed below, are allowed and recommended but not mandatory: <dc:creator>, <dc:subject>, <dc:description>, <dc:publisher>, <dc:contributor>, <dc:identifier>, <dc:date>, <dc:type>, <dc:format>, <dc:source>, <dc:relation>, <dc:coverage>, <dc:rights>.
In addition to the mandatory Dublin Core elements listed above, the <metadata> section MUST include a <meta> element with the attribute property="dcterms:modified". This field MUST contain the date and time of the last modification of the EGF Package as an xsd:dateTime value in Coordinated Universal Time (UTC).
Example:
<meta property="dcterms:modified">2025-11-12T10:00:00Z</meta>
The EGF Core File MUST have an element named <manifest> placed inside the <egf> element. This element is the EGF Manifest.
All child elements of the EGF Manifest MUST be <item> elements with mandatory id and role attributes. Depending on the value of the role attribute, additional attributes MAY be present.
All child elements of the EGF Manifest MUST have a role that is valid for the EGF Game; see Section 9, "Valid roles".
The EGF Manifest MUST include Manifest Items for exactly one Game Title Scene, exactly one Congratulations Scene, exactly one Game Over Scene, and exactly one Credits Scene.
The EGF Core File MUST have an element named <sequence> placed inside the <egf> element. This element is the EGF Sequence.
All child elements of the EGF Sequence MUST be <scene> elements with a mandatory ref attribute, whose value MUST be the id of an item defined in the EGF Manifest.
The EGF Sequence defines the order in which Scenes are displayed. The EGF Sequence is played in the order in which the elements are written. For example:
<sequence>
<scene ref="tutorial_letter_video" />
<scene ref="mcq_01" />
</sequence>
In this example, the EGF Reader MUST first play the Scene with id "tutorial_letter_video", then the Scene with id "mcq_01".
The EGF Core File MUST have an element named <settings> placed inside the <egf> element. This element is the EGF Settings.
All child elements of the EGF Settings MUST be <setting> elements with a mandatory ref attribute, whose value MUST be the id of an item defined in the EGF Manifest.
An EGF Core File that conforms to this Specification MUST contain exactly one Manifest Item whose role is max_wrong_answers, and the EGF Settings MUST contain exactly one <setting> element whose ref attribute is set to the id of that Manifest Item.
video_simple is a role designed to render a Scene that presents a single video resource as its primary content. When rendering a video_simple Scene, an EGF Reader MUST play the associated video resource from its beginning to its end, and MUST NOT require any additional interactive input from the learner in order to complete the Scene.
An EGF Reader MAY provide standard media playback controls (such as play, pause, seek, and volume) when rendering a video_simple Scene. The presence or absence of such controls does not affect conformance to this Specification.
Non-normative note: A video_simple Scene is intended to deliver lessons using a video resource.
To use this role, implementations MUST include the following line in the EGF Manifest:
<manifest>
<!-- Other <item> elements may appear here -->
<item role="video_simple" href="assets/videos/french_alphabet.mp4" media-type="video/mp4" id="tutorial_letter_video" />
</manifest>
Then add the Scene to the EGF Sequence. For example:
<sequence>
<scene ref="game_title" />
<!-- Other <scene> elements may appear here -->
<scene ref="tutorial_letter_video" />
<!-- Other <scene> elements may appear here -->
<scene ref="congratulations" />
<scene ref="game_over" />
<scene ref="credits" />
</sequence>
The item with the role video_simple MUST be a video file located inside the EGF content, with a MIME type of either video/mp4 or video/webm. Other MIME types MUST NOT be used for this role.
A video_simple Scene MUST be placed somewhere between the Game Title Scene and the Congratulations Scene in the EGF Sequence.
audio_simple is a role designed to render a Scene that presents a single audio resource as its primary content. When rendering an audio_simple Scene, an EGF Reader MUST play the associated audio resource from its beginning to its end, and MUST NOT require any additional interactive input from the learner in order to complete the Scene.
An EGF Reader MAY provide standard media playback controls (such as play, pause, seek, and volume) when rendering an audio_simple Scene. The presence or absence of such controls does not affect conformance to this Specification.
Non-normative note: An audio_simple Scene is intended to deliver lessons using an audio resource. It can be used for learners to guess which song, voice, or instrument is used in a Scene.
To use this role, implementations MUST include the following line in the EGF Manifest:
<manifest>
<!-- Other <item> elements may appear here -->
<item role="audio_simple" href="assets/audios/batucada.mp3" media-type="audio/mpeg" id="batucada" />
</manifest>
Then add the Scene to the EGF Sequence. For example:
<sequence>
<scene ref="game_title" />
<!-- Other <scene> elements may appear here -->
<scene ref="batucada" />
<!-- Other <scene> elements may appear here -->
<scene ref="congratulations" />
<scene ref="game_over" />
<scene ref="credits" />
</sequence>
The item with the role audio_simple MUST be an audio file located inside the EGF content, with a MIME type of either audio/wav, audio/ogg or audio/mpeg. Other MIME types MUST NOT be used for this role.
An audio_simple Scene MUST be placed somewhere between the Game Title Scene and the Congratulations Scene in the EGF Sequence.
mcq_simple is a role designed to render a Scene with exactly one multiple-choice question and four answer options, of which one is correct and three are incorrect.
When the learner selects an answer option, the EGF Reader MUST play the mcq_good_answer_feedback_audio resource if the selected option is the correct answer, and MUST play the mcq_wrong_answer_feedback_audio resource if the selected option is an incorrect answer.
The question and each answer option MAY use any supported modality (text, image, or audio). For example, a text question MAY be combined with image-based answers, or an audio question MAY be combined with text-based answers.
Non-normative note: An mcq_simple Scene is intended to display a multiple-choice question, either as text, as an image, or as audio, along with four answer options. Each answer option can also be displayed as text, as an image, or as audio.
To use this role, implementations MUST include the following line in the EGF Manifest:
<manifest>
<!-- Other <item> elements may appear here -->
<item role="mcq_simple" href="mcq_01.xml" media-type="application/xml" id="mcq_simple_01" />
</manifest>
Then create an XML file (example mcq_01.xml), with this structure:
<?xml version="1.0" encoding="UTF-8"?>
<mcq_simple>
<item role="mcq_question_image" href="assets/images/mcq_image_question.jpg" media-type="image/jpeg" id="mcq_question_image" />
<item role="mcq_good_answer_feedback_audio" href="assets/audios/mcq_good_answer_feedback_audio.mp3" media-type="audio/mpeg" id="mcq_good_answer_feedback_audio" />
<item role="mcq_wrong_answer_feedback_audio" href="assets/audios/mcq_wrong_answer_feedback_audio.mp3" media-type="audio/mpeg" id="mcq_wrong_answer_feedback_audio" />
<item role="good_answer_image" href="assets/images/good_answer_image.jpg" media-type="image/jpeg" id="good_answer_image" />
<item role="wrong_answer_image1" href="assets/images/wrong_answer_image1.jpg" media-type="image/jpeg" id="wrong_answer_image1" />
<item role="wrong_answer_image2" href="assets/images/wrong_answer_image2.jpg" media-type="image/jpeg" id="wrong_answer_image2" />
<item role="wrong_answer_image3" href="assets/images/wrong_answer_image3.jpg" media-type="image/jpeg" id="wrong_answer_image3" />
</mcq_simple>
For a text-based question and answers, the same structure applies, but the question and answers use the *_text variants with inline text/plain content, as in:
<item role="mcq_question_text" media-type="text/plain" id="mcq_question_text">Which city is the capital of France?</item>
<item role="good_answer_text" media-type="text/plain" id="good_answer_text">Paris</item>
<item role="wrong_answer_text1" media-type="text/plain" id="wrong_answer_text1">London</item>
<item role="wrong_answer_text2" media-type="text/plain" id="wrong_answer_text2">Berlin</item>
<item role="wrong_answer_text3" media-type="text/plain" id="wrong_answer_text3">Rome</item>
For an audio-based question and answers, the same structure applies, but the roles and MIME types use the *_audio variants, as in:
<item role="mcq_question_audio" href="assets/audios/question_audio.mp3" media-type="audio/mpeg" id="mcq_question_audio" />
<item role="good_answer_audio" href="assets/audios/good_answer_audio.mp3" media-type="audio/mpeg" id="good_answer_audio" />
<item role="wrong_answer_audio1" href="assets/audios/wrong_answer_audio1.mp3" media-type="audio/mpeg" id="wrong_answer_audio1" />
<item role="wrong_answer_audio2" href="assets/audios/wrong_answer_audio2.mp3" media-type="audio/mpeg" id="wrong_answer_audio2" />
<item role="wrong_answer_audio3" href="assets/audios/wrong_answer_audio3.mp3" media-type="audio/mpeg" id="wrong_answer_audio3" />
Then add the Scene to the EGF Sequence. For example:
<sequence>
<scene ref="game_title" />
<!-- Other <scene> elements may appear here -->
<scene ref="mcq_simple_01" />
<!-- Other <scene> elements may appear here -->
<scene ref="congratulations" />
<scene ref="game_over" />
<scene ref="credits" />
</sequence>
The items with the role mcq_good_answer_feedback_audio or mcq_wrong_answer_feedback_audio MUST be audio files with a MIME type of either audio/wav, audio/ogg or audio/mpeg. Other MIME types MUST NOT be used for this role.
If the role mcq_question_image, good_answer_image, wrong_answer_image1, wrong_answer_image2, or wrong_answer_image3 is used, the corresponding item MUST be an image file with a MIME type of either image/png or image/jpeg. Other MIME types MUST NOT be used for these roles.
If the role mcq_question_audio, good_answer_audio, wrong_answer_audio1, wrong_answer_audio2, or wrong_answer_audio3 is used, the corresponding item MUST be an audio file with a MIME type of either audio/wav, audio/ogg or audio/mpeg. Other MIME types MUST NOT be used for these roles.
If the role mcq_question_text, good_answer_text, wrong_answer_text1, wrong_answer_text2, or wrong_answer_text3 is used, the corresponding item MUST be a text resource with the MIME type "text/plain". Other MIME types MUST NOT be used for these roles.
An mcq_simple Scene MUST be a valid XML file and MUST contain exactly 7 <item> child elements:
one question resource, which MUST be either mcq_question_image, mcq_question_text, or mcq_question_audio
one mcq_good_answer_feedback_audio item
one mcq_wrong_answer_feedback_audio item
four answer options, where each option MUST be represented by exactly one of the corresponding roles:
good_answer_text, good_answer_image, good_answer_audio
wrong_answer_text1, wrong_answer_image1, wrong_answer_audio1
wrong_answer_text2, wrong_answer_image2, wrong_answer_audio2
wrong_answer_text3, wrong_answer_image3, wrong_answer_audio3
Exactly one of these four options (the one using a good_answer_* role) MUST represent the correct answer, and the other three (using wrong_answer_*1/2/3 roles) MUST represent incorrect answers.
An mcq_simple Scene MUST be placed somewhere between the Game Title Scene and the Congratulations Scene in the EGF Sequence.
hangman_simple is a role designed to render a Scene that creates a simple hangman game.
Non-normative note: The hangman_simple Scene is intended to provide an input where the player can type a character, with the hangman status shown above. A sound effect is played when the player validates either a correct or an incorrect character. The hangman status changes when the player types a wrong answer.
To use this role, implementations MUST include the following line in the EGF Manifest:
<manifest>
<!-- Other <item> elements may appear here -->
<item role="hangman_simple" href="hangman_01.xml" media-type="application/xml" id="hangman_simple_01" />
</manifest>
Then create an XML file (example hangman_01.xml), with this structure:
<?xml version="1.0" encoding="UTF-8"?>
<hangman_simple>
<item role="hangman_status_01" href="assets/images/hangman_status_01.jpg" media-type="image/jpeg" id="hangman_status_01" />
<item role="hangman_status_02" href="assets/images/hangman_status_02.jpg" media-type="image/jpeg" id="hangman_status_02" />
<item role="hangman_status_03" href="assets/images/hangman_status_03.jpg" media-type="image/jpeg" id="hangman_status_03" />
<item role="hangman_status_04" href="assets/images/hangman_status_04.jpg" media-type="image/jpeg" id="hangman_status_04" />
<item role="hangman_status_05" href="assets/images/hangman_status_05.jpg" media-type="image/jpeg" id="hangman_status_05" />
<item role="hangman_status_06" href="assets/images/hangman_status_06.jpg" media-type="image/jpeg" id="hangman_status_06" />
<item role="hangman_status_07" href="assets/images/hangman_status_07.jpg" media-type="image/jpeg" id="hangman_status_07" />
<item role="hangman_status_08" href="assets/images/hangman_status_08.jpg" media-type="image/jpeg" id="hangman_status_08" />
<item role="hangman_status_09" href="assets/images/hangman_status_09.jpg" media-type="image/jpeg" id="hangman_status_09" />
<item role="good_answer_audio" href="assets/audios/good_answer_audio.mp3" media-type="audio/mpeg" id="good_answer_audio" />
<item role="wrong_answer_audio" href="assets/audios/wrong_answer_audio.mp3" media-type="audio/mpeg" id="wrong_answer_audio" />
<item role="answer_to_guess" value="PLACE THE ANSWER TO GUESS HERE" case-sensitive="false" id="answer_to_guess" />
</hangman_simple>
Then add the Scene to the EGF Sequence. For example:
<sequence>
<scene ref="game_title" />
<!-- Other <scene> elements may appear here -->
<scene ref="hangman_simple_01" />
<!-- Other <scene> elements may appear here -->
<scene ref="congratulations" />
<scene ref="game_over" />
<scene ref="credits" />
</sequence>
The items with the role hangman_status_01 (hangman initial state), hangman_status_02, [...], hangman_status_09 (hangman final state) MUST be image files with a MIME type of either "image/png" or "image/jpeg". Other MIME types MUST NOT be used for this role.
The items with the role good_answer_audio or wrong_answer_audio MUST be audio files with a MIME type of either audio/wav, audio/ogg or audio/mpeg. Other MIME types MUST NOT be used for this role.
The item with the role answer_to_guess MUST be a text resource whose value is provided in its value attribute, and this value is the text the user should guess. It MUST also include an attribute named case-sensitive whose value MUST be either false or true.
If the value of the case-sensitive attribute is:
true, the user input MUST be compared with the value of the value attribute in a case-sensitive way.false, the user input MUST be compared with the value of the value attribute in a case-insensitive way.A hangman_simple Scene MUST be a valid XML file and MUST contain exactly the 12 <item> child elements listed in the example above.
A hangman_simple Scene MUST be placed somewhere between the Game Title Scene and the Congratulations Scene in the EGF Sequence.
game_title_simple is a role designed to render a Special Scene that displays the main title of an EGF Game.
Non-normative note: A game_title_simple Scene is intended to display a representative image of the game (typically the same artwork used in the egf_cover role), with a button below to start the game and another to show its credits, all set to a looping music track.
To use this role, implementations MUST include the following line in the EGF Manifest:
<manifest>
<!-- Other <item> elements may appear here -->
<item role="game_title_simple" href="game_title.xml" media-type="application/xml" id="game_title" />
</manifest>
Then create an XML file (for example, game_title.xml), with this structure:
<?xml version="1.0" encoding="UTF-8"?>
<game_title_simple>
<item role="game_title_image" href="assets/images/game_title_image.jpg" media-type="image/jpeg" id="game_title_image" />
<item role="game_title_audio" href="assets/audios/game_title_audio.mp3" media-type="audio/mpeg" id="game_title_audio" />
</game_title_simple>
Then add the Scene to the EGF Sequence. For example:
<sequence>
<scene ref="game_title" />
<!-- Other <scene> elements may appear here -->
<scene ref="congratulations" />
<scene ref="game_over" />
<scene ref="credits" />
</sequence>
The item with the role game_title_image MUST be an image file with a MIME type of either image/png or image/jpeg. Other MIME types MUST NOT be used for this role.
The item with the role game_title_audio MUST be an audio file with a MIME type of either audio/wav, audio/ogg or audio/mpeg. Other MIME types MUST NOT be used for this role.
A game_title_simple Scene MUST be a valid XML file.
A game_title_simple Scene MUST be placed at the beginning of the EGF Sequence.
congratulations_simple is a role designed to render a Special Scene that displays a basic congratulations screen.
When rendering a congratulations_simple Scene, an EGF Reader:
congratulations_audio from its beginning to its end, andAfter the congratulations_audio resource has finished playing, the EGF Reader MUST present a user control that allows the learner to start a new playthrough of the EGF Game (for example, a "Play again" button). When the learner activates this control, the EGF Reader MUST:
max_wrong_answers Setting), andAn EGF Reader MAY also provide other controls on the congratulations_simple Scene (for example, a control to exit the game), but these additional controls MUST NOT be required in order to start a new playthrough.
Non-normative note: A congratulations_simple Scene is intended to display a congratulations image, with a button below it to play again that appears after an audio track has finished playing.
To use this role, implementations MUST include the following line in the EGF Manifest:
<manifest>
<!-- Other <item> elements may appear here -->
<item role="congratulations_simple" href="congratulations.xml" media-type="application/xml" id="congratulations" />
</manifest>
Then create an XML file (for example, congratulations.xml), with this structure:
<?xml version="1.0" encoding="UTF-8"?>
<congratulations_simple>
<item role="congratulations_image" href="assets/images/congratulations_image.jpg" media-type="image/jpeg" id="congratulations_image" />
<item role="congratulations_audio" href="assets/audios/congratulations_audio.mp3" media-type="audio/mpeg" id="congratulations_audio" />
</congratulations_simple>
Then add the Scene to the EGF Sequence. For example:
<sequence>
<scene ref="game_title" />
<!-- Other <scene> elements may appear here -->
<scene ref="congratulations" />
<scene ref="game_over" />
<scene ref="credits" />
</sequence>
The item with the role congratulations_image MUST be an image file with a MIME type of either image/png or image/jpeg. Other MIME types MUST NOT be used for this role.
The item with the role congratulations_audio MUST be an audio file with a MIME type of either audio/wav, audio/ogg or audio/mpeg. Other MIME types MUST NOT be used for this role.
A congratulations_simple Scene MUST be a valid XML file.
A congratulations_simple Scene MUST be the antepenultimate Scene in the EGF Sequence, immediately followed by the Game Over Scene.
game_over_simple is a role designed to render a Special Scene that displays a basic game over screen.
When rendering a game_over_simple Scene, an EGF Reader:
game_over_audio from its beginning to its end, andAfter the game_over_audio resource has finished playing, the EGF Reader MUST present a user control that allows the learner to start a new playthrough of the EGF Game (for example, a "Play again" or "Try again" button). When the learner activates this control, the EGF Reader MUST:
max_wrong_answers Setting), andAn EGF Reader MAY also provide other controls on the game_over_simple Scene (for example, a control to exit the game or to show the credits directly), but these additional controls MUST NOT be required in order to start a new playthrough.
Non-normative note: A game_over_simple Scene is intended to display a game over image and clearly indicate that the current playthrough has ended, typically after the learner has made too many mistakes. A common implementation also places the "Play again" control below the image, but the exact user interface layout is up to the EGF Reader.
To use this role, implementations MUST include the following line in the EGF Manifest:
<manifest>
<!-- Other <item> elements may appear here -->
<item role="game_over_simple" href="game_over.xml" media-type="application/xml" id="game_over" />
</manifest>
Then create an XML file (for example, game_over.xml), with this structure:
<?xml version="1.0" encoding="UTF-8"?>
<game_over_simple>
<item role="game_over_image" href="assets/images/game_over_image.jpg" media-type="image/jpeg" id="game_over_image" />
<item role="game_over_audio" href="assets/audios/game_over_audio.mp3" media-type="audio/mpeg" id="game_over_audio" />
</game_over_simple>
Then add the Scene to the EGF Sequence. For example:
<sequence>
<scene ref="game_title" />
<!-- Other <scene> elements may appear here -->
<scene ref="congratulations" />
<scene ref="game_over" />
<scene ref="credits" />
</sequence>
The item with the role game_over_image MUST be an image file with a MIME type of either image/png or image/jpeg. Other MIME types MUST NOT be used for this role.
The item with the role game_over_audio MUST be an audio file with a MIME type of either audio/wav, audio/ogg or audio/mpeg. Other MIME types MUST NOT be used for this role.
A game_over_simple Scene MUST be a valid XML file.
A game_over_simple Scene MUST be the penultimate Scene in the EGF Sequence, immediately followed by the Credits Scene.
credits_simple is a role designed to render a Scene that displays the credits of the EGF Game.
Non-normative note: A credits_simple Scene is intended to display the EGF Game's credits, with a button at the end to exit and return to the Game Title Scene. It is only accessible from the Game Title Scene.
To use this role, implementations MUST include the following line in the EGF Manifest:
<manifest>
<!-- Other <item> elements may appear here -->
<item role="credits_simple" href="credits.xml" media-type="application/xml" id="credits" />
</manifest>
Then create an XML file (for example, credits.xml), with this structure:
<?xml version="1.0" encoding="UTF-8"?>
<credits_simple>
<item role="credit_field">
<item role="label">Creator</item>
<item role="content">Hervé Yvis</item>
</item>
<item role="credit_field">
<item role="label">Images</item>
<item role="content">Béatrice Yvis</item>
</item>
<item role="credit_field">
<item role="label">Pronunciation of the letters</item>
<item role="content">PodcastFrancaisFacile | https://www.podcastfrancaisfacile.com/cours/alphabet-francais-cours-1b.html</item>
</item>
<item role="credit_field">
<item role="label">Teacher's voice</item>
<item role="content">David François Abdoul Majid</item>
</item>
<item role="credit_field">
<item role="label">Victory sound</item>
<item role="content">OrangeMcMuffin | https://freesound.org/s/423021/ | Licence : CC BY 3.0 | No changes made</item>
</item>
</credits_simple>
Then add the Scene to the EGF Sequence. For example:
<sequence>
<scene ref="game_title" />
<!-- Other <scene> elements may appear here -->
<!-- Example: <scene ref="mcq_01" /> -->
<!-- Other <scene> elements may appear here -->
<scene ref="congratulations" />
<scene ref="game_over" />
<scene ref="credits" />
</sequence>
A credits_simple item MUST contain one or more child items with the role credit_field.
Each item with the role credit_field MUST contain exactly two child items: one item with the role label and one item with the role content.
The text value of both child items (label and content) MUST be provided as the character data of the <item> element.
A credits_simple Scene MUST be a valid XML file.
A credits_simple Scene MUST be placed at the very end of the EGF Sequence, right after the Game Over Scene.
max_wrong_answers is a role designed to configure when the Game Over Scene MUST be displayed.
To use this role, implementations MUST include the following line in the EGF Manifest:
<manifest>
<!-- Other <item> elements may appear here -->
<item role="max_wrong_answers" value="5" id="max_wrong_answers" />
</manifest>
Then add the Setting to the EGF Settings. For example:
<settings>
<!-- Other <setting> elements may appear here -->
<setting ref="max_wrong_answers" />
<!-- Other <setting> elements may appear here -->
</settings>
The item with the role max_wrong_answers MUST have an attribute named value, whose value MUST be a positive integer (1 or greater) expressed in base-10 digits and defines the maximum number of wrong answers the learner is allowed to give before the Game Over Scene is displayed.
At the start of each playthrough, the wrong-answer counter MUST be initialized to 0.
An EGF Reader MUST maintain a running counter of wrong answers across the whole EGF Game. For each Scene Role that defines wrong answers, this counter MUST be incremented as follows:
Scenes with the Roles video_simple, audio_simple, game_title_simple, congratulations_simple, game_over_simple, and credits_simple MUST NOT modify this counter.
When this counter is greater than or equal to the value of the item whose Role is max_wrong_answers, the EGF Reader MUST display the Game Over Scene.
For example:
<item role="max_wrong_answers" value="5" id="max_wrong_answers" />
In this example, the EGF Reader MUST display the Game Over Scene after the learner has accumulated 5 wrong-answer increments as defined above.
Since max_wrong_answers is not a Scene, it MUST NOT be placed in the EGF Sequence.
Use of this role is MANDATORY: an EGF Core File MUST define a max_wrong_answers configuration as specified in Section 8.5.
background_audio is a role designed to play a background audio sound across all Scenes of the EGF Game.
To use this role, implementations MUST include the following line in the EGF Manifest:
<manifest>
<!-- Other <item> elements may appear here -->
<item role="background_audio" href="assets/audios/game_background_music.mp3" media-type="audio/mpeg" id="background_audio" />
</manifest>
Then add the Setting to the EGF Settings. For example:
<settings>
<!-- Other <setting> elements may appear here -->
<setting ref="background_audio" />
<!-- Other <setting> elements may appear here -->
</settings>
The item with the role background_audio MUST reference an audio file located inside the EGF content with a MIME type of either audio/wav, audio/ogg or audio/mpeg. That item MUST have:
href attribute whose value is the path to the audio file, andmedia-type attribute whose value MUST be one of audio/wav, audio/ogg, or audio/mpeg. Other MIME types MUST NOT be used for this role.An EGF Reader MAY provide additional features related to background audio control (for example, volume adjustment or mute/unmute). The presence or absence of such controls does not affect conformance to this Specification.
Since background_audio is not a Scene, it MUST NOT be placed in the EGF Sequence.
Use of this role is OPTIONAL but RECOMMENDED.
egf_cover is a role designed to contain the cover of the EGF Game. It is not used directly in the game itself, but MAY be displayed in the library of an EGF Reader.
To use this role, implementations MUST include the following line in the EGF Manifest:
<manifest>
<!-- Other <item> elements may appear here -->
<item role="egf_cover" href="assets/images/egf_cover.jpg" media-type="image/jpeg" id="egf_cover" />
</manifest>
The item with the role egf_cover MUST be an image file with a MIME type of either image/png or image/jpeg. Other MIME types MUST NOT be used for this role.
Since egf_cover is not a Scene, it MUST NOT be placed in the EGF Sequence.
Use of this role is OPTIONAL but RECOMMENDED.
The EGF Core File MUST declare its version in the version attribute of the <egf> root element. The value of this attribute MUST use a "major.minor" scheme (for this specification: "1.0", and for future versions for example "1.1").
An EGF Reader that claims conformance to EGF 1.0:
MUST treat any EGF Package whose EGF Core File declares <egf version="1.0"> as supported, and MUST NOT reject such an EGF Package solely on the basis of its version.
MAY attempt to process EGF Packages with the same major version and a higher minor version (for example, version="1.1") using the rules in Section 10.2.
SHOULD NOT claim full conformance to any EGF version higher than the one it implements.
If the major version declared in the version attribute of the <egf> root element is greater than 1 (for example, version="2.0"), an EGF Reader MAY reject the EGF Package or open it in a degraded or "experimental" mode, but in any case it MUST NOT claim conformance to the EGF 1.0 Specification.
An EGF Reader MAY encounter roles, elements, or attributes that are not defined in this Specification.
If a Manifest Item has a role that is unknown to the EGF Reader and is never referenced from the EGF Sequence, the EGF Reader MAY safely ignore it.
If a Scene in the EGF Sequence references an item whose role is unknown to the EGF Reader, the EGF Reader:
MAY render it using a generic fallback (for example, displaying the underlying resource as plain content), or
MAY skip the Scene and continue with the next Scene in the Sequence.
In both cases, the EGF Reader MAY present a warning to the user, but MUST NOT crash or terminate abnormally solely due to the presence of unknown roles, elements, or attributes.
EGF Readers and EGF Editors MUST ignore any additional elements or attributes they do not understand, unless this Specification explicitly states otherwise. Unknown content by itself MUST NOT invalidate the entire EGF Package.
This specification defines the EGF file format and the semantics of the roles listed in Section 9. It does not prescribe any particular user interface, layout, or rendering technology.
An EGF Reader MUST use the EGF Sequence as the primary ordering of Scenes and MUST respect the semantics and constraints associated with each Role (for example, that a video_simple Scene plays a video resource from start to finish). Unless a Role specifies different navigation semantics, the Reader MUST present Scenes in the order in which they appear in the EGF Sequence.
Roles MAY define explicit navigation actions (for example, a "Play again" control) that cause the EGF Reader to jump to an earlier Scene in the Sequence, skip Scenes, or terminate the current playthrough. Such navigation remains compliant with this Specification, as long as it follows the rules defined for the corresponding Role.
Apart from these requirements, implementers are free to render an EGF Game in any way they choose (for example, using native widgets, HTML, or a game engine). Non-normative UI guidelines and examples MAY be published in separate EGF UI guides; following those guides is OPTIONAL and is not required to claim conformance to this specification.
This section defines what it means to conform to the EGF 1.0 Specification. The conformance model is defined for:
Unless otherwise stated, all requirements in this section are normative.
An EGF Package conforms to this Specification if and only if all of the following conditions are met:
mimetype at the root of the archive.mimetype file MUST:application/egf+zip (without any leading or trailing whitespace or line breaks).META-INF/container.xml file at the path META-INF/container.xml.container.xml file MUST be a well-formed XML document whose root element is <container> with a version="1.0" attribute.<container> element MUST contain exactly one <rootfiles> child element.<rootfiles> element MUST contain exactly one <rootfile> child element.<rootfile> element MUST have:full-path attribute whose value is a relative path from the root of the ZIP archive to the EGF Core File, andid attribute.The file referenced by the full-path attribute of <rootfile> MUST be a well-formed XML document.
The root element of this document MUST be <egf> and MUST have a version attribute whose value is 1.0.
The <egf> root element MUST contain exactly one <metadata> element, exactly one <manifest> element, exactly one <sequence> element, and exactly one <settings> element.
The <metadata> element MUST declare the namespaces:
xmlns:dc="http://purl.org/dc/elements/1.1/", andxmlns:dcterms="http://purl.org/dc/terms/".The <metadata> element MUST contain:
<dc:title> element that contains the title of the EGF Game, and<dc:language> element that contains the language of the EGF Game.The <metadata> element MUST contain a <meta> element with property="dcterms:modified" whose value is an xsd:dateTime in Coordinated Universal Time (UTC) representing the last modification time of the EGF Package.
All child elements of <manifest> MUST be <item> elements.
Each <item> element in <manifest> MUST have:
id attribute, androle attribute whose value is a valid role as defined in Section 9 for the EGF Game.All additional attributes required for each role (for example, href, media-type, value, case-sensitive) MUST be present and MUST satisfy the constraints defined in Section 9.
The EGF Manifest MUST include Manifest Items for:
role="game_title_simple"),role="congratulations_simple"),role="game_over_simple"), androle="credits_simple").The Manifest MUST contain exactly one item whose role is max_wrong_answers, with a value attribute that is a positive integer (1 or greater) expressed in base-10 digits.
All child elements of <sequence> MUST be <scene> elements.
Each <scene> element MUST have a ref attribute whose value is the id of a Manifest Item.
Each Scene referenced from <sequence> MUST correspond to exactly one Manifest Item.
The EGF Sequence MUST include at least:
The Game Title Scene MUST be the first Scene in the EGF Sequence.
The Congratulations Scene MUST be the antepenultimate Scene in the EGF Sequence, immediately followed by the Game Over Scene.
The Game Over Scene MUST be the penultimate Scene in the EGF Sequence, immediately followed by the Credits Scene.
The Credits Scene MUST be the last Scene in the EGF Sequence.
All Scenes that use roles defined as “MUST be placed between the Game Title Scene and the Congratulations Scene” (for example, video_simple, audio_simple, mcq_simple, hangman_simple) MUST appear somewhere between the Game Title Scene and the Congratulations Scene in the EGF Sequence.
All child elements of <settings> MUST be <setting> elements.
Each <setting> element MUST have a ref attribute whose value is the id of a Manifest Item defined in <manifest>.
There MUST be exactly one <setting> element whose ref attribute points to the Manifest Item with role="max_wrong_answers".
Any optional Settings (for example, the background_audio Setting) MUST satisfy all constraints defined for their corresponding roles in Section 9.
All href and full-path values in the EGF Package MUST be expressed as relative paths, as defined in Section 4.
The resource referenced by each href MUST exist in the ZIP archive at the specified location.
All media-type attribute values MUST use valid MIME types and MUST comply with the allowed types for the corresponding roles, as defined in Section 9.
All referenced XML resources (for example, game_title.xml, mcq_01.xml, hangman_01.xml, congratulations.xml, game_over.xml, credits.xml) MUST be well-formed XML documents and MUST respect the structural constraints defined for their respective roles.
An EGF Package that satisfies all of the requirements above is said to be a Conforming EGF 1.0 Package.
An EGF Reader conforms to this Specification as a Conforming EGF 1.0 Reader if and only if it satisfies all of the following conditions:
<egf version="1.0"> and MUST NOT reject such a package solely on the basis of its version.version="1.1") in accordance with Section 10.1.<egf> element is greater than 1, the Reader MAY reject the EGF Package or open it in a degraded or “experimental” mode, but in any case it MUST NOT claim conformance to the EGF 1.0 Specification for that package.The Reader MUST verify the presence and basic structure of:
mimetype file,META-INF/container.xml file, andcontainer.xml.The Reader MAY perform additional validation of conformance, but failure to fully validate MUST NOT cause the Reader to crash or terminate abnormally.
For all roles defined in Section 9 that the Reader claims to support, the Reader MUST implement the semantics and constraints described for those roles.
For Scenes with roles video_simple, audio_simple, mcq_simple, hangman_simple, game_title_simple, congratulations_simple, game_over_simple, and credits_simple, the Reader MUST:
The Reader MUST maintain and update the wrong-answer counter as defined for the max_wrong_answers role, and MUST display the Game Over Scene when the counter is greater than or equal to the configured max_wrong_answers value.
The Reader MUST use the EGF Sequence as the primary ordering of Scenes, as defined in Section 11.
Unless a Role defines different navigation semantics, the Reader MUST present Scenes in the order in which they appear in the EGF Sequence.
For roles that define explicit navigation actions (for example, “Play again” controls on congratulations_simple and game_over_simple Scenes), the Reader MUST implement those actions as described in Section 9.
When a new playthrough is started from a Special Scene (for example, from congratulations_simple or game_over_simple), the Reader MUST:
The Reader MUST ignore any additional elements or attributes it does not understand, unless this Specification explicitly states otherwise.
If a Manifest Item has an unknown role and is never referenced from the EGF Sequence, the Reader MAY ignore it.
If the EGF Sequence references a Scene whose role is unknown to the Reader, the Reader:
In all cases, the Reader MAY present a warning to the user, but MUST NOT crash or terminate abnormally solely due to the presence of unknown roles, elements, or attributes.
If the Reader claims to support background_audio, it MUST:
For any other non-Scene roles it supports, the Reader MUST implement the behavior described in Section 9 for those roles.
A software component that satisfies all of the requirements above is a Conforming EGF 1.0 Reader.
An EGF Editor conforms to this Specification as a Conforming EGF 1.0 Editor if and only if it satisfies all of the following conditions:
For every EGF Package that it produces and labels as conformant to EGF 1.0, the Editor MUST generate a Conforming EGF 1.0 Package as defined in Section 12.1.
The Editor MAY support authoring modes or export options that do not produce conforming packages, but such packages MUST NOT be claimed to conform to the EGF 1.0 Specification.
When opening and saving an existing Conforming EGF 1.0 Package without semantic changes (for example, simple metadata edits), the Editor SHOULD preserve conformance.
If the Editor cannot preserve conformance (for example, because it removes required Scenes or roles), it MUST NOT label the resulting package as conformant to EGF 1.0.
When the Editor provides user-facing features to create Scenes and resources for the roles defined in Section 9, it MUST:
<item> elements for mcq_simple, exactly twelve for hangman_simple).The Editor MUST enforce the structural constraints on the EGF Sequence for:
When generating an EGF Core File for EGF 1.0, the Editor MUST set version="1.0" on the <egf> root element.
If the Editor generates packages for future minor versions of EGF, it MUST set the version attribute appropriately, as described in Section 10.1.
If the Editor allows the creation of custom or extended roles, it SHOULD ensure that such roles:
A software component that satisfies all of the requirements above is a Conforming EGF 1.0 Editor.
Any software or content that claims conformance to this Specification:
Implementations SHOULD avoid making conformance claims to future EGF versions (for example, “EGF 1.1” or higher) unless they fully implement those versions.