diff --git a/README.md b/README.md index 7f245f8..50a80a9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![AliceOS header](repo_assets/project_header_relname.png) -![AliceOS 2.0.0](https://img.shields.io/badge/aliceos-2.0.0-yellow.svg) ![Build Status](https://github.com/ProjectAliceDev/aliceos/workflows/Build%20AliceOS%20Archive/badge.svg) ![Lint Status](https://github.com/ProjectAliceDev/aliceos/workflows/Lint/badge.svg) +[![Latest release](https://img.shields.io/github/v/release/projectalicedev/aliceos)](https://github.com/projectalicedev/aliceos/releases) ![Build Status](https://github.com/ProjectAliceDev/aliceos/workflows/Build%20AliceOS%20Archive/badge.svg) ![Lint Status](https://github.com/ProjectAliceDev/aliceos/workflows/Lint/badge.svg) AliceOS is a robust, evolving Ren'Py framework by Project Alice that adds an operating system-like experience to visual novel projects. AliceOS is easy to install, extendable, and is great for adding another layer of interactivity to your games. diff --git a/docs/01-install/index.html b/docs/01-install/index.html index 9b7f176..25053c5 100644 --- a/docs/01-install/index.html +++ b/docs/01-install/index.html @@ -701,8 +701,8 @@
  • - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
  • @@ -755,6 +755,18 @@ + + + + + +
  • + + Prospect Park (2.0.0) Developer Beta 3 + +
  • + + @@ -939,12 +951,12 @@

    Downloading the base system

    Ensure compatibility

    -

    The latest version of AliceOS for download will always correspond to the latest version of the Ren'Py SDK made available at that time. At the time of writing, this means that AliceOS is building against Ren'Py SDK v7.3.2. If you are unsure of what version AliceOS is built with, check the Travis results and click on "Ren'Py Latest SDK".

    +

    The latest version of AliceOS for download will always correspond to the latest version of the Ren'Py SDK made available at that time. At the time of writing, this means that AliceOS is building against Ren'Py SDK v7.3.5. If you are unsure of what version AliceOS is built with, check the GitHub Actions page and click on "Build AliceOS Archive".

    It is recommend that you make sure that your version of Ren'Py is up to date to ensure compatibility with AliceOS.

    Usage with DDLC Mods

    If you plan to use AliceOS in a mod for Doki Doki Literature Club!, you must make sure that the base system version that you use is built against Ren'Py 6.99.12.4 to maintain compatibility.

    -

    The release ZIP file is generally noted as 'AliceOS-x.x.x-_AliceOSBaseSystem-rp6.zip'.

    +

    The release ZIP file is generally noted as AliceOS-x.x.x-_6.99.12.4-ASBaseSystem.zip.

    Building from source code

    Alternatively, you can build AliceOSBaseSystem.rpa yourself with the customization you need. This may also be helpful in building AliceOS for your specific Ren'Py version, if necessary.

      diff --git a/docs/02-contributing/index.html b/docs/02-contributing/index.html index 75a8b35..ccd0e12 100644 --- a/docs/02-contributing/index.html +++ b/docs/02-contributing/index.html @@ -809,8 +809,8 @@
    1. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    2. @@ -863,6 +863,18 @@ + + + + + +
    3. + + Prospect Park (2.0.0) Developer Beta 3 + +
    4. + + diff --git a/docs/404.html b/docs/404.html index 938bb75..c808df4 100644 --- a/docs/404.html +++ b/docs/404.html @@ -639,8 +639,8 @@
    5. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    6. @@ -693,6 +693,18 @@ + + + + + +
    7. + + Prospect Park (2.0.0) Developer Beta 3 + +
    8. + + diff --git a/docs/CNAME b/docs/CNAME index c5e44cc..72ea234 100644 --- a/docs/CNAME +++ b/docs/CNAME @@ -1 +1 @@ -nextdocs.aliceos.app +docs.aliceos.app diff --git a/docs/Develop-Apps/01-manifest/index.html b/docs/Develop-Apps/01-manifest/index.html index cd09f98..3adb6a1 100644 --- a/docs/Develop-Apps/01-manifest/index.html +++ b/docs/Develop-Apps/01-manifest/index.html @@ -720,8 +720,8 @@
    9. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    10. @@ -774,6 +774,18 @@ + + + + + +
    11. + + Prospect Park (2.0.0) Developer Beta 3 + +
    12. + + diff --git a/docs/Develop-Apps/02-sending-notifications/index.html b/docs/Develop-Apps/02-sending-notifications/index.html index 90cec57..0a71018 100644 --- a/docs/Develop-Apps/02-sending-notifications/index.html +++ b/docs/Develop-Apps/02-sending-notifications/index.html @@ -781,8 +781,8 @@
    13. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    14. @@ -835,6 +835,18 @@ + + + + + +
    15. + + Prospect Park (2.0.0) Developer Beta 3 + +
    16. + + diff --git a/docs/Develop-Apps/03-interface-design/index.html b/docs/Develop-Apps/03-interface-design/index.html index 5feb39b..c1f599e 100644 --- a/docs/Develop-Apps/03-interface-design/index.html +++ b/docs/Develop-Apps/03-interface-design/index.html @@ -706,8 +706,8 @@
    17. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    18. @@ -760,6 +760,18 @@ + + + + + +
    19. + + Prospect Park (2.0.0) Developer Beta 3 + +
    20. + + diff --git a/docs/Develop-Apps/04-watching-events/index.html b/docs/Develop-Apps/04-watching-events/index.html index bd99d56..a009254 100644 --- a/docs/Develop-Apps/04-watching-events/index.html +++ b/docs/Develop-Apps/04-watching-events/index.html @@ -719,8 +719,8 @@
    21. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    22. @@ -773,6 +773,18 @@ + + + + + +
    23. + + Prospect Park (2.0.0) Developer Beta 3 + +
    24. + + diff --git a/docs/Develop-Apps/index.html b/docs/Develop-Apps/index.html index 8b03813..ec9744f 100644 --- a/docs/Develop-Apps/index.html +++ b/docs/Develop-Apps/index.html @@ -685,8 +685,8 @@
    25. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    26. @@ -739,6 +739,18 @@ + + + + + +
    27. + + Prospect Park (2.0.0) Developer Beta 3 + +
    28. + + diff --git a/docs/Frameworks/AppKit/01-ASAppRepresentative/index.html b/docs/Frameworks/AppKit/01-ASAppRepresentative/index.html index 4d1960c..f24ccfd 100644 --- a/docs/Frameworks/AppKit/01-ASAppRepresentative/index.html +++ b/docs/Frameworks/AppKit/01-ASAppRepresentative/index.html @@ -805,8 +805,8 @@
    29. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    30. @@ -859,6 +859,18 @@ + + + + + +
    31. + + Prospect Park (2.0.0) Developer Beta 3 + +
    32. + + diff --git a/docs/Frameworks/AppKit/index.html b/docs/Frameworks/AppKit/index.html index 6c9cc9f..c879447 100644 --- a/docs/Frameworks/AppKit/index.html +++ b/docs/Frameworks/AppKit/index.html @@ -687,8 +687,8 @@
    33. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    34. @@ -741,6 +741,18 @@ + + + + + +
    35. + + Prospect Park (2.0.0) Developer Beta 3 + +
    36. + + diff --git a/docs/Frameworks/NotificationKit/01-banner/index.html b/docs/Frameworks/NotificationKit/01-banner/index.html index f32be01..589dd70 100644 --- a/docs/Frameworks/NotificationKit/01-banner/index.html +++ b/docs/Frameworks/NotificationKit/01-banner/index.html @@ -707,8 +707,8 @@
    37. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    38. @@ -761,6 +761,18 @@ + + + + + +
    39. + + Prospect Park (2.0.0) Developer Beta 3 + +
    40. + + diff --git a/docs/Frameworks/NotificationKit/02-alerts/index.html b/docs/Frameworks/NotificationKit/02-alerts/index.html index 0f921b4..9ecee9e 100644 --- a/docs/Frameworks/NotificationKit/02-alerts/index.html +++ b/docs/Frameworks/NotificationKit/02-alerts/index.html @@ -734,8 +734,8 @@
    41. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    42. @@ -788,6 +788,18 @@ + + + + + +
    43. + + Prospect Park (2.0.0) Developer Beta 3 + +
    44. + + diff --git a/docs/Frameworks/NotificationKit/index.html b/docs/Frameworks/NotificationKit/index.html index a99e891..9ce3fe7 100644 --- a/docs/Frameworks/NotificationKit/index.html +++ b/docs/Frameworks/NotificationKit/index.html @@ -687,8 +687,8 @@
    45. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    46. @@ -741,6 +741,18 @@ + + + + + +
    47. + + Prospect Park (2.0.0) Developer Beta 3 + +
    48. + + diff --git a/docs/Frameworks/ScreenKit/01-a-simple-ui/index.html b/docs/Frameworks/ScreenKit/01-a-simple-ui/index.html index e4da5a6..2543a0c 100644 --- a/docs/Frameworks/ScreenKit/01-a-simple-ui/index.html +++ b/docs/Frameworks/ScreenKit/01-a-simple-ui/index.html @@ -701,8 +701,8 @@
    49. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    50. @@ -755,6 +755,18 @@ + + + + + +
    51. + + Prospect Park (2.0.0) Developer Beta 3 + +
    52. + + diff --git a/docs/Frameworks/ScreenKit/02-special-styles/index.html b/docs/Frameworks/ScreenKit/02-special-styles/index.html index c223737..e3cec42 100644 --- a/docs/Frameworks/ScreenKit/02-special-styles/index.html +++ b/docs/Frameworks/ScreenKit/02-special-styles/index.html @@ -734,8 +734,8 @@
    53. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    54. @@ -788,6 +788,18 @@ + + + + + +
    55. + + Prospect Park (2.0.0) Developer Beta 3 + +
    56. + + @@ -1055,13 +1067,13 @@

      ASInterfaceScrollbar diff --git a/docs/Release-Notes/1tp2/index.html b/docs/Release-Notes/1tp2/index.html index 66582dc..c28cb3b 100644 --- a/docs/Release-Notes/1tp2/index.html +++ b/docs/Release-Notes/1tp2/index.html @@ -647,8 +647,8 @@
    57. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    58. @@ -710,6 +710,18 @@ + + + + + +
    59. + + Prospect Park (2.0.0) Developer Beta 3 + +
    60. + + diff --git a/docs/Release-Notes/2.0.0_db1/index.html b/docs/Release-Notes/2.0.0_db1/index.html index 1b5ac5e..f867d7d 100644 --- a/docs/Release-Notes/2.0.0_db1/index.html +++ b/docs/Release-Notes/2.0.0_db1/index.html @@ -647,8 +647,8 @@
    61. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    62. @@ -814,6 +814,18 @@ + + + + + +
    63. + + Prospect Park (2.0.0) Developer Beta 3 + +
    64. + + diff --git a/docs/Release-Notes/2.0.0_db2/index.html b/docs/Release-Notes/2.0.0_db2/index.html index 3446d00..79ac28c 100644 --- a/docs/Release-Notes/2.0.0_db2/index.html +++ b/docs/Release-Notes/2.0.0_db2/index.html @@ -647,8 +647,8 @@
    65. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    66. @@ -828,6 +828,18 @@ + + + + + +
    67. + + Prospect Park (2.0.0) Developer Beta 3 + +
    68. + + @@ -1165,13 +1177,13 @@

      App Manager -
      + Skip to content + + + +
      + +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      + +
      +
      +
      + + +
      +
      +
      + + +
      +
      +
      + + +
      +
      + + + +

      Prospect Park (2.0.0) Developer Beta 3

      +

      The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0).

      +

      ScreenKit

      +
        +
      • ScreenKit now include horizontal scrollbars and radio buttons.
      • +
      • ScreenKit frames are more rectangular.
      • +
      +

      Apps

      +
        +
      • Introduces a new Inventories app, a fast and fun way to create and manage a game inventory.
      • +
      +

      About AliceOS

      +
        +
      • The Ren'Py version should now match the proper built version and not be hard-coded.
      • +
      +

      Setup Assistant

      +
        +
      • Setup Assistant now uses ScreenKit to draw elements.
      • +
      + + + + + + + + + +
      +
      +
      +
      + + + + +
      + + + + + + + + \ No newline at end of file diff --git a/docs/Release-Notes/index.html b/docs/Release-Notes/index.html index c0262ee..0a91dcc 100644 --- a/docs/Release-Notes/index.html +++ b/docs/Release-Notes/index.html @@ -40,7 +40,7 @@ - Prospect Park (2.0.0) Developer Beta 3 - AliceOS Documentation + Prospect Park (2.0.0) - AliceOS Documentation @@ -93,7 +93,7 @@ - + Skip to content @@ -119,7 +119,7 @@ - Prospect Park (2.0.0) Developer Beta 3 + Prospect Park (2.0.0) @@ -656,11 +656,11 @@ - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0) @@ -674,8 +674,8 @@ @@ -894,8 +1003,8 @@
      • - - ScreenKit + + General
      • @@ -908,8 +1017,43 @@
      • - - About AliceOS + + Messages + + +
      • + +
      • + + Core Services and Applications + + +
      • + +
      • + + Desktop + + +
      • + +
      • + + Halt screens (formerly Stop errors) + + +
      • + +
      • + + Notifications + + +
      • + +
      • + + Bootloader
      • @@ -921,6 +1065,68 @@ +
      • + + ScreenKit + + +
      • + +
      • + + About AliceOS + + +
      • + +
      • + + App Manager + + +
      • + +
      • + + Changes since Developer Beta 3 + + + + +
      • + @@ -938,25 +1144,112 @@ -

        Prospect Park (2.0.0) Developer Beta 3

        -

        The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0).

        -

        ScreenKit

        +

        Prospect Park (2.0.0)

        +

        The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). If you are upgrading from Developer Beta 3, you can read the latest changes since that release.

        +
        +

        Before you upgrade

        +

        AliceOS Prospect Park is a dramatic overhaul of the classic AliceOS and may break upon installation. Please review everything carefully.

        +
        +

        General

          -
        • ScreenKit now include horizontal scrollbars and radio buttons.
        • -
        • ScreenKit frames are more rectangular.
        • +
        • The system organization has migrated over to a macOS-styled directory structure with System, Library, and Applications.
        • +
        • Installation has changed over to an RPA-based solution. Installation now is as simple as dragging the RPA.
        • +
        • AliceOS APIs, class names, and function names have been renamed and switch over to camel case instead of snake case.

        Apps

          +
        • Applets have been deprecated in favor of new apps written with AppKit in mind.
        • +
        • Apps no longer need to declare a desktop shell component as this is handled by the native applicationWillLaunch method.
        • +
        • Apps can now write starup/login services via applicationWillLaunchAtLogin() and check for System Events permissions with applicationShouldLaunchAtLogin().
        • +
        • Notifications and alerts in AppKit are now invoked in a new context instead of interrupting the current one.
        • +
        • The 48 pixel icon entry in ASAppRepresentative has been re-added.
        • +
        • If unimplemented, applicationWillLaunch() will log a warning in the terminal.
        • Introduces a new Inventories app, a fast and fun way to create and manage a game inventory.
        -

        About AliceOS

        +

        Messages

          -
        • The Ren'Py version should now match the proper built version and not be hard-coded.
        • +
        • Messages now displays a "Coming Soon" alert when launched from the Desktop.
        • +
        +

        Core Services and Applications

        +
          +
        • Applications such as Messages have been moved to System/Applications/ and use AppKit.
        • +
        • The halt screen, bootloader, and Setup Assistant are now Core Services that use ServiceKit.
        • +
        +

        Desktop

        +
          +
        • The Desktop now uses the applicationWillLaunch method from AppKit apps to start apps accordingly and will invoke applicationWillLaunch as a Ren'Py function callback.
        • +
        • The Desktop image is defined as AS_DESKTOP_IMG.
        • +
        • The Desktop now refreshes quickly to get the latest time on the clock.
        • +
        +

        Halt screens (formerly Stop errors)

        +
          +
        • The halt screen uses the AliceOS dynamic blur instead of its own background.
        • +
        • A QR code has been added that redirects users to the AliceOS Error Database.
        • +
        • The text has been changed to indicate how long before AliceOS will automatically restart the game.
        • +
        +

        Notifications

        +
          +
        • Notifications are now under the NotificationKit framework.
        • +
        • Alerts no longer appear as a white square. They now use the AliceOS dynamic blur feature.
        • +
        +

        Bootloader

        +
          +
        • The bootloader will now attempt to run any authorized startup services in a new thread.
        • +
        • An optional bootView parameter allows developers to set a custom boot screen to display instead of the default.

        Setup Assistant

          +
        • Express Mode is on by default, but can be disabled in the bootloader's boot method.
        • +
        • Instructions have been rewritten for conciseness and clarity.
        • +
        • The interface has changed to a more macOS-like experience.
        • Setup Assistant now uses ScreenKit to draw elements.
        +

        ScreenKit

        +
          +
        • ScreenKit has been introduced as a means of creating user interfaces for AliceOS using Ren'Py's screen language and styling.
        • +
        • Styles for frames, vertical and horizontal boxes, text, checkbox buttons, vertical scrollbars, and push buttons have been implemented.
        • +
        • ASInterfaceTitlebar has been implemented as a smaller component to add a title bar to a given frame.
        • +
        • ScreenKit now include horizontal scrollbars and radio buttons.
        • +
        • ScreenKit frames are more rectangular.
        • +
        +

        About AliceOS

        +
          +
        • The main interface has been written entirely with ScreenKit and displays information from system definitions.
            +
          • The Ren'Py version should now match the proper built version and not be hard-coded.
          • +
          +
        • +
        +

        App Manager

        +
          +
        • App Manager has been introduced as a means of managing an app's permissions and viewing details about the app.
        • +
        • Apps in App Manager list their permissions as toggleable checkboxes.
        • +
        +

        Changes since Developer Beta 3

        +

        Inventories

        +
          +
        • ASInventoryItem objects can now have an optional ID field, itemId.
        • +
        • ASInventories includes new methods:
            +
          • export(filter=None): Return the inventory with a filter, if specified.
          • +
          • getItemById(itemId): Find an item by its ID.
          • +
          +
        • +
        +

        AppKit

        +
          +
        • Permission strings now reference App Manager instead of Settings.
        • +
        +

        Desktop

        +
          +
        • showDesktop() now calls renpy.show_screen instead of renpy.call_screen. For the old behavior, reference _callDesktop().
        • +
        +

        CI/CD

        +
          +
        • AliceOS now produces builds on every push/pull request that can be accessed on GitHub Actions.
        • +
        +
        +

        Warning

        +

        Treat these builds from GitHub as a developer release; do not use these builds in production-ready visual novels.

        +
        diff --git a/docs/System/01-definitions/index.html b/docs/System/01-definitions/index.html index 7afa4ab..5c13dd5 100644 --- a/docs/System/01-definitions/index.html +++ b/docs/System/01-definitions/index.html @@ -645,8 +645,8 @@
      • - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
      • @@ -699,6 +699,18 @@ + + + + + +
      • + + Prospect Park (2.0.0) Developer Beta 3 + +
      • + +
      @@ -1046,7 +1058,7 @@

      Permissions definitions

      diff --git a/docs/System/02-default-apps/index.html b/docs/System/02-default-apps/index.html index 987feb7..a89de38 100644 --- a/docs/System/02-default-apps/index.html +++ b/docs/System/02-default-apps/index.html @@ -645,8 +645,8 @@
    69. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    70. @@ -699,6 +699,18 @@ + + + + + +
    71. + + Prospect Park (2.0.0) Developer Beta 3 + +
    72. + + diff --git a/docs/System/03-core-services/index.html b/docs/System/03-core-services/index.html index 7b5be6e..50c4027 100644 --- a/docs/System/03-core-services/index.html +++ b/docs/System/03-core-services/index.html @@ -645,8 +645,8 @@
    73. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    74. @@ -699,6 +699,18 @@ + + + + + +
    75. + + Prospect Park (2.0.0) Developer Beta 3 + +
    76. + + diff --git a/docs/System/04-critical-errors/index.html b/docs/System/04-critical-errors/index.html index 059d2d4..7fb9571 100644 --- a/docs/System/04-critical-errors/index.html +++ b/docs/System/04-critical-errors/index.html @@ -645,8 +645,8 @@
    77. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    78. @@ -699,6 +699,18 @@ + + + + + +
    79. + + Prospect Park (2.0.0) Developer Beta 3 + +
    80. + + diff --git a/docs/System/05-bootloader/index.html b/docs/System/05-bootloader/index.html index 0b4f2c4..eb6b027 100644 --- a/docs/System/05-bootloader/index.html +++ b/docs/System/05-bootloader/index.html @@ -645,8 +645,8 @@
    81. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    82. @@ -699,6 +699,18 @@ + + + + + +
    83. + + Prospect Park (2.0.0) Developer Beta 3 + +
    84. + + diff --git a/docs/System/06-setup-assistant/index.html b/docs/System/06-setup-assistant/index.html index f91824c..32d56ab 100644 --- a/docs/System/06-setup-assistant/index.html +++ b/docs/System/06-setup-assistant/index.html @@ -645,8 +645,8 @@
    85. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    86. @@ -699,6 +699,18 @@ + + + + + +
    87. + + Prospect Park (2.0.0) Developer Beta 3 + +
    88. + + diff --git a/docs/System/07-inventories/index.html b/docs/System/07-inventories/index.html index 8e4f16b..114641e 100644 --- a/docs/System/07-inventories/index.html +++ b/docs/System/07-inventories/index.html @@ -645,8 +645,8 @@
    89. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    90. @@ -699,6 +699,18 @@ + + + + + +
    91. + + Prospect Park (2.0.0) Developer Beta 3 + +
    92. + + @@ -877,6 +889,13 @@ isEmpty() + + +
    93. + + export(filter=None) + +
    94. @@ -901,8 +920,15 @@
    95. - - addItem(item) + + getItemById(itemId) + + +
    96. + +
    97. + + addItem(item, silent=False)
    98. @@ -1024,6 +1050,13 @@ isEmpty() + + +
    99. + + export(filter=None) + +
    100. @@ -1048,8 +1081,15 @@
    101. - - addItem(item) + + getItemById(itemId) + + +
    102. + +
    103. + + addItem(item, silent=False)
    104. @@ -1153,6 +1193,7 @@

      Creating an item
    105. description: String containing the description of the item. Defaults to an empty string.
    106. canBeUsed: Boolean dictating whether the item can be used. Defaults to True.
    107. @@ -1168,7 +1209,26 @@

      callRecentItems()Opens the Inventories HUD which lets players access the first five items in the inventory. Useful in the quick menu or in scenarios where opening the Inventories app is impractical.

      isEmpty()

      Returns whether the inventory is empty or not as a boolean.

      +

      export(filter=None)

      +

      Returns the inventory as a list.

      +

      Parameters:

      + +
      +

      Example

      +

      The following can be used to grab the inventory, containing only the items' IDs.

      +
      filter_id = lambda item: item.itemId
      +items_by_id = inventory.export(filter=filter_id)
      +
      + + +

      retrieve()

      +
      +

      Warning

      +

      This method had been deprecated in favor of export(filter=None) as of Prospect Park 2.0.0-devbeta4.

      +

      Returns the inventory as a list of items (ASInventoryItem).

      containsItem(item)

      Checks whether the inventory contains a specific item.

      @@ -1184,11 +1244,19 @@

      getItemByName(name)name: String containing the name of the item

      Returns: The appropriate ASInventoryItem object if found or None if the search fails.

      -

      addItem(item)

      +

      getItemById(itemId)

      +

      Looks for an item in the inventory and returns it, if possible.

      +

      Parameters

      + +

      Returns: The appropriate ASInventoryItem object if found or None if the search fails.

      +

      addItem(item, silent=False)

      Adds an item to the inventory if possible and displays a notification if the user permits.

      Parameters

      Raises: May raise a TypeError if the item isn't an ASInventoryItem object

      useItem(item)

      @@ -1208,7 +1276,7 @@

      importFromList(list)Saving the inventory

      It might be helpful to make sure that the player's inventory is properly saved since the class re-initialized with an empty inventory from the beginning. We recommend storing the current inventory before closing out the game. For example, if you wanted to store the inventory to the persistent file:

      label quit:
      -    $ persistent.saved_inventory = inventory.retrieve()
      +    $ persistent.saved_inventory = inventory.export()
           return
       
      diff --git a/docs/index.html b/docs/index.html index ef25e33..086b9e7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -681,8 +681,8 @@
    108. - - Prospect Park (2.0.0) Developer Beta 3 + + Prospect Park (2.0.0)
    109. @@ -735,6 +735,18 @@ + + + + + +
    110. + + Prospect Park (2.0.0) Developer Beta 3 + +
    111. + + @@ -894,7 +906,7 @@

      Welcome

      AliceOS Screenshot

      -

      AliceOS 2.0.0 Build Status

      +

      Latest release on GitHub Build Status

      AliceOS is a robust and evolving framework for developing interactive visual novel experiences with operating system-like features such as notifications and setup assistants.

      Features and Principles

      The core principles of AliceOS are:

      diff --git a/docs/search/search_index.json b/docs/search/search_index.json index fa6fa4e..d70239e 100644 --- a/docs/search/search_index.json +++ b/docs/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome AliceOS is a robust and evolving framework for developing interactive visual novel experiences with operating system-like features such as notifications and setup assistants. Features and Principles The core principles of AliceOS are: Modular : AliceOS uses a new framework format, under the .aosframework format. These frameworks are placed in the System/Frameworks folder and are not heavily reliant on AppKit.aosframework. However, the definitions file that states the default directories and what-not must be included in the System folder (including fonts). Apple-style APIs : AliceOS's APIs aim to be easy-to-use and familiar to developers that have worked with APIs for macOS, iOS, tvOS, and watchOS. Safely extensible : AliceOS includes support for extending itself with apps that are protected using appropriate, official APIs. Easy-to-install : AliceOS installation is as easy as just copying the Ren'Py archive over to the game folder.","title":"Welcome"},{"location":"#welcome","text":"AliceOS is a robust and evolving framework for developing interactive visual novel experiences with operating system-like features such as notifications and setup assistants.","title":"Welcome"},{"location":"#features-and-principles","text":"The core principles of AliceOS are: Modular : AliceOS uses a new framework format, under the .aosframework format. These frameworks are placed in the System/Frameworks folder and are not heavily reliant on AppKit.aosframework. However, the definitions file that states the default directories and what-not must be included in the System folder (including fonts). Apple-style APIs : AliceOS's APIs aim to be easy-to-use and familiar to developers that have worked with APIs for macOS, iOS, tvOS, and watchOS. Safely extensible : AliceOS includes support for extending itself with apps that are protected using appropriate, official APIs. Easy-to-install : AliceOS installation is as easy as just copying the Ren'Py archive over to the game folder.","title":"Features and Principles"},{"location":"01-install/","text":"Installing AliceOS This document will help you get started with installing AliceOS and attaching it to your Ren'Py project. Downloading the base system If you do not plan to customize AliceOS too much, you can add the base system archive and use AliceOS that way. Download the latest release from the Downloads page and extract the ZIP archive. Then, copy AliceOSBaseSystem.rpa over to your Ren'Py project's game folder. Ensure compatibility The latest version of AliceOS for download will always correspond to the latest version of the Ren'Py SDK made available at that time. At the time of writing, this means that AliceOS is building against Ren'Py SDK v 7.3.2 . If you are unsure of what version AliceOS is built with, check the Travis results and click on \"Ren'Py Latest SDK\". It is recommend that you make sure that your version of Ren'Py is up to date to ensure compatibility with AliceOS. Usage with DDLC Mods If you plan to use AliceOS in a mod for Doki Doki Literature Club! , you must make sure that the base system version that you use is built against Ren'Py 6.99.12.4 to maintain compatibility. The release ZIP file is generally noted as 'AliceOS-x.x.x-_AliceOSBaseSystem-rp6.zip'. Building from source code Alternatively, you can build AliceOSBaseSystem.rpa yourself with the customization you need. This may also be helpful in building AliceOS for your specific Ren'Py version, if necessary. Download the source code for the particular release you'd like and open Ren'Py Launcher. Select the AliceOS source code and click \"Build Distributions\". Uncheck the distribution options and check \"Alice OS Base System Distributable\". Click \"Build\". Your resulting ZIP file will be located in AliceOS-x.x.x-dists , and you can follow the instructions from Downloading the base system to finalize installation.","title":"Installing AliceOS"},{"location":"01-install/#installing-aliceos","text":"This document will help you get started with installing AliceOS and attaching it to your Ren'Py project.","title":"Installing AliceOS"},{"location":"01-install/#downloading-the-base-system","text":"If you do not plan to customize AliceOS too much, you can add the base system archive and use AliceOS that way. Download the latest release from the Downloads page and extract the ZIP archive. Then, copy AliceOSBaseSystem.rpa over to your Ren'Py project's game folder. Ensure compatibility The latest version of AliceOS for download will always correspond to the latest version of the Ren'Py SDK made available at that time. At the time of writing, this means that AliceOS is building against Ren'Py SDK v 7.3.2 . If you are unsure of what version AliceOS is built with, check the Travis results and click on \"Ren'Py Latest SDK\". It is recommend that you make sure that your version of Ren'Py is up to date to ensure compatibility with AliceOS.","title":"Downloading the base system"},{"location":"01-install/#usage-with-ddlc-mods","text":"If you plan to use AliceOS in a mod for Doki Doki Literature Club! , you must make sure that the base system version that you use is built against Ren'Py 6.99.12.4 to maintain compatibility. The release ZIP file is generally noted as 'AliceOS-x.x.x-_AliceOSBaseSystem-rp6.zip'.","title":"Usage with DDLC Mods"},{"location":"01-install/#building-from-source-code","text":"Alternatively, you can build AliceOSBaseSystem.rpa yourself with the customization you need. This may also be helpful in building AliceOS for your specific Ren'Py version, if necessary. Download the source code for the particular release you'd like and open Ren'Py Launcher. Select the AliceOS source code and click \"Build Distributions\". Uncheck the distribution options and check \"Alice OS Base System Distributable\". Click \"Build\". Your resulting ZIP file will be located in AliceOS-x.x.x-dists , and you can follow the instructions from Downloading the base system to finalize installation.","title":"Building from source code"},{"location":"02-contributing/","text":"Contribution Guidelines AliceOS is free and open-source software, hosted on GitHub, and accepts contributions from the community. To make the contribution process quick, smooth, easy, and fun, we've devised a set of guidelines to ensure code quality and security. Please consult these when making a pull request, issue, etc. General Code Guidelines These guidelines apply to code that is written in AliceOS. Follow the AliceOS API Styling Although AliceOS is a Python-based framework, our APIs are similarly written to those of the APIs used when creating macOS and iOS apps and are in camel case. This usually serves two purposes: To identify AliceOS code from the rest of a visual novel project To make it easy to understand when migrating from Apple platform development Example: applicationWillRequestNotification vs. application_will_request_notification System-wide variables such as release names should be capitalized and use snake case as normal. Example: AS_SYS_VERSION vs. asSysVersion Follow commit conventions The AliceOS team has adopted the same commit conventions from Clarity , the parent organization running Sayonika. This commit style definitely explains where changes occured and what was changed in a succinct manner. However, there are some changes we have made to this commit style: Common directories such as System, Applications, and Library do not need to be fully typed out. File extensions for frameworks ( .aosframework ), core services ( .aoscservice ), and applications ( .aosapp ) do not need to be typed out. Example: [S/F/ServiceKit] Resolve misnaming of serviceWillRequestNotification from applicationWillRequestNotification Keep code organized The AliceOS structure is organized based on a simple macOS file structure to make everything easy to locate. Please try to keep this organization when contributing your code. Issues These guidelines apply to issues on GitHub. Be as descriptive and concise as possible So that AliceOS contributors and developers can better understand what the issue or request may be, issue descriptions should be concise but also descrptive. Refrain from writing an issue in a convoluted way that confuses others. Additionally, if you feel using a screenshot or video will better illustrate your description, add them in conjuction with (or to replace) the description. Remember to consult the Screenshot Guidelines . Label your issue during creation Issues are categorized by types such as bug , enhancement , question , etc. by contributors that can access labels. Since it isn't possible to tag an issue during creation, prepend the tag to your issue's title. Example: [Bug] applicationShouldRequestNotification always returns False Pull Requests These guides apply to pull requests on GitHub. Describe all of your changes Pull requests generally include many changes that address a particular problem or a set of problems. Explain all of the changes you made; you may also specify the subsystems (directories) by using the commit message style. Example: This PR makes the following changes: [S/F/ServiceKit] Renames applicationWillRequestSync to serviceWillRequestSync [S/A/Messages] Adds new MessagesView to view conversation history Reference existing issues and PRs If applicable, pull requests will reference the issues they are fixing in the description. This helps organize contributions in a few ways: Automates closing issues when they are fixed Verifies that the pull request fixes the issue(s) in question Makes a reference in the issue's thread for context If there are any documented issues that the pull request addresses, reference them in the description of the pull request. Example: [S/A/Logokas] Resolve applicationShouldRequestLogokasPermission to correct booleans (fixes #1) Screenshots These guidelines apply to screenshots that are used for reference in issues and/or pull requests. Respect the user's/developer's visibility Make sure that your screenshots don't display personally-identifiable information. When possible, try to use fake data designed for testing instead of real data. Ensure screenshots are clear Screenshots are often included to help illustrate or demonstrate a point with an issue or pull request. It may be difficult to understand the screenshot's purpose if the image is too small or distorted. Ensure that all screenshots are clear and visible. For Official Contributors For official developers and Project Alice members, there are some additional guidelines to follow to ensure that code is signed and verified: Sign off your code and enable verified commits Verified commits let developers, contributors, and users know that the code they are working with is from a trusted source. These commits are signed using GPG or S/MIME and are verified on GitHub. It is mandatory that AliceOS developers and Project Alice members set up verified commits on their device(s) and any tools to digitally sign their code when pushing to GitHub. More information can be found on GitHub's support page .","title":"Contribution Guidelines"},{"location":"02-contributing/#contribution-guidelines","text":"AliceOS is free and open-source software, hosted on GitHub, and accepts contributions from the community. To make the contribution process quick, smooth, easy, and fun, we've devised a set of guidelines to ensure code quality and security. Please consult these when making a pull request, issue, etc.","title":"Contribution Guidelines"},{"location":"02-contributing/#general-code-guidelines","text":"These guidelines apply to code that is written in AliceOS.","title":"General Code Guidelines"},{"location":"02-contributing/#follow-the-aliceos-api-styling","text":"Although AliceOS is a Python-based framework, our APIs are similarly written to those of the APIs used when creating macOS and iOS apps and are in camel case. This usually serves two purposes: To identify AliceOS code from the rest of a visual novel project To make it easy to understand when migrating from Apple platform development Example: applicationWillRequestNotification vs. application_will_request_notification System-wide variables such as release names should be capitalized and use snake case as normal. Example: AS_SYS_VERSION vs. asSysVersion","title":"Follow the AliceOS API Styling"},{"location":"02-contributing/#follow-commit-conventions","text":"The AliceOS team has adopted the same commit conventions from Clarity , the parent organization running Sayonika. This commit style definitely explains where changes occured and what was changed in a succinct manner. However, there are some changes we have made to this commit style: Common directories such as System, Applications, and Library do not need to be fully typed out. File extensions for frameworks ( .aosframework ), core services ( .aoscservice ), and applications ( .aosapp ) do not need to be typed out. Example: [S/F/ServiceKit] Resolve misnaming of serviceWillRequestNotification from applicationWillRequestNotification","title":"Follow commit conventions"},{"location":"02-contributing/#keep-code-organized","text":"The AliceOS structure is organized based on a simple macOS file structure to make everything easy to locate. Please try to keep this organization when contributing your code.","title":"Keep code organized"},{"location":"02-contributing/#issues","text":"These guidelines apply to issues on GitHub.","title":"Issues"},{"location":"02-contributing/#be-as-descriptive-and-concise-as-possible","text":"So that AliceOS contributors and developers can better understand what the issue or request may be, issue descriptions should be concise but also descrptive. Refrain from writing an issue in a convoluted way that confuses others. Additionally, if you feel using a screenshot or video will better illustrate your description, add them in conjuction with (or to replace) the description. Remember to consult the Screenshot Guidelines .","title":"Be as descriptive and concise as possible"},{"location":"02-contributing/#label-your-issue-during-creation","text":"Issues are categorized by types such as bug , enhancement , question , etc. by contributors that can access labels. Since it isn't possible to tag an issue during creation, prepend the tag to your issue's title. Example: [Bug] applicationShouldRequestNotification always returns False","title":"Label your issue during creation"},{"location":"02-contributing/#pull-requests","text":"These guides apply to pull requests on GitHub.","title":"Pull Requests"},{"location":"02-contributing/#describe-all-of-your-changes","text":"Pull requests generally include many changes that address a particular problem or a set of problems. Explain all of the changes you made; you may also specify the subsystems (directories) by using the commit message style. Example: This PR makes the following changes: [S/F/ServiceKit] Renames applicationWillRequestSync to serviceWillRequestSync [S/A/Messages] Adds new MessagesView to view conversation history","title":"Describe all of your changes"},{"location":"02-contributing/#reference-existing-issues-and-prs","text":"If applicable, pull requests will reference the issues they are fixing in the description. This helps organize contributions in a few ways: Automates closing issues when they are fixed Verifies that the pull request fixes the issue(s) in question Makes a reference in the issue's thread for context If there are any documented issues that the pull request addresses, reference them in the description of the pull request. Example: [S/A/Logokas] Resolve applicationShouldRequestLogokasPermission to correct booleans (fixes #1)","title":"Reference existing issues and PRs"},{"location":"02-contributing/#screenshots","text":"These guidelines apply to screenshots that are used for reference in issues and/or pull requests.","title":"Screenshots"},{"location":"02-contributing/#respect-the-usersdevelopers-visibility","text":"Make sure that your screenshots don't display personally-identifiable information. When possible, try to use fake data designed for testing instead of real data.","title":"Respect the user's/developer's visibility"},{"location":"02-contributing/#ensure-screenshots-are-clear","text":"Screenshots are often included to help illustrate or demonstrate a point with an issue or pull request. It may be difficult to understand the screenshot's purpose if the image is too small or distorted. Ensure that all screenshots are clear and visible.","title":"Ensure screenshots are clear"},{"location":"02-contributing/#for-official-contributors","text":"For official developers and Project Alice members, there are some additional guidelines to follow to ensure that code is signed and verified:","title":"For Official Contributors"},{"location":"02-contributing/#sign-off-your-code-and-enable-verified-commits","text":"Verified commits let developers, contributors, and users know that the code they are working with is from a trusted source. These commits are signed using GPG or S/MIME and are verified on GitHub. It is mandatory that AliceOS developers and Project Alice members set up verified commits on their device(s) and any tools to digitally sign their code when pushing to GitHub. More information can be found on GitHub's support page .","title":"Sign off your code and enable verified commits"},{"location":"Develop-Apps/","text":"Welcome Apps are a fun and extensible means of further enhancing the AliceOS environment without needing to customize the base installation and recompile from source. Apps also take advantage of AliceOS's features and frameworks, such as NotificationKit and ScreenKit. To accomplish this, apps use AppKit, the official API set for writing custom apps for the AliceOS framework. About this section The following documentation will cover the important facets of creating an AliceOS app and what frameworks are available. It will also cover important guidelines that all AliceOS apps should follow to maintain security, privacy, and consistency.","title":"Welcome"},{"location":"Develop-Apps/#welcome","text":"Apps are a fun and extensible means of further enhancing the AliceOS environment without needing to customize the base installation and recompile from source. Apps also take advantage of AliceOS's features and frameworks, such as NotificationKit and ScreenKit. To accomplish this, apps use AppKit, the official API set for writing custom apps for the AliceOS framework.","title":"Welcome"},{"location":"Develop-Apps/#about-this-section","text":"The following documentation will cover the important facets of creating an AliceOS app and what frameworks are available. It will also cover important guidelines that all AliceOS apps should follow to maintain security, privacy, and consistency.","title":"About this section"},{"location":"Develop-Apps/01-manifest/","text":"Declaring Your App Any app for AliceOS has its own manifest and declarations for what the app does. Luckily, defining an app is as easy as writing it directly into the class that all AliceOS apps inherit from. Typical app structure Apps are usually located in Applications , inside of the game folder, and have the file extension .aosapp . Inside of the file, a Ren'Py script help determine details about the app, and a Resources folder is included to add assets such as icons, images, and definitions. For instance, if we are creating an app call Foobanizer , the structure would look like this: game / Applications / Foobanizer . aosapp / Foobanizer . rpy Resources / Iconset / 16 . png 24 . png 32 . png 48 . png 64 . png 128 . png 256 . png Note that the icons are located in Resources/Iconset/ and have sizes for 16px, 24px, 32px, 48px, 64px, 128px, and 256px. These icons are important as they will appear in notifications, the desktop, and other places that require an icon. Writing your app's manifest AliceOS apps' manifests are included directly inside of their main app delegate, a subclass of ASAppRepresentative() . There are several important key field that should be directly written: bundleName : The name of the application. bundleId : The ID of the application in reverse domain name notation . bundleDir : The location of the application. By default, apps use AS_APPS_DIR + \" applicationname .aosapp/\" . bundleAuthor : The author or organization that developed the application. bundleVersion : The version of the application. bundleDescription : The description of the application. Agan, if we wanted to write Foobanizer's manifest, it'd look like this: init 10 python : class Foobanizer ( ASAppRepresentative ): bundleName = Foobanizer bundleId = app.aliceos.foobanizer bundleDir = AS_APPS_DIR + Foobanizer.aosapp/ bundleAuthor = AliceOS Developers bundleVersion = 1.0.0 bundleDescription = \\ Generate random foobanized strings on the fly. ... Declaring permissions Apps that need to make use of notifications via NotificationKit, modify files, watch system events, etc., must declare their permissions. This is done inside of the class via the requires dictionary: requires = { } The main permissions are: AS_REQUIRES_NOTIFICATIONKIT : Requires NotificationKit to send notifications AS_REQUIRES_FULL_DISK_ACCESS : Requires accessing files AS_REQUIRES_SYSTEM_EVENTS : Requires changing settings or watching for events Important All AppKit apps must include this field. If you don't need any permissions or aren't using specific frameworks, leave the dictionary empty. Rebuilding icons Icons for AliceOS apps typically reside in the app's Resources folder, though ASAppRepresentative may not pick it up at first. To ensure your app's icon locations are updated, make sure you initialize the class, where applicationname is the name of your app: def __init__ ( self ): ASAppRepresentative . __init__ ( self , AS_DEFAULT_APP_DIR + applicationname .aosapp/ ) Again, if we wanted to rebuild Foobanizer's icons: def __init__ ( self ): ASAppRepresentative . __init__ ( self , AS_APPS_DIR + Foobanizer.aosapp/ ) Example manifest Here's what the manifest file for Foobanizer would look like: # ASAppRepresentative is a Python class. # Everything must be wrapped in a Python block. init 10 python : class Foobanizer ( ASAppRepresentative ): bundleName = Foobanizer bundleId = app.aliceos.foobanizer bundleDir = AS_APPS_DIR + Foobanizer.aosapp/ bundleAuthor = AliceOS Developers bundleVersion = 1.0.0 bundleDescription = \\ Generate random foobanized strings on the fly. # Foobanizer doesn t require any permissions. requires = { } def __init__ ( self ): ASAppRepresentative . __init__ ( self , AS_APPS_DIR + Foobanizer.aosapp/ ) # Finally, we create an instance to pre-load. foobanizer = Foobanizer () Suggested documentation ASAppRepresentative","title":"Declaring Your App"},{"location":"Develop-Apps/01-manifest/#declaring-your-app","text":"Any app for AliceOS has its own manifest and declarations for what the app does. Luckily, defining an app is as easy as writing it directly into the class that all AliceOS apps inherit from.","title":"Declaring Your App"},{"location":"Develop-Apps/01-manifest/#typical-app-structure","text":"Apps are usually located in Applications , inside of the game folder, and have the file extension .aosapp . Inside of the file, a Ren'Py script help determine details about the app, and a Resources folder is included to add assets such as icons, images, and definitions. For instance, if we are creating an app call Foobanizer , the structure would look like this: game / Applications / Foobanizer . aosapp / Foobanizer . rpy Resources / Iconset / 16 . png 24 . png 32 . png 48 . png 64 . png 128 . png 256 . png Note that the icons are located in Resources/Iconset/ and have sizes for 16px, 24px, 32px, 48px, 64px, 128px, and 256px. These icons are important as they will appear in notifications, the desktop, and other places that require an icon.","title":"Typical app structure"},{"location":"Develop-Apps/01-manifest/#writing-your-apps-manifest","text":"AliceOS apps' manifests are included directly inside of their main app delegate, a subclass of ASAppRepresentative() . There are several important key field that should be directly written: bundleName : The name of the application. bundleId : The ID of the application in reverse domain name notation . bundleDir : The location of the application. By default, apps use AS_APPS_DIR + \" applicationname .aosapp/\" . bundleAuthor : The author or organization that developed the application. bundleVersion : The version of the application. bundleDescription : The description of the application. Agan, if we wanted to write Foobanizer's manifest, it'd look like this: init 10 python : class Foobanizer ( ASAppRepresentative ): bundleName = Foobanizer bundleId = app.aliceos.foobanizer bundleDir = AS_APPS_DIR + Foobanizer.aosapp/ bundleAuthor = AliceOS Developers bundleVersion = 1.0.0 bundleDescription = \\ Generate random foobanized strings on the fly. ...","title":"Writing your app's manifest"},{"location":"Develop-Apps/01-manifest/#declaring-permissions","text":"Apps that need to make use of notifications via NotificationKit, modify files, watch system events, etc., must declare their permissions. This is done inside of the class via the requires dictionary: requires = { } The main permissions are: AS_REQUIRES_NOTIFICATIONKIT : Requires NotificationKit to send notifications AS_REQUIRES_FULL_DISK_ACCESS : Requires accessing files AS_REQUIRES_SYSTEM_EVENTS : Requires changing settings or watching for events Important All AppKit apps must include this field. If you don't need any permissions or aren't using specific frameworks, leave the dictionary empty.","title":"Declaring permissions"},{"location":"Develop-Apps/01-manifest/#rebuilding-icons","text":"Icons for AliceOS apps typically reside in the app's Resources folder, though ASAppRepresentative may not pick it up at first. To ensure your app's icon locations are updated, make sure you initialize the class, where applicationname is the name of your app: def __init__ ( self ): ASAppRepresentative . __init__ ( self , AS_DEFAULT_APP_DIR + applicationname .aosapp/ ) Again, if we wanted to rebuild Foobanizer's icons: def __init__ ( self ): ASAppRepresentative . __init__ ( self , AS_APPS_DIR + Foobanizer.aosapp/ )","title":"Rebuilding icons"},{"location":"Develop-Apps/01-manifest/#example-manifest","text":"Here's what the manifest file for Foobanizer would look like: # ASAppRepresentative is a Python class. # Everything must be wrapped in a Python block. init 10 python : class Foobanizer ( ASAppRepresentative ): bundleName = Foobanizer bundleId = app.aliceos.foobanizer bundleDir = AS_APPS_DIR + Foobanizer.aosapp/ bundleAuthor = AliceOS Developers bundleVersion = 1.0.0 bundleDescription = \\ Generate random foobanized strings on the fly. # Foobanizer doesn t require any permissions. requires = { } def __init__ ( self ): ASAppRepresentative . __init__ ( self , AS_APPS_DIR + Foobanizer.aosapp/ ) # Finally, we create an instance to pre-load. foobanizer = Foobanizer ()","title":"Example manifest"},{"location":"Develop-Apps/01-manifest/#suggested-documentation","text":"ASAppRepresentative","title":"Suggested documentation"},{"location":"Develop-Apps/02-sending-notifications/","text":"Sending Notifications Notifications are a great way to extend your visual novel project. If done correctly, they often can add an interactive experience that immerses players into the environment. Apps using AppKit have a way to send notification requests to the user that also respect's users' preferences. Declaring notification permissions Your app should have the proper permissions to send notifications via NotificationKit in the app's manifest. To ensure that your app lists itself as needing this permission, be sure to add AS_REQUIRES_NOTIFICATIONKIT into the requires field: requires = { AS_REQUIRES_NOTIFICATIONKIT , ... } Requesting for permission Typically, apps request for notification access before sending notification requests. There are two methods for handling this behavior: requestAllPermissions() will request for all permissions available. Use this only if notifications are dependent on other permissions that must be addressed immediately. requestPermission(forPermission=AS_REQUIRES_NOTIFICATIONKIT) will request specifically for the NotificationKit permission. Sending a temporary notification request (banner) Apps using AppKit have an official means of handling temporary notifications as banners via several methods. More details are provided on the Banners page . applicationShouldRequestNotification() This function is provided to check that the app has been given permission to send notifications. Returns Whether the app has been given permission to send notifications as a Boolean value. Danger Do not override this function unless you need to perform an additional check. applicationWillRequestNotification() Parameters message : The message or title of the notification. withDetails : The details of the notification. responseCallback (Optional) The action to perform when clicking 'Respond'. Tip If there are preliminary actions that should be performed before requesting a notification, you may redefine the function, granted that you also include ASAppRepresentative.applicationWillRequestNotification() . Example def applicationWillRequestNotification ( self , message , withDetails , responseCallback ) : if not Error in message : ASAppRepresentative . applicationWillRequestNotification ( message , withDetails , responseCallback ) else : print (Err: + message + ) + withDetails Danger Do not use any other methods for sending temporary notifications that do not listen to applicationShouldRequestNotification() . All notifications should adhere to users' preference. applicationDidRequestNotification() applicationDidRequestNotification() runs after a notification has been sent. This can be used to watch for a particular action or to do something else. Guidelines Banners are intended for temporary actions that can be ignored, if possible. Keep these guidelines in mind when using banners: Refrain from overloading banners . This can be visually distracting and may annoy the user. Keep the message and details short . Banners are intended for a quick glance or something that doesn't require a lot of attention. Don't force the user to interact with the banner . Banners shouldn't require the user to perform an action. Sending an alert request Apps using AppKit can also make use of alerts to present immediate information to the user and ask for an action. Details on how alerts work can be found in the Alerts documentation . applicationWillRequestBasicAlert(message, withDetails, onDismissCallback) Display a basic alert with a title, message, and a callback when 'OK' is clicked. Parameters message : The message or title of the alert. withDetails : The details of the alert. onDismissCallback (Optional) The action to perform when clicking 'OK'. applicationWillRequestExtendedAlert(message, withDetails, primaryActionText, onPrimaryCallback, secondaryActionText, onSecondaryCallback) Display an alert with a title, message, and two action with respective callbacks. Parameters message : The message or title of the alert. withDetails : The details of the alert. primaryActionText : The text for the primary action button onPrimaryCallback (Optional) The action to perform when clicking the primary button. secondaryActionText : (Optional) The text for the secondary action button onSecondaryCallback (Optional) The action to perform when clicking the secondary button. applicationDidRequestAlert() applicationDidRequestAlert() runs after an alert has been displayed. This can be used to watch for any other events during the alert process. Guidelines Refrain from overloading alerts. Alerts can be seen as intrivusive if too many are displayed at one time. Unless the user needs to make an immediate decision, refrain from using an alert. If the content isn't important, consider a banner. Banners are less intrusive by nature and don't require an immediate action. Suggested documentation Notification banners Notification alerts","title":"Sending Notifications"},{"location":"Develop-Apps/02-sending-notifications/#sending-notifications","text":"Notifications are a great way to extend your visual novel project. If done correctly, they often can add an interactive experience that immerses players into the environment. Apps using AppKit have a way to send notification requests to the user that also respect's users' preferences.","title":"Sending Notifications"},{"location":"Develop-Apps/02-sending-notifications/#declaring-notification-permissions","text":"Your app should have the proper permissions to send notifications via NotificationKit in the app's manifest. To ensure that your app lists itself as needing this permission, be sure to add AS_REQUIRES_NOTIFICATIONKIT into the requires field: requires = { AS_REQUIRES_NOTIFICATIONKIT , ... }","title":"Declaring notification permissions"},{"location":"Develop-Apps/02-sending-notifications/#requesting-for-permission","text":"Typically, apps request for notification access before sending notification requests. There are two methods for handling this behavior: requestAllPermissions() will request for all permissions available. Use this only if notifications are dependent on other permissions that must be addressed immediately. requestPermission(forPermission=AS_REQUIRES_NOTIFICATIONKIT) will request specifically for the NotificationKit permission.","title":"Requesting for permission"},{"location":"Develop-Apps/02-sending-notifications/#sending-a-temporary-notification-request-banner","text":"Apps using AppKit have an official means of handling temporary notifications as banners via several methods. More details are provided on the Banners page .","title":"Sending a temporary notification request (banner)"},{"location":"Develop-Apps/02-sending-notifications/#applicationshouldrequestnotification","text":"This function is provided to check that the app has been given permission to send notifications. Returns Whether the app has been given permission to send notifications as a Boolean value. Danger Do not override this function unless you need to perform an additional check.","title":"applicationShouldRequestNotification()"},{"location":"Develop-Apps/02-sending-notifications/#applicationwillrequestnotification","text":"Parameters message : The message or title of the notification. withDetails : The details of the notification. responseCallback (Optional) The action to perform when clicking 'Respond'. Tip If there are preliminary actions that should be performed before requesting a notification, you may redefine the function, granted that you also include ASAppRepresentative.applicationWillRequestNotification() . Example def applicationWillRequestNotification ( self , message , withDetails , responseCallback ) : if not Error in message : ASAppRepresentative . applicationWillRequestNotification ( message , withDetails , responseCallback ) else : print (Err: + message + ) + withDetails Danger Do not use any other methods for sending temporary notifications that do not listen to applicationShouldRequestNotification() . All notifications should adhere to users' preference.","title":"applicationWillRequestNotification()"},{"location":"Develop-Apps/02-sending-notifications/#applicationdidrequestnotification","text":"applicationDidRequestNotification() runs after a notification has been sent. This can be used to watch for a particular action or to do something else.","title":"applicationDidRequestNotification()"},{"location":"Develop-Apps/02-sending-notifications/#guidelines","text":"Banners are intended for temporary actions that can be ignored, if possible. Keep these guidelines in mind when using banners: Refrain from overloading banners . This can be visually distracting and may annoy the user. Keep the message and details short . Banners are intended for a quick glance or something that doesn't require a lot of attention. Don't force the user to interact with the banner . Banners shouldn't require the user to perform an action.","title":"Guidelines"},{"location":"Develop-Apps/02-sending-notifications/#sending-an-alert-request","text":"Apps using AppKit can also make use of alerts to present immediate information to the user and ask for an action. Details on how alerts work can be found in the Alerts documentation .","title":"Sending an alert request"},{"location":"Develop-Apps/02-sending-notifications/#applicationwillrequestbasicalertmessage-withdetails-ondismisscallback","text":"Display a basic alert with a title, message, and a callback when 'OK' is clicked. Parameters message : The message or title of the alert. withDetails : The details of the alert. onDismissCallback (Optional) The action to perform when clicking 'OK'.","title":"applicationWillRequestBasicAlert(message, withDetails, onDismissCallback)"},{"location":"Develop-Apps/02-sending-notifications/#applicationwillrequestextendedalertmessage-withdetails-primaryactiontext-onprimarycallback-secondaryactiontext-onsecondarycallback","text":"Display an alert with a title, message, and two action with respective callbacks. Parameters message : The message or title of the alert. withDetails : The details of the alert. primaryActionText : The text for the primary action button onPrimaryCallback (Optional) The action to perform when clicking the primary button. secondaryActionText : (Optional) The text for the secondary action button onSecondaryCallback (Optional) The action to perform when clicking the secondary button.","title":"applicationWillRequestExtendedAlert(message, withDetails, primaryActionText, onPrimaryCallback, secondaryActionText, onSecondaryCallback)"},{"location":"Develop-Apps/02-sending-notifications/#applicationdidrequestalert","text":"applicationDidRequestAlert() runs after an alert has been displayed. This can be used to watch for any other events during the alert process.","title":"applicationDidRequestAlert()"},{"location":"Develop-Apps/02-sending-notifications/#guidelines_1","text":"Refrain from overloading alerts. Alerts can be seen as intrivusive if too many are displayed at one time. Unless the user needs to make an immediate decision, refrain from using an alert. If the content isn't important, consider a banner. Banners are less intrusive by nature and don't require an immediate action.","title":"Guidelines"},{"location":"Develop-Apps/02-sending-notifications/#suggested-documentation","text":"Notification banners Notification alerts","title":"Suggested documentation"},{"location":"Develop-Apps/03-interface-design/","text":"Giving your App an Interface Some apps may want to provide a user interface for players to work with to manage settings or work with things in-game. AppKit works hand-in-hand with Ren'Py's screens and makes it easy to work with a Ren'Py-defined UI. AliceOS also comes with ScreenKit, a great way to define an interface that's designed for AliceOS. Attaching a screen to your app Apps that want to display an interface when their icon is clicked in Activities or the App Manager should show the screen in their applicationWillLaunch method, like so: def applicationWillLaunch ( self ): renpy . show_screen ( screenname ) Although it's recommended to design the app's interface with ScreenKit for consistency, this will work for any screen defined in a Ren'Py project. Creating an interface with ScreenKit Creating an interface with ScreenKit is relatively easy since ScreenKit works directly with Ren'Py's screen language. For an existing screen, it's easy to port it over to ScreenKit by adding the style_prefix property at the top of the screen: screen my_screen (): style_prefix ASInterface ... If you are creating an interface from scratch, you can take a look at how to create a very basic UI using screen language and ScreenKit in A Simple UI . Organizing screens in your app Apps might have multiple screens and may lose track of what screen goes where. We recommend adopting a similar structure to the one below to keep your screens organized: AppRoot / Resources / Views / ScreenName . rpy SecondScreen . rpy Styles / ScreenStyles . rpy AppManifest . rpy Suggested documentation A Simple UI Special ScreenKit Styles","title":"Giving your App an Interface"},{"location":"Develop-Apps/03-interface-design/#giving-your-app-an-interface","text":"Some apps may want to provide a user interface for players to work with to manage settings or work with things in-game. AppKit works hand-in-hand with Ren'Py's screens and makes it easy to work with a Ren'Py-defined UI. AliceOS also comes with ScreenKit, a great way to define an interface that's designed for AliceOS.","title":"Giving your App an Interface"},{"location":"Develop-Apps/03-interface-design/#attaching-a-screen-to-your-app","text":"Apps that want to display an interface when their icon is clicked in Activities or the App Manager should show the screen in their applicationWillLaunch method, like so: def applicationWillLaunch ( self ): renpy . show_screen ( screenname ) Although it's recommended to design the app's interface with ScreenKit for consistency, this will work for any screen defined in a Ren'Py project.","title":"Attaching a screen to your app"},{"location":"Develop-Apps/03-interface-design/#creating-an-interface-with-screenkit","text":"Creating an interface with ScreenKit is relatively easy since ScreenKit works directly with Ren'Py's screen language. For an existing screen, it's easy to port it over to ScreenKit by adding the style_prefix property at the top of the screen: screen my_screen (): style_prefix ASInterface ... If you are creating an interface from scratch, you can take a look at how to create a very basic UI using screen language and ScreenKit in A Simple UI .","title":"Creating an interface with ScreenKit"},{"location":"Develop-Apps/03-interface-design/#organizing-screens-in-your-app","text":"Apps might have multiple screens and may lose track of what screen goes where. We recommend adopting a similar structure to the one below to keep your screens organized: AppRoot / Resources / Views / ScreenName . rpy SecondScreen . rpy Styles / ScreenStyles . rpy AppManifest . rpy","title":"Organizing screens in your app"},{"location":"Develop-Apps/03-interface-design/#suggested-documentation","text":"A Simple UI Special ScreenKit Styles","title":"Suggested documentation"},{"location":"Develop-Apps/04-watching-events/","text":"Watching for Events Starting with AliceOS Prospect Park, apps can declare and make use of System Events. Apps that want to use system event watching must declare the AS_REQUIRES_SYSTEM_EVENTS permission in their manifest and use the appropriate methods outlined in this document. What are system events? Any operation that AliceOS performs such as startup, login, or displaying an error is considered a system event. Apps that have the permission can access the following system events: Startup Running tasks during boot Apps using AppKit may want to perform some initialization tasks when AliceOS boots. This can be accomplished by making use of the applicationWillLaunchAtLogin method. applicationWillLaunchAtLogin(self) Runs any initial tasks or specified startup tasks during boot. applicationShouldLaunchAtLogin(self) Determines whether the application has permission to run tasks during boot. Returns : Boolean value dictating if the app has permission to run at boot. Suggested documentation ASAppRepresentative Bootloader","title":"Watching for Events"},{"location":"Develop-Apps/04-watching-events/#watching-for-events","text":"Starting with AliceOS Prospect Park, apps can declare and make use of System Events. Apps that want to use system event watching must declare the AS_REQUIRES_SYSTEM_EVENTS permission in their manifest and use the appropriate methods outlined in this document.","title":"Watching for Events"},{"location":"Develop-Apps/04-watching-events/#what-are-system-events","text":"Any operation that AliceOS performs such as startup, login, or displaying an error is considered a system event. Apps that have the permission can access the following system events: Startup","title":"What are system events?"},{"location":"Develop-Apps/04-watching-events/#running-tasks-during-boot","text":"Apps using AppKit may want to perform some initialization tasks when AliceOS boots. This can be accomplished by making use of the applicationWillLaunchAtLogin method.","title":"Running tasks during boot"},{"location":"Develop-Apps/04-watching-events/#applicationwilllaunchatloginself","text":"Runs any initial tasks or specified startup tasks during boot.","title":"applicationWillLaunchAtLogin(self)"},{"location":"Develop-Apps/04-watching-events/#applicationshouldlaunchatloginself","text":"Determines whether the application has permission to run tasks during boot. Returns : Boolean value dictating if the app has permission to run at boot.","title":"applicationShouldLaunchAtLogin(self)"},{"location":"Develop-Apps/04-watching-events/#suggested-documentation","text":"ASAppRepresentative Bootloader","title":"Suggested documentation"},{"location":"Frameworks/AppKit/","text":"AppKit Overview AppKit is the official API responsible for making apps on AliceOS. AppKit contains the necessary pieces of information to create fun and safe applications that work directly with AliceOS. About this documentation section This section will cover most of the Python class documentation and backend information about AppKit and apps built with it. For more information on how to build an app for AliceOS, see the Develop Apps section. Warning AliceOS's AppKit should not be confused with Apple's AppKit for macOS, the interface kit responsible for creating macOS applications.","title":"AppKit Overview"},{"location":"Frameworks/AppKit/#appkit-overview","text":"AppKit is the official API responsible for making apps on AliceOS. AppKit contains the necessary pieces of information to create fun and safe applications that work directly with AliceOS.","title":"AppKit Overview"},{"location":"Frameworks/AppKit/#about-this-documentation-section","text":"This section will cover most of the Python class documentation and backend information about AppKit and apps built with it. For more information on how to build an app for AliceOS, see the Develop Apps section. Warning AliceOS's AppKit should not be confused with Apple's AppKit for macOS, the interface kit responsible for creating macOS applications.","title":"About this documentation section"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/","text":"ASAppRepresentative ASAppRepresentative is the Python class responsible for defining apps in AliceOS. This class acts as the app's delegate and information manifest. The following documentation covers all of the methods and properties of this class. Properties bundleName : The name of the application. bundleId : The ID of the application in reverse domain name notation . bundleDir : The location of the application. By default, apps use AS_APPS_DIR + \" applicationname .aosapp/\" . bundleAuthor : The author or organization that developed the application. bundleVersion : The version of the application. bundleDescription : The description of the application. requires : A dictionary containing all of the permissions needed for the app to function. icons : A dictionary containing the paths of all icons for the appropriate sizes. Methods __init__(appDirectory) Constructs an instance of ASAppRepresentative . Parameters appDirectory : The directory of which the app is located. Equivalent to bundleDir . requestPermission(forPermission) Requests a particular permission located in requires . Parameters forPermission : The permission to request. Must be in requires to execute. requestAllPermissions() Requests all permissions located in requires , one by one. applicationShouldLaunchAtLogin() Returns whether the app is authorized to run any login tasks. applicationWillLaunchAtLogin() Executes and preliminary actions during the boot sequence. applicationWillLaunch() Executes any preliminary actions before the app launches. applicationDidLaunch() Executes post-launch actions after the app has launched. applicationWillTerminate() Executes cleanup actions before the app closes. applicationDidTerminate() Executes any tasks before finally closing. applicationShouldRequestNotification() Return whether the app is authorized to send notifications. Returns Boolean value dictating whether the app includes the notification permission and has permission to send notifications from the user. applicationWillRequestNotification(message, withDetails, responseCallback) Executes any pre-processing for a notification request and then sends a request. Parameters message : The message or title of the notification. withDetails : The details of the notification. responseCallback (Optional) The action to perform when clicking 'Respond'. applicationDidRequestNotification() Executes any actions after sending a notification request. applicationWillRequestBasicAlert(message, withDetails, onDismissCallback) Executes any pre-processing for an alert and then sends an alert request. Parameters message : The message or title of the alert. withDetails : The details of the alert. onDismissCallback (Optional) The action to perform when clicking 'OK'. applicationWillRequestExtendedAlert(message, withDetails, primaryActionText, onPrimaryCallback, secondaryActionText, onSecondaryCallback) Executes any pre-processing for an extended alert and then sends an alert request. message : The message or title of the alert. withDetails : The details of the alert. primaryActionText : The text for the primary action button onPrimaryCallback (Optional) The action to perform when clicking the primary button. secondaryActionText : (Optional) The text for the secondary action button onSecondaryCallback (Optional) The action to perform when clicking the secondary button. applicationDidRequestAlert() Executes any actions after sending an alert.","title":"ASAppRepresentative"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#asapprepresentative","text":"ASAppRepresentative is the Python class responsible for defining apps in AliceOS. This class acts as the app's delegate and information manifest. The following documentation covers all of the methods and properties of this class.","title":"ASAppRepresentative"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#properties","text":"bundleName : The name of the application. bundleId : The ID of the application in reverse domain name notation . bundleDir : The location of the application. By default, apps use AS_APPS_DIR + \" applicationname .aosapp/\" . bundleAuthor : The author or organization that developed the application. bundleVersion : The version of the application. bundleDescription : The description of the application. requires : A dictionary containing all of the permissions needed for the app to function. icons : A dictionary containing the paths of all icons for the appropriate sizes.","title":"Properties"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#methods","text":"","title":"Methods"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#__init__appdirectory","text":"Constructs an instance of ASAppRepresentative . Parameters appDirectory : The directory of which the app is located. Equivalent to bundleDir .","title":"__init__(appDirectory)"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#requestpermissionforpermission","text":"Requests a particular permission located in requires . Parameters forPermission : The permission to request. Must be in requires to execute.","title":"requestPermission(forPermission)"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#requestallpermissions","text":"Requests all permissions located in requires , one by one.","title":"requestAllPermissions()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationshouldlaunchatlogin","text":"Returns whether the app is authorized to run any login tasks.","title":"applicationShouldLaunchAtLogin()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationwilllaunchatlogin","text":"Executes and preliminary actions during the boot sequence.","title":"applicationWillLaunchAtLogin()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationwilllaunch","text":"Executes any preliminary actions before the app launches.","title":"applicationWillLaunch()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationdidlaunch","text":"Executes post-launch actions after the app has launched.","title":"applicationDidLaunch()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationwillterminate","text":"Executes cleanup actions before the app closes.","title":"applicationWillTerminate()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationdidterminate","text":"Executes any tasks before finally closing.","title":"applicationDidTerminate()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationshouldrequestnotification","text":"Return whether the app is authorized to send notifications. Returns Boolean value dictating whether the app includes the notification permission and has permission to send notifications from the user.","title":"applicationShouldRequestNotification()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationwillrequestnotificationmessage-withdetails-responsecallback","text":"Executes any pre-processing for a notification request and then sends a request. Parameters message : The message or title of the notification. withDetails : The details of the notification. responseCallback (Optional) The action to perform when clicking 'Respond'.","title":"applicationWillRequestNotification(message, withDetails, responseCallback)"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationdidrequestnotification","text":"Executes any actions after sending a notification request.","title":"applicationDidRequestNotification()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationwillrequestbasicalertmessage-withdetails-ondismisscallback","text":"Executes any pre-processing for an alert and then sends an alert request. Parameters message : The message or title of the alert. withDetails : The details of the alert. onDismissCallback (Optional) The action to perform when clicking 'OK'.","title":"applicationWillRequestBasicAlert(message, withDetails, onDismissCallback)"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationwillrequestextendedalertmessage-withdetails-primaryactiontext-onprimarycallback-secondaryactiontext-onsecondarycallback","text":"Executes any pre-processing for an extended alert and then sends an alert request. message : The message or title of the alert. withDetails : The details of the alert. primaryActionText : The text for the primary action button onPrimaryCallback (Optional) The action to perform when clicking the primary button. secondaryActionText : (Optional) The text for the secondary action button onSecondaryCallback (Optional) The action to perform when clicking the secondary button.","title":"applicationWillRequestExtendedAlert(message, withDetails, primaryActionText, onPrimaryCallback, secondaryActionText, onSecondaryCallback)"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationdidrequestalert","text":"Executes any actions after sending an alert.","title":"applicationDidRequestAlert()"},{"location":"Frameworks/NotificationKit/","text":"NotificationKit Overview NotificationKit is the official API set for sending notifications in AliceOS. Notifications include the following: Banners : Temporary popups from the top of the screen that can be acted upon or dismissed. Alerts : Full-screen dialog boxes that require user input immediately. Sounds: Sounds that play to incidate something has occured. About this documentation section The documentation provided on NotificationKit does not cover usage of their implementation with apps. Rather, the documentation covers the screens in use and how they can be called without needing Applets. This kind of scenario applies in cases where the AliceOS base only includes NotificationKit. If you wish to create an app that makes use of NotificationKit, please consult the Apps documentation under \"Sending Notifications\".","title":"NotificationKit Overview"},{"location":"Frameworks/NotificationKit/#notificationkit-overview","text":"NotificationKit is the official API set for sending notifications in AliceOS. Notifications include the following: Banners : Temporary popups from the top of the screen that can be acted upon or dismissed. Alerts : Full-screen dialog boxes that require user input immediately. Sounds: Sounds that play to incidate something has occured.","title":"NotificationKit Overview"},{"location":"Frameworks/NotificationKit/#about-this-documentation-section","text":"The documentation provided on NotificationKit does not cover usage of their implementation with apps. Rather, the documentation covers the screens in use and how they can be called without needing Applets. This kind of scenario applies in cases where the AliceOS base only includes NotificationKit. If you wish to create an app that makes use of NotificationKit, please consult the Apps documentation under \"Sending Notifications\".","title":"About this documentation section"},{"location":"Frameworks/NotificationKit/01-banner/","text":"Banners Banners provide a temporary pop-up at the top of the screen that automatically dismiss after five seconds. Banners usually include an app's name, primary message, details, and a response callback upon clicking 'Respond'. ASNotificationBanner() ASNotificationBanner(applet=None, message, withDetails, responseCallback=Return('didClickRespond')) Parameters applet : (Optional) The app object to pass in. If None, the app icon and bundle name on the top will display as \"Unknown Bundle\". message : (Required) The main message or sender. withDetails : (Required) The details of the message. responseCallback (Optional) The action to run upon clicking \"Respond\". Returns If the notification times out and dismisses, the banner will return 'notificationTimedOut' . If the notification's response callback is left as the default, the banner will return 'didClickRespond' when clicking the \"Respond\" button.","title":"Banners"},{"location":"Frameworks/NotificationKit/01-banner/#banners","text":"Banners provide a temporary pop-up at the top of the screen that automatically dismiss after five seconds. Banners usually include an app's name, primary message, details, and a response callback upon clicking 'Respond'.","title":"Banners"},{"location":"Frameworks/NotificationKit/01-banner/#asnotificationbanner","text":"ASNotificationBanner(applet=None, message, withDetails, responseCallback=Return('didClickRespond'))","title":"ASNotificationBanner()"},{"location":"Frameworks/NotificationKit/01-banner/#parameters","text":"applet : (Optional) The app object to pass in. If None, the app icon and bundle name on the top will display as \"Unknown Bundle\". message : (Required) The main message or sender. withDetails : (Required) The details of the message. responseCallback (Optional) The action to run upon clicking \"Respond\".","title":"Parameters"},{"location":"Frameworks/NotificationKit/01-banner/#returns","text":"If the notification times out and dismisses, the banner will return 'notificationTimedOut' . If the notification's response callback is left as the default, the banner will return 'didClickRespond' when clicking the \"Respond\" button.","title":"Returns"},{"location":"Frameworks/NotificationKit/02-alerts/","text":"Alerts Alerts provide important information for the user and request an immediate action. There are two types of alerts AliceOS has: basic and extended. Both types of alerts are designed to request an immediate action, though there are different uses for each alert type. ASNotificationAlert() (Basic) ASNotificationAlert(message, withDetails, onDismissCallback=Return('didDismissAlert')) Parameters message : The message or title of the alert. withDetails : The details of the alert. onDismissCallback (Optional) The action to perform when clicking 'OK'. Returns If the onDismissCallback remains at the default, the alert returns 'didDismissAlert' . ASNotificationExtendedAlert() (Extended) ASNotificationExtendedAlert(message, withDetails, primaryActionText, onPrimaryCallback=Return('didClickPrimary'), secondaryActionText=None, onSecondaryCallback=Return('didClickSecondary')) Parameters message : The message or title of the alert. withDetails : The details of the alert. primaryActionText : The text for the primary action button onPrimaryCallback (Optional) The action to perform when clicking the primary button. secondaryActionText : (Optional) The text for the secondary action button. If set to None , the secondary action button will not be displayed. onSecondaryCallback (Optional) The action to perform when clicking the secondary button. Returns If the user clicks the primary action button and the action callback is left at the default, the alert returns 'didClickPrimary' . Likewise, if the user clicks the secondary action button and the action callback is left at the default, the alert returns 'didClickSecondary' .","title":"Alerts"},{"location":"Frameworks/NotificationKit/02-alerts/#alerts","text":"Alerts provide important information for the user and request an immediate action. There are two types of alerts AliceOS has: basic and extended. Both types of alerts are designed to request an immediate action, though there are different uses for each alert type.","title":"Alerts"},{"location":"Frameworks/NotificationKit/02-alerts/#asnotificationalert-basic","text":"ASNotificationAlert(message, withDetails, onDismissCallback=Return('didDismissAlert'))","title":"ASNotificationAlert() (Basic)"},{"location":"Frameworks/NotificationKit/02-alerts/#parameters","text":"message : The message or title of the alert. withDetails : The details of the alert. onDismissCallback (Optional) The action to perform when clicking 'OK'.","title":"Parameters"},{"location":"Frameworks/NotificationKit/02-alerts/#returns","text":"If the onDismissCallback remains at the default, the alert returns 'didDismissAlert' .","title":"Returns"},{"location":"Frameworks/NotificationKit/02-alerts/#asnotificationextendedalert-extended","text":"ASNotificationExtendedAlert(message, withDetails, primaryActionText, onPrimaryCallback=Return('didClickPrimary'), secondaryActionText=None, onSecondaryCallback=Return('didClickSecondary'))","title":"ASNotificationExtendedAlert() (Extended)"},{"location":"Frameworks/NotificationKit/02-alerts/#parameters_1","text":"message : The message or title of the alert. withDetails : The details of the alert. primaryActionText : The text for the primary action button onPrimaryCallback (Optional) The action to perform when clicking the primary button. secondaryActionText : (Optional) The text for the secondary action button. If set to None , the secondary action button will not be displayed. onSecondaryCallback (Optional) The action to perform when clicking the secondary button.","title":"Parameters"},{"location":"Frameworks/NotificationKit/02-alerts/#returns_1","text":"If the user clicks the primary action button and the action callback is left at the default, the alert returns 'didClickPrimary' . Likewise, if the user clicks the secondary action button and the action callback is left at the default, the alert returns 'didClickSecondary' .","title":"Returns"},{"location":"Frameworks/ScreenKit/","text":"ScreenKit Overview ScreenKit is the official API that offer beautiful interfaces for AliceOS apps and services. ScreenKit works on top of Ren'Py's beautiful screen language with new styles and puts more control of the interface into developers' hands. Apps using AppKit get to leverage ScreenKit easily without adding any additional code to their manifest. Warning ScreenKit is still heavy in development and styles may change over time. The API and documentation may change over time as ScreenKit matures. About this documentation section This section will go over the different aspects of ScreenKit and how a ScreenKit interface is constructed using Ren'Py's screen language.","title":"ScreenKit Overview"},{"location":"Frameworks/ScreenKit/#screenkit-overview","text":"ScreenKit is the official API that offer beautiful interfaces for AliceOS apps and services. ScreenKit works on top of Ren'Py's beautiful screen language with new styles and puts more control of the interface into developers' hands. Apps using AppKit get to leverage ScreenKit easily without adding any additional code to their manifest. Warning ScreenKit is still heavy in development and styles may change over time. The API and documentation may change over time as ScreenKit matures.","title":"ScreenKit Overview"},{"location":"Frameworks/ScreenKit/#about-this-documentation-section","text":"This section will go over the different aspects of ScreenKit and how a ScreenKit interface is constructed using Ren'Py's screen language.","title":"About this documentation section"},{"location":"Frameworks/ScreenKit/01-a-simple-ui/","text":"A Simple UI ScreenKit works beautifully with Ren'Py's screen language, a mostly-declarative and direct means of defining screens. Most of ScreenKit's UI magic works in such a way where, most of the time, you'll only need to add one extra line to your existing screen. Tip All of the examples provided in the documentation will use screen language instead of dynamic creation with Python. If you are unfamiliar with Ren'Py's screen language, we recommend that you read about it and how it works on the official documentation. Get started Creating a simple UI For this simple example, we'll create the UI seen at the top of this documentation page as part of an app called \"Samples\". The screen includes a few elements: Window title bar with window controls Vertical box with text and a button To get started, we'll need to first define our screen. Generally, AliceOS screen naming conventions follow that of the app's class: screen SamplesAppView (): We also have provided an empty parameter list since later versions of Ren'Py require a parameter list. Now that we've created the screen itself, we'll need to tell it to use ScreenKit to style the elements; otherwise, the screen will use the default GUI included in the visual novel. To do this, we need to set the screen's style_prefix , meaning that any styles in this screen are named starting with ASInterface . screen SamplesAppView (): style_prefix ASInterface Now that we have created a blank screen, we'll need to define a window frame, where the contents of the interface will be stored, as well as its maximum size: screen SamplesAppView (): style_prefix ASInterface frame : xalign 0 . 5 # Align it to the middle of the display yalign 0 . 5 # Align it to the center of the display xmaximum 700 # This is the biggest the frame can get ymaximum 600 # This is the tallest the frame can get The frame will now appear in the center of the display and will be at most 700 pixels wide and 600 pixels tall. By default, most ScreenKit UIs will be at most 1248 pixels wide and 688 pixels tall. Warning UIs built with ScreenKit should not be bigger than the maximum size of the game window (1280 pixels wide and 720 pixels tall). If it goes beyond this limit, the interface may get cut off. Now that we have a frame in place, we need to create the area where the content will appear. To do so, we'll need to create a vertical box: screen SamplesAppView (): style_prefix ASInterface frame : xalign 0 . 5 yalign 0 . 5 xmaximum 700 ymaximum 600 has vbox : xalign 0 . 5 yalign 0 . 5 Any content inside of the has vbox statement will appear inside of the vertical box and not interfere with anything else. We can now try to attach our screen to our SamplesApp by telling it to show the screen when the application is open under the app's applicationWillLaunch method in the manifest: def applicationWillLaunch ( self ): renpy . show_screen ( SamplesAppView ) return Note We used the method renpy.show_screen to show this screen rather than renpy.call_screen . If the app is launched while in an existing screen like the AliceOS Desktop, Ren'Py won't be able to call it because it would interrupt the current screen's interaction. However, you can get around this by using renpy.invoke_in_new_context so that the screen is in a different context from the default: renpy . invoke_in_new_context ( renpy . call_screen , SamplesAppView ) This method will also allow any return values to be passed in. After launching the app in either the Desktop or from App Manager, we can see that a frame is visible, but there isn't a title bar, and you can't exit the screen. To fix this, we'll need to call ASInterfaceTitlebar , a screen component: screen SamplesAppView (): style_prefix ASInterface frame : xalign 0 . 5 yalign 0 . 5 xmaximum 700 ymaximum 600 has vbox : xalign 0 . 5 yalign 0 . 5 use ASInterfaceTitlebar ( Sample Application , onClose = Hide ( SamplesAppView )) When we launch the application again this time, we will see our title bar and can click the close button to close out of the screen. Note In our onClose parameter, we specified the Hide screen action rather than Return . Since we didn't call the screen from a new context, we opted for Hide since it would hide the screen without closing out of the AliceOS desktop. Adding content to our UI Now we've set up a basic interface, we can start adding the rest of the interface, what we'll call the content . Since we're making just a basic interface, we can just add the text and our button inside of the vbox : ... # This is inside the screen from before has vbox : xalign 0 . 5 yalign 0 . 5 use ASInterfaceTitlebar ( Sample Application , onClose = Hide ( SamplesAppView )) text \\Welcome to this sample application! The view you are looking at works directly with ScreenKit to make a beautiful interface while still using Ren Py s screen language. hbox : xalign 1 . 0 yalign 1 . 0 textbutton Cool beans! action Hide ( SamplesAppView ) : style ASInterfacePushButton Note that for our push button, we wrapped it in a horizontal box ( hbox ) and added xalign 1.0 to move all the items to the right, as well as yalign 1.0 to keep them at the bottom of the window. This can be useful if you have multiple buttons and want to keep them at the right. Also, for the push button, we added an additional style property to the push button style, ASInterfacePushButton . This lets us use the AliceOS style for push buttons; otherwise, they would default to the text buttons AliceOS uses. Now we can open the application and verify that it looks exactly the way we want and that clicking \"Cool beans!\" closes the window as expected. Finished code Here is the final code for our screen: screen SamplesAppView () : style_prefix ASInterface frame : xalign 0 . 5 yalign 0 . 5 xmaximum 700 ymaximum 600 has vbox : xalign 0 . 5 yalign 0 . 5 use ASInterfaceTitlebar ( Sample Application , onClose = Hide ( SamplesAppView )) text \\Welcome to this sample application! The view you are looking at works directly with ScreenKit to make a beautiful interface while still using Ren Py s screen language. hbox : xalign 1 . 0 yalign 1 . 0 textbutton Cool beans! action Hide ( SamplesAppView ) : style ASInterfacePushButton","title":"A Simple UI"},{"location":"Frameworks/ScreenKit/01-a-simple-ui/#a-simple-ui","text":"ScreenKit works beautifully with Ren'Py's screen language, a mostly-declarative and direct means of defining screens. Most of ScreenKit's UI magic works in such a way where, most of the time, you'll only need to add one extra line to your existing screen. Tip All of the examples provided in the documentation will use screen language instead of dynamic creation with Python. If you are unfamiliar with Ren'Py's screen language, we recommend that you read about it and how it works on the official documentation. Get started","title":"A Simple UI"},{"location":"Frameworks/ScreenKit/01-a-simple-ui/#creating-a-simple-ui","text":"For this simple example, we'll create the UI seen at the top of this documentation page as part of an app called \"Samples\". The screen includes a few elements: Window title bar with window controls Vertical box with text and a button To get started, we'll need to first define our screen. Generally, AliceOS screen naming conventions follow that of the app's class: screen SamplesAppView (): We also have provided an empty parameter list since later versions of Ren'Py require a parameter list. Now that we've created the screen itself, we'll need to tell it to use ScreenKit to style the elements; otherwise, the screen will use the default GUI included in the visual novel. To do this, we need to set the screen's style_prefix , meaning that any styles in this screen are named starting with ASInterface . screen SamplesAppView (): style_prefix ASInterface Now that we have created a blank screen, we'll need to define a window frame, where the contents of the interface will be stored, as well as its maximum size: screen SamplesAppView (): style_prefix ASInterface frame : xalign 0 . 5 # Align it to the middle of the display yalign 0 . 5 # Align it to the center of the display xmaximum 700 # This is the biggest the frame can get ymaximum 600 # This is the tallest the frame can get The frame will now appear in the center of the display and will be at most 700 pixels wide and 600 pixels tall. By default, most ScreenKit UIs will be at most 1248 pixels wide and 688 pixels tall. Warning UIs built with ScreenKit should not be bigger than the maximum size of the game window (1280 pixels wide and 720 pixels tall). If it goes beyond this limit, the interface may get cut off. Now that we have a frame in place, we need to create the area where the content will appear. To do so, we'll need to create a vertical box: screen SamplesAppView (): style_prefix ASInterface frame : xalign 0 . 5 yalign 0 . 5 xmaximum 700 ymaximum 600 has vbox : xalign 0 . 5 yalign 0 . 5 Any content inside of the has vbox statement will appear inside of the vertical box and not interfere with anything else. We can now try to attach our screen to our SamplesApp by telling it to show the screen when the application is open under the app's applicationWillLaunch method in the manifest: def applicationWillLaunch ( self ): renpy . show_screen ( SamplesAppView ) return Note We used the method renpy.show_screen to show this screen rather than renpy.call_screen . If the app is launched while in an existing screen like the AliceOS Desktop, Ren'Py won't be able to call it because it would interrupt the current screen's interaction. However, you can get around this by using renpy.invoke_in_new_context so that the screen is in a different context from the default: renpy . invoke_in_new_context ( renpy . call_screen , SamplesAppView ) This method will also allow any return values to be passed in. After launching the app in either the Desktop or from App Manager, we can see that a frame is visible, but there isn't a title bar, and you can't exit the screen. To fix this, we'll need to call ASInterfaceTitlebar , a screen component: screen SamplesAppView (): style_prefix ASInterface frame : xalign 0 . 5 yalign 0 . 5 xmaximum 700 ymaximum 600 has vbox : xalign 0 . 5 yalign 0 . 5 use ASInterfaceTitlebar ( Sample Application , onClose = Hide ( SamplesAppView )) When we launch the application again this time, we will see our title bar and can click the close button to close out of the screen. Note In our onClose parameter, we specified the Hide screen action rather than Return . Since we didn't call the screen from a new context, we opted for Hide since it would hide the screen without closing out of the AliceOS desktop.","title":"Creating a simple UI"},{"location":"Frameworks/ScreenKit/01-a-simple-ui/#adding-content-to-our-ui","text":"Now we've set up a basic interface, we can start adding the rest of the interface, what we'll call the content . Since we're making just a basic interface, we can just add the text and our button inside of the vbox : ... # This is inside the screen from before has vbox : xalign 0 . 5 yalign 0 . 5 use ASInterfaceTitlebar ( Sample Application , onClose = Hide ( SamplesAppView )) text \\Welcome to this sample application! The view you are looking at works directly with ScreenKit to make a beautiful interface while still using Ren Py s screen language. hbox : xalign 1 . 0 yalign 1 . 0 textbutton Cool beans! action Hide ( SamplesAppView ) : style ASInterfacePushButton Note that for our push button, we wrapped it in a horizontal box ( hbox ) and added xalign 1.0 to move all the items to the right, as well as yalign 1.0 to keep them at the bottom of the window. This can be useful if you have multiple buttons and want to keep them at the right. Also, for the push button, we added an additional style property to the push button style, ASInterfacePushButton . This lets us use the AliceOS style for push buttons; otherwise, they would default to the text buttons AliceOS uses. Now we can open the application and verify that it looks exactly the way we want and that clicking \"Cool beans!\" closes the window as expected.","title":"Adding content to our UI"},{"location":"Frameworks/ScreenKit/01-a-simple-ui/#finished-code","text":"Here is the final code for our screen: screen SamplesAppView () : style_prefix ASInterface frame : xalign 0 . 5 yalign 0 . 5 xmaximum 700 ymaximum 600 has vbox : xalign 0 . 5 yalign 0 . 5 use ASInterfaceTitlebar ( Sample Application , onClose = Hide ( SamplesAppView )) text \\Welcome to this sample application! The view you are looking at works directly with ScreenKit to make a beautiful interface while still using Ren Py s screen language. hbox : xalign 1 . 0 yalign 1 . 0 textbutton Cool beans! action Hide ( SamplesAppView ) : style ASInterfacePushButton","title":"Finished code"},{"location":"Frameworks/ScreenKit/02-special-styles/","text":"Special ScreenKit Styles Not all ScreenKit elements can be easily inherited via the style prefix. To accommodate for this, ScreenKit also includes some special styles that must be applied to an interface element specifically. Text Buttons The following styles apply to text buttons ( textbutton ). These styles can also be used as a style prefix when in a hbox or a vbox . For example, both are acceptable: textbutton Continue action NullAction () : style ASInterfacePushButton hbox : style_prefix ASInterfacePushButton textbutton Cancel action NullAction () textbutton Continue action NullAction () ASInterfacePushButton The base style for a push button. ASInterfaceCheckbox The base style for a checkbox. ASInterfaceRadio The base style for a radio button. Scrollable Content The following styles apply to scrollable areas where a scrollbar is present. Generally, this is called as a style prefix rather than the style itself. ASInterfaceScrollbar The base style for a scrollable area. Used with viewport . Can be used as a style prefix.","title":"Special ScreenKit Styles"},{"location":"Frameworks/ScreenKit/02-special-styles/#special-screenkit-styles","text":"Not all ScreenKit elements can be easily inherited via the style prefix. To accommodate for this, ScreenKit also includes some special styles that must be applied to an interface element specifically.","title":"Special ScreenKit Styles"},{"location":"Frameworks/ScreenKit/02-special-styles/#text-buttons","text":"The following styles apply to text buttons ( textbutton ). These styles can also be used as a style prefix when in a hbox or a vbox . For example, both are acceptable: textbutton Continue action NullAction () : style ASInterfacePushButton hbox : style_prefix ASInterfacePushButton textbutton Cancel action NullAction () textbutton Continue action NullAction ()","title":"Text Buttons"},{"location":"Frameworks/ScreenKit/02-special-styles/#asinterfacepushbutton","text":"The base style for a push button.","title":"ASInterfacePushButton"},{"location":"Frameworks/ScreenKit/02-special-styles/#asinterfacecheckbox","text":"The base style for a checkbox.","title":"ASInterfaceCheckbox"},{"location":"Frameworks/ScreenKit/02-special-styles/#asinterfaceradio","text":"The base style for a radio button.","title":"ASInterfaceRadio"},{"location":"Frameworks/ScreenKit/02-special-styles/#scrollable-content","text":"The following styles apply to scrollable areas where a scrollbar is present. Generally, this is called as a style prefix rather than the style itself.","title":"Scrollable Content"},{"location":"Frameworks/ScreenKit/02-special-styles/#asinterfacescrollbar","text":"The base style for a scrollable area. Used with viewport . Can be used as a style prefix.","title":"ASInterfaceScrollbar"},{"location":"Release-Notes/","text":"Prospect Park (2.0.0) Developer Beta 3 The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). ScreenKit ScreenKit now include horizontal scrollbars and radio buttons. ScreenKit frames are more rectangular. Apps Introduces a new Inventories app, a fast and fun way to create and manage a game inventory. About AliceOS The Ren'Py version should now match the proper built version and not be hard-coded. Setup Assistant Setup Assistant now uses ScreenKit to draw elements.","title":"Prospect Park (2.0.0) Developer Beta 3"},{"location":"Release-Notes/#prospect-park-200-developer-beta-3","text":"The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0).","title":"Prospect Park (2.0.0) Developer Beta 3"},{"location":"Release-Notes/#screenkit","text":"ScreenKit now include horizontal scrollbars and radio buttons. ScreenKit frames are more rectangular.","title":"ScreenKit"},{"location":"Release-Notes/#apps","text":"Introduces a new Inventories app, a fast and fun way to create and manage a game inventory.","title":"Apps"},{"location":"Release-Notes/#about-aliceos","text":"The Ren'Py version should now match the proper built version and not be hard-coded.","title":"About AliceOS"},{"location":"Release-Notes/#setup-assistant","text":"Setup Assistant now uses ScreenKit to draw elements.","title":"Setup Assistant"},{"location":"Release-Notes/1tp1/","text":"Technical Preview 1 (1.0.0) This is the first initial release of AliceOS Technical Preview.","title":"Technical Preview 1 (1.0.0)"},{"location":"Release-Notes/1tp1/#technical-preview-1-100","text":"This is the first initial release of AliceOS Technical Preview.","title":"Technical Preview 1 (1.0.0)"},{"location":"Release-Notes/1tp2/","text":"Technical Preview 2 (1.0.0) Setup assistant has been completely rewritten from the ground-up. Now supports dynamic font changes and a large font mode. Stop errors have been rewritten and are now dynamically called using ThrowASError() Default backgrounds have changed. OEM settings have been adjusted to use the new Setup assistant and now use hardcoded values for font files instead of dynamic assignments. Issue where Ren'Py projects crash upon loading an AliceOS dialog from a save file in OEM font mode has been resolved (#22).","title":"Technical Preview 2 (1.0.0)"},{"location":"Release-Notes/1tp2/#technical-preview-2-100","text":"Setup assistant has been completely rewritten from the ground-up. Now supports dynamic font changes and a large font mode. Stop errors have been rewritten and are now dynamically called using ThrowASError() Default backgrounds have changed. OEM settings have been adjusted to use the new Setup assistant and now use hardcoded values for font files instead of dynamic assignments. Issue where Ren'Py projects crash upon loading an AliceOS dialog from a save file in OEM font mode has been resolved (#22).","title":"Technical Preview 2 (1.0.0)"},{"location":"Release-Notes/2.0.0_db1/","text":"Prospect Park (2.0.0) Developer Beta 1 The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). This document is not complete More documentation is being worked on with this document to describe exact changes. Before you upgrade AliceOS Prospect Park is a dramatic overhaul of the classic AliceOS and may break upon installation. Please review everything carefully. General The system organization has migrated over to a macOS-styled directory structure with System, Library, and Applications. Installation has changed over to an RPA-based solution. Installation now is as simple as dragging the RPA. AliceOS APIs, class names, and function names have been renamed and switch over to camel case instead of snake case. Apps Applets have been deprecated in favor of new apps written with AppKit in mind. Apps no longer need to declare a desktop shell component as this is handled by the native applicationWillLaunch method. Core Services and Applications Applications such as Messages have been moved to System/Applications/ and use AppKit. The halt screen, bootloader, and Setup Assistant are now Core Services that use ServiceKit. Desktop The Desktop now uses the applicationWillLaunch method from AppKit apps to start apps accordingly. The Desktop image is defined as AS_DESKTOP_IMG . The Desktop now refreshes quickly to get the latest time on the clock. Known issues The Desktop doesn't hide the quick menu. The showDesktop() method from ASDesktop doesn't work in Ren'Py screen language. Workarounds Call ASDesktopShell directly instead of using the showDesktop() method. Halt screens (formerly Stop errors) The halt screen uses the AliceOS dynamic blur instead of its own background. A QR code has been added that redirects users to the AliceOS Error Database. The text has been changed to indicate how long before AliceOS will automatically restart the game. Notifications Notifications are now under the NotificationKit framework. Alerts no longer appear as a white square. They now use the AliceOS dynamic blur feature. Known issues Notification banners do not make a sound. Setup Assistant Express Mode is on by default, but can be disabled in the bootloader's boot method. Instructions have been rewritten for conciseness and clarity. The interface has changed to a more macOS-like experience.","title":"Prospect Park (2.0.0) Developer Beta 1"},{"location":"Release-Notes/2.0.0_db1/#prospect-park-200-developer-beta-1","text":"The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). This document is not complete More documentation is being worked on with this document to describe exact changes. Before you upgrade AliceOS Prospect Park is a dramatic overhaul of the classic AliceOS and may break upon installation. Please review everything carefully.","title":"Prospect Park (2.0.0) Developer Beta 1"},{"location":"Release-Notes/2.0.0_db1/#general","text":"The system organization has migrated over to a macOS-styled directory structure with System, Library, and Applications. Installation has changed over to an RPA-based solution. Installation now is as simple as dragging the RPA. AliceOS APIs, class names, and function names have been renamed and switch over to camel case instead of snake case.","title":"General"},{"location":"Release-Notes/2.0.0_db1/#apps","text":"Applets have been deprecated in favor of new apps written with AppKit in mind. Apps no longer need to declare a desktop shell component as this is handled by the native applicationWillLaunch method.","title":"Apps"},{"location":"Release-Notes/2.0.0_db1/#core-services-and-applications","text":"Applications such as Messages have been moved to System/Applications/ and use AppKit. The halt screen, bootloader, and Setup Assistant are now Core Services that use ServiceKit.","title":"Core Services and Applications"},{"location":"Release-Notes/2.0.0_db1/#desktop","text":"The Desktop now uses the applicationWillLaunch method from AppKit apps to start apps accordingly. The Desktop image is defined as AS_DESKTOP_IMG . The Desktop now refreshes quickly to get the latest time on the clock.","title":"Desktop"},{"location":"Release-Notes/2.0.0_db1/#known-issues","text":"The Desktop doesn't hide the quick menu. The showDesktop() method from ASDesktop doesn't work in Ren'Py screen language.","title":"Known issues"},{"location":"Release-Notes/2.0.0_db1/#workarounds","text":"Call ASDesktopShell directly instead of using the showDesktop() method.","title":"Workarounds"},{"location":"Release-Notes/2.0.0_db1/#halt-screens-formerly-stop-errors","text":"The halt screen uses the AliceOS dynamic blur instead of its own background. A QR code has been added that redirects users to the AliceOS Error Database. The text has been changed to indicate how long before AliceOS will automatically restart the game.","title":"Halt screens (formerly Stop errors)"},{"location":"Release-Notes/2.0.0_db1/#notifications","text":"Notifications are now under the NotificationKit framework. Alerts no longer appear as a white square. They now use the AliceOS dynamic blur feature.","title":"Notifications"},{"location":"Release-Notes/2.0.0_db1/#known-issues_1","text":"Notification banners do not make a sound.","title":"Known issues"},{"location":"Release-Notes/2.0.0_db1/#setup-assistant","text":"Express Mode is on by default, but can be disabled in the bootloader's boot method. Instructions have been rewritten for conciseness and clarity. The interface has changed to a more macOS-like experience.","title":"Setup Assistant"},{"location":"Release-Notes/2.0.0_db2/","text":"Prospect Park (2.0.0) Developer Beta 2 The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). Apps Apps can now write starup/login services via applicationWillLaunchAtLogin() and check for System Events permissions with applicationShouldLaunchAtLogin() . Notfications and alerts in AppKit are now invoked in a new context instead of interrupting the current one. The 48 pixel icon entry in ASAppRepresentative has been re-added. If unimplemented, applicationWillLaunch() will log a warning in the terminal. Messages Messages now displays a \"Coming Soon\" alert when launched from the Desktop. Desktop Apps on the desktop will invoke applicationWillLaunch as a Ren'Py function callback instead of calling the Python function directly to prevent continuous calls. The main views in Desktop now have empty parameter lists to resolve linter warnings. Known Issues The Desktop doesn't hide the quick menu. The showDesktop() method from ASDesktop doesn't work in Ren'Py screen language when calling it as a button action. Workarounds Use Ren'Py's Function call to run showDesktop() or make a call directly to the screen. Notifications Known issues Notification banners do not make a sound. Workarounds Include a sound in your applet and make a wrapper around applicationWillRequestNotification() . Bootloader The bootloader will now attempt to run any authorized startup services in a new thread. An optional bootView parameter allows developers to set a custom boot screen to display instead of the default. ScreenKit ScreenKit has been introduced as a means of creating user interfaces for AliceOS using Ren'Py's screen language and styling. Styles for frames, vertical and horizontal boxes, text, checkbox buttons, vertical scrollbars, and push buttons have been implemented. ASInterfaceTitlebar has been implemented as a smaller component to add a title bar to a given frame. About AliceOS The main interface has been written entirely with ScreenKit and displays information from system definitions. App Manager App Manager has been introduced as a means of managing an app's permissions and viewing details about the app. Apps in App Manager list their permissions as toggleable checkboxes.","title":"Prospect Park (2.0.0) Developer Beta 2"},{"location":"Release-Notes/2.0.0_db2/#prospect-park-200-developer-beta-2","text":"The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0).","title":"Prospect Park (2.0.0) Developer Beta 2"},{"location":"Release-Notes/2.0.0_db2/#apps","text":"Apps can now write starup/login services via applicationWillLaunchAtLogin() and check for System Events permissions with applicationShouldLaunchAtLogin() . Notfications and alerts in AppKit are now invoked in a new context instead of interrupting the current one. The 48 pixel icon entry in ASAppRepresentative has been re-added. If unimplemented, applicationWillLaunch() will log a warning in the terminal.","title":"Apps"},{"location":"Release-Notes/2.0.0_db2/#messages","text":"Messages now displays a \"Coming Soon\" alert when launched from the Desktop.","title":"Messages"},{"location":"Release-Notes/2.0.0_db2/#desktop","text":"Apps on the desktop will invoke applicationWillLaunch as a Ren'Py function callback instead of calling the Python function directly to prevent continuous calls. The main views in Desktop now have empty parameter lists to resolve linter warnings.","title":"Desktop"},{"location":"Release-Notes/2.0.0_db2/#known-issues","text":"The Desktop doesn't hide the quick menu. The showDesktop() method from ASDesktop doesn't work in Ren'Py screen language when calling it as a button action.","title":"Known Issues"},{"location":"Release-Notes/2.0.0_db2/#workarounds","text":"Use Ren'Py's Function call to run showDesktop() or make a call directly to the screen.","title":"Workarounds"},{"location":"Release-Notes/2.0.0_db2/#notifications","text":"","title":"Notifications"},{"location":"Release-Notes/2.0.0_db2/#known-issues_1","text":"Notification banners do not make a sound.","title":"Known issues"},{"location":"Release-Notes/2.0.0_db2/#workarounds_1","text":"Include a sound in your applet and make a wrapper around applicationWillRequestNotification() .","title":"Workarounds"},{"location":"Release-Notes/2.0.0_db2/#bootloader","text":"The bootloader will now attempt to run any authorized startup services in a new thread. An optional bootView parameter allows developers to set a custom boot screen to display instead of the default.","title":"Bootloader"},{"location":"Release-Notes/2.0.0_db2/#screenkit","text":"ScreenKit has been introduced as a means of creating user interfaces for AliceOS using Ren'Py's screen language and styling. Styles for frames, vertical and horizontal boxes, text, checkbox buttons, vertical scrollbars, and push buttons have been implemented. ASInterfaceTitlebar has been implemented as a smaller component to add a title bar to a given frame.","title":"ScreenKit"},{"location":"Release-Notes/2.0.0_db2/#about-aliceos","text":"The main interface has been written entirely with ScreenKit and displays information from system definitions.","title":"About AliceOS"},{"location":"Release-Notes/2.0.0_db2/#app-manager","text":"App Manager has been introduced as a means of managing an app's permissions and viewing details about the app. Apps in App Manager list their permissions as toggleable checkboxes.","title":"App Manager"},{"location":"System/01-definitions/","text":"AliceOS Definitions To make referencing common AliceOS build settings and structures easier, AliceOS provides the following definitions and dictionaries. These are located in System/ASDefinitions.rpy and can be modified if necessary. AliceOS release definitions These definitions are used to specify important release information regarding AliceOS. These definitions might be referenced to specify OS version information to the user, in a help screen, for example. This is stored as a dictionary in AS_SYS_INFO Definition name Used for VERSION The release version. Typically X.x.x ; this isn't the build number generated from the Git hash COMMON_NAME The common name for the release. (ex. \"Prospect Park\") BUILD_ID The build number as generated by the Git hash or the Travis tag Directory definitions Definition name Points to Used for AS_SYSTEM_DIR System/ The default System directory. AS_FRAMEWORKS_DIR System/Frameworks/ The default Frameworks directory. AS_CORESERVICES_DIR System/CoreServices/ The default Core Services directory. AS_DEFAULT_APP_DIR System/Applications/ The default System applications directory. This isn't necessary for developer use. AS_FONTS_DIR System/Fonts/ The default Fonts directory. AS_APPS_DIR Applications/ The default Applications directory. AS_LIBRARY_DIR System/Library/ The default Library directory. Framework directory definitions AS_FRAMEWORK_DIR(FRAMEWORK_NAME=\"Default\") The directory where a particular Framework is located. Makes use of AS_FRAMEWORKS_DIR . Parameters FRAMEWORK_NAME : The name of the framework to reference. Example: NotificationKit Returns The path to the framework. Example: System/Frameworks/NotificationKit.aosframework/ Permissions definitions These definitions are used to specify important strings when asking the user permission for a particular item. These are dictionaries that include the values for a particular permission. AS_REQUIRE_PERMS_NAME : The dictionary containing the name of the permission name. Example: \"Send Notifications\" AS_REQUIRE_PERMS_DESC : The dictionary containing the description of a permission. Example: \"Notifications may include banners, alerts, and sounds. These can be configured in Settings.\"","title":"AliceOS Definitions"},{"location":"System/01-definitions/#aliceos-definitions","text":"To make referencing common AliceOS build settings and structures easier, AliceOS provides the following definitions and dictionaries. These are located in System/ASDefinitions.rpy and can be modified if necessary.","title":"AliceOS Definitions"},{"location":"System/01-definitions/#aliceos-release-definitions","text":"These definitions are used to specify important release information regarding AliceOS. These definitions might be referenced to specify OS version information to the user, in a help screen, for example. This is stored as a dictionary in AS_SYS_INFO Definition name Used for VERSION The release version. Typically X.x.x ; this isn't the build number generated from the Git hash COMMON_NAME The common name for the release. (ex. \"Prospect Park\") BUILD_ID The build number as generated by the Git hash or the Travis tag","title":"AliceOS release definitions"},{"location":"System/01-definitions/#directory-definitions","text":"Definition name Points to Used for AS_SYSTEM_DIR System/ The default System directory. AS_FRAMEWORKS_DIR System/Frameworks/ The default Frameworks directory. AS_CORESERVICES_DIR System/CoreServices/ The default Core Services directory. AS_DEFAULT_APP_DIR System/Applications/ The default System applications directory. This isn't necessary for developer use. AS_FONTS_DIR System/Fonts/ The default Fonts directory. AS_APPS_DIR Applications/ The default Applications directory. AS_LIBRARY_DIR System/Library/ The default Library directory.","title":"Directory definitions"},{"location":"System/01-definitions/#framework-directory-definitions","text":"AS_FRAMEWORK_DIR(FRAMEWORK_NAME=\"Default\") The directory where a particular Framework is located. Makes use of AS_FRAMEWORKS_DIR . Parameters FRAMEWORK_NAME : The name of the framework to reference. Example: NotificationKit Returns The path to the framework. Example: System/Frameworks/NotificationKit.aosframework/","title":"Framework directory definitions"},{"location":"System/01-definitions/#permissions-definitions","text":"These definitions are used to specify important strings when asking the user permission for a particular item. These are dictionaries that include the values for a particular permission. AS_REQUIRE_PERMS_NAME : The dictionary containing the name of the permission name. Example: \"Send Notifications\" AS_REQUIRE_PERMS_DESC : The dictionary containing the description of a permission. Example: \"Notifications may include banners, alerts, and sounds. These can be configured in Settings.\"","title":"Permissions definitions"},{"location":"System/02-default-apps/","text":"Default Apps AliceOS includes several default applications that are located in System/Applications/ . These applications are designed to enhance the AliceOS experience and provide functionalities for core parts without having to write a third-party app for them. Messages Messages is a simple app designed to simulate text messaging between characters and the player in a fun way. Available methods messages.receiveMessage(fromPerson, message) Send a notification request that displays a text message from a person. Parameters fromPerson : The person the message is being sent from message : The text message being sent Returns Returns the default values as indicated from ASNotificationBanner About AliceOS About AliceOS is a simple app that displays information about the current distribution of AliceOS. Users can click on the app in Activites and view the information there. There are no available methods as the app uses the standard applicationWillLaunch method from AppKit. App Manager App Manager is a(n) utility in AliceOS that lets users view the apps installed on the AliceOS system and manage their permissions quickly. It is the official method of changing an app's permissions in AliceOS. There are no available methods as the app uses the standard applicationWillLaunch method from AppKit. Inventories Inventories is a tool for AliceOS that lets developers and players work with an inventory. More information on Inventories can be found in the Inventories documentation .","title":"Default Apps"},{"location":"System/02-default-apps/#default-apps","text":"AliceOS includes several default applications that are located in System/Applications/ . These applications are designed to enhance the AliceOS experience and provide functionalities for core parts without having to write a third-party app for them.","title":"Default Apps"},{"location":"System/02-default-apps/#messages","text":"Messages is a simple app designed to simulate text messaging between characters and the player in a fun way. Available methods messages.receiveMessage(fromPerson, message) Send a notification request that displays a text message from a person. Parameters fromPerson : The person the message is being sent from message : The text message being sent Returns Returns the default values as indicated from ASNotificationBanner","title":"Messages"},{"location":"System/02-default-apps/#about-aliceos","text":"About AliceOS is a simple app that displays information about the current distribution of AliceOS. Users can click on the app in Activites and view the information there. There are no available methods as the app uses the standard applicationWillLaunch method from AppKit.","title":"About AliceOS"},{"location":"System/02-default-apps/#app-manager","text":"App Manager is a(n) utility in AliceOS that lets users view the apps installed on the AliceOS system and manage their permissions quickly. It is the official method of changing an app's permissions in AliceOS. There are no available methods as the app uses the standard applicationWillLaunch method from AppKit.","title":"App Manager"},{"location":"System/02-default-apps/#inventories","text":"Inventories is a tool for AliceOS that lets developers and players work with an inventory. More information on Inventories can be found in the Inventories documentation .","title":"Inventories"},{"location":"System/03-core-services/","text":"Core Services AliceOS comes with several bundled Core Services that you should be aware of. These Core Services are crucial to AliceOS's core and are included in every AliceOS installation. Core Services are given the .aoscservice file extension and exist under System/CoreServices . Core services also make use of ServiceKit, an in-house framework for defining core services. About ServiceKit At all costs, do not remove ServiceKit.aosframework or attempt to write your own applications using ServiceKit. ServiceKit is a service-only API set that should be used for system-level utilities, not for third-party applications. Use AppKit instead. Desktop The Desktop Core Service is responsible for displaying current applications installed on the system as well as providing a desktop shell if necessary. Error Halt System The Error Halt System (Halt) Core Service is responsible for displaying any critical errors that cause AliceOS to restart. It provides helpful information such as the error code and where to go for more information. More information on how this Core Service works can be found on the article about Critical Errors . Bootloader The Bootloader is responsible for displaying a boot screen while important components are loading. The bootloader is cusomizable with a certain timeout, depending on how fast you want the OS to \"load\". If the Setup Assistant hasn't fired or completed, the bootloader will also load the Setup Assistant. Setup Assistant The Setup Assistant is responsible for setting up any important configurations and settings for AliceOS, as well as creating a username stored in persistent.playername and letting users read any legal agreements before playing a visual novel project. Removing a service If you find that you don't need a particular core service, you can delete it from the CoreServices directory and rebuild AliceOS. Warning If you plan to remove a Core Service, do so with caution. Other parts of AliceOS may make system calls that heavily rely on them.","title":"Core Services"},{"location":"System/03-core-services/#core-services","text":"AliceOS comes with several bundled Core Services that you should be aware of. These Core Services are crucial to AliceOS's core and are included in every AliceOS installation. Core Services are given the .aoscservice file extension and exist under System/CoreServices . Core services also make use of ServiceKit, an in-house framework for defining core services. About ServiceKit At all costs, do not remove ServiceKit.aosframework or attempt to write your own applications using ServiceKit. ServiceKit is a service-only API set that should be used for system-level utilities, not for third-party applications. Use AppKit instead.","title":"Core Services"},{"location":"System/03-core-services/#desktop","text":"The Desktop Core Service is responsible for displaying current applications installed on the system as well as providing a desktop shell if necessary.","title":"Desktop"},{"location":"System/03-core-services/#error-halt-system","text":"The Error Halt System (Halt) Core Service is responsible for displaying any critical errors that cause AliceOS to restart. It provides helpful information such as the error code and where to go for more information. More information on how this Core Service works can be found on the article about Critical Errors .","title":"Error Halt System"},{"location":"System/03-core-services/#bootloader","text":"The Bootloader is responsible for displaying a boot screen while important components are loading. The bootloader is cusomizable with a certain timeout, depending on how fast you want the OS to \"load\". If the Setup Assistant hasn't fired or completed, the bootloader will also load the Setup Assistant.","title":"Bootloader"},{"location":"System/03-core-services/#setup-assistant","text":"The Setup Assistant is responsible for setting up any important configurations and settings for AliceOS, as well as creating a username stored in persistent.playername and letting users read any legal agreements before playing a visual novel project.","title":"Setup Assistant"},{"location":"System/03-core-services/#removing-a-service","text":"If you find that you don't need a particular core service, you can delete it from the CoreServices directory and rebuild AliceOS. Warning If you plan to remove a Core Service, do so with caution. Other parts of AliceOS may make system calls that heavily rely on them.","title":"Removing a service"},{"location":"System/04-critical-errors/","text":"Critical Errors If AliceOS encounters a critical error where it needs to restart to continue, the user will see the above warning and the system will restart automatically after 10 seconds. An error code is provided at the bottom and a QR cose is present to search the error on the Error Database . Critical errors and the halt screen is managed by the Error Halt System (Halt), a Core Service and can be used to present errors that aren't already caught by the base AliceOS distribution. Displaying a halt To display the halt screen with a respective error code, call $ ASHalt.halt(\"ERR_CODE\") . The system will display the halt and automatically restart after ten seconds. Guidelines Halt screens should be used to catch important, critical errors. Make your error code descriptive. The user should be able to get an idea of what the problem might be from the error code itself. For instance, \" MISSING_CYANIDE_INSTRUMENT \" is more descriptive than \" INSTRUMENT_FAIL \". Make sure your error is searchable in the database. The user should be able to search for your error in the Error Database to investigate what went wrong. Don't call the halt screen for a non-critical error. The halt screen is designed to present immediate and important information to the user about a potential error that could damage AliceOS or your game in some way. It shouldn't be used to present an app-wide or section-wide error as the screen is rather intrusive.","title":"Critical Errors"},{"location":"System/04-critical-errors/#critical-errors","text":"If AliceOS encounters a critical error where it needs to restart to continue, the user will see the above warning and the system will restart automatically after 10 seconds. An error code is provided at the bottom and a QR cose is present to search the error on the Error Database . Critical errors and the halt screen is managed by the Error Halt System (Halt), a Core Service and can be used to present errors that aren't already caught by the base AliceOS distribution.","title":"Critical Errors"},{"location":"System/04-critical-errors/#displaying-a-halt","text":"To display the halt screen with a respective error code, call $ ASHalt.halt(\"ERR_CODE\") . The system will display the halt and automatically restart after ten seconds.","title":"Displaying a halt"},{"location":"System/04-critical-errors/#guidelines","text":"Halt screens should be used to catch important, critical errors. Make your error code descriptive. The user should be able to get an idea of what the problem might be from the error code itself. For instance, \" MISSING_CYANIDE_INSTRUMENT \" is more descriptive than \" INSTRUMENT_FAIL \". Make sure your error is searchable in the database. The user should be able to search for your error in the Error Database to investigate what went wrong. Don't call the halt screen for a non-critical error. The halt screen is designed to present immediate and important information to the user about a potential error that could damage AliceOS or your game in some way. It shouldn't be used to present an app-wide or section-wide error as the screen is rather intrusive.","title":"Guidelines"},{"location":"System/05-bootloader/","text":"Bootloader The bootloader is responsible for displaying a boot screen while important components are loading. The bootloader is cusomizable with a certain timeout, depending on how fast you want the OS to \"load\". Available methods $ ASBootloader.boot(timeout=5, expressSetup=True, disclaimer=None, bootView=\"ASBootloaderView\") Show the bootloader for a certain amount of time. Parameters timeout : The amount of seconds to show the bootloader for. expressSetup : Whether the Setup Assistant should start in Express Mode. disclaimer : Any license agreement or disclaimer that must be displayed during the Setup Assistant. bootView : The name of the Ren'Py screen to display as the GUI for the boot loader.","title":"Bootloader"},{"location":"System/05-bootloader/#bootloader","text":"The bootloader is responsible for displaying a boot screen while important components are loading. The bootloader is cusomizable with a certain timeout, depending on how fast you want the OS to \"load\".","title":"Bootloader"},{"location":"System/05-bootloader/#available-methods","text":"","title":"Available methods"},{"location":"System/05-bootloader/#asbootloaderboottimeout5-expresssetuptrue-disclaimernone-bootviewasbootloaderview","text":"Show the bootloader for a certain amount of time. Parameters timeout : The amount of seconds to show the bootloader for. expressSetup : Whether the Setup Assistant should start in Express Mode. disclaimer : Any license agreement or disclaimer that must be displayed during the Setup Assistant. bootView : The name of the Ren'Py screen to display as the GUI for the boot loader.","title":"$ ASBootloader.boot(timeout=5, expressSetup=True, disclaimer=None, bootView=\"ASBootloaderView\")"},{"location":"System/06-setup-assistant/","text":"Setup Assistant The Setup Assistant is a first-run tool designed to set any initial settings and/or configurations for AliceOS before starting the visual novel. It also lets the user create a username as well as read over and legel agreements or disclaimers the game creator has provided. Tip Starting with AliceOS Prospect Park, the Setup Assistant is automatically configured to use Express Mode, which skips a lot of the onerous steps in the original process. However, for a more thorough experience, Express Mode can be turned off. Automatic Setup In the Bootloader, the Setup Assistant will run if it doesn't detect that any setup was done. This check is done via persistent.AS_COMPLETED_SETUP . The boot loader's boot() method contains parameters to customize the Assistant's modes and any additional disclaimers, if necessary. Manual Setup If you want to call the Setup Assistant manually, you can use ASSetup.startSetup() to call the Assistant at any time. startSetup(express=True, disclaimer=None) Parameters express : Whether Express Mode is enabled. The default is set to True. disclaimer : A string containing any disclaimers or legal agreements. If set to None, the Setup Assistant will skip this step. Returns The Setup Assistant will return persistent.playername if it is deemed necessary for use. Adding steps to the Setup Assistant The Setup Assistant can be further customized by editing startSetup() in the core service file. The function calls the ASSetupAssistantView to display the step as a slide and collect any information if necessary. For example: renpy . call_screen ( ASSetupAssistantView , title = Create Your Username , instructions = Type in a username that you want to use while using AliceOS. This name will also appear as your character name if applicable. , useInputMethod = True ) ASSetupAssistantView(title=\"Setup Assistant\", instructions, useInputMethod=False, completed=False) Parameters title : The title of the step or slide. instructions : A brief description or set of instructions of what needs to be done on the step. useInputMethod : Whether to hide the 'Next' button and insert a text field instead. completed : Whether to change the 'Next' button text to 'Finish'. Returns If the screen is called using renpy.call_screen() , the following is returned: For steps that do not use the input method, 'didCompleteStep' is returned. For steps that use the input method, the input is returned as a string.","title":"Setup Assistant"},{"location":"System/06-setup-assistant/#setup-assistant","text":"The Setup Assistant is a first-run tool designed to set any initial settings and/or configurations for AliceOS before starting the visual novel. It also lets the user create a username as well as read over and legel agreements or disclaimers the game creator has provided. Tip Starting with AliceOS Prospect Park, the Setup Assistant is automatically configured to use Express Mode, which skips a lot of the onerous steps in the original process. However, for a more thorough experience, Express Mode can be turned off.","title":"Setup Assistant"},{"location":"System/06-setup-assistant/#automatic-setup","text":"In the Bootloader, the Setup Assistant will run if it doesn't detect that any setup was done. This check is done via persistent.AS_COMPLETED_SETUP . The boot loader's boot() method contains parameters to customize the Assistant's modes and any additional disclaimers, if necessary.","title":"Automatic Setup"},{"location":"System/06-setup-assistant/#manual-setup","text":"If you want to call the Setup Assistant manually, you can use ASSetup.startSetup() to call the Assistant at any time.","title":"Manual Setup"},{"location":"System/06-setup-assistant/#startsetupexpresstrue-disclaimernone","text":"Parameters express : Whether Express Mode is enabled. The default is set to True. disclaimer : A string containing any disclaimers or legal agreements. If set to None, the Setup Assistant will skip this step. Returns The Setup Assistant will return persistent.playername if it is deemed necessary for use.","title":"startSetup(express=True, disclaimer=None)"},{"location":"System/06-setup-assistant/#adding-steps-to-the-setup-assistant","text":"The Setup Assistant can be further customized by editing startSetup() in the core service file. The function calls the ASSetupAssistantView to display the step as a slide and collect any information if necessary. For example: renpy . call_screen ( ASSetupAssistantView , title = Create Your Username , instructions = Type in a username that you want to use while using AliceOS. This name will also appear as your character name if applicable. , useInputMethod = True )","title":"Adding steps to the Setup Assistant"},{"location":"System/06-setup-assistant/#assetupassistantviewtitlesetup-assistant-instructions-useinputmethodfalse-completedfalse","text":"Parameters title : The title of the step or slide. instructions : A brief description or set of instructions of what needs to be done on the step. useInputMethod : Whether to hide the 'Next' button and insert a text field instead. completed : Whether to change the 'Next' button text to 'Finish'. Returns If the screen is called using renpy.call_screen() , the following is returned: For steps that do not use the input method, 'didCompleteStep' is returned. For steps that use the input method, the input is returned as a string.","title":"ASSetupAssistantView(title=\"Setup Assistant\", instructions, useInputMethod=False, completed=False)"},{"location":"System/07-inventories/","text":"Inventories Inventories is a great tool included with AliceOS to set up, manage, and use an inventory system in any AliceOS-powered visual novel. Developers can easily define items and manage the inventory with the Inventories API, and users get an easy experience with managing items using the Inventories app built with ScreenKit. Inventories is an opt-in system, so if you don't think you need Inventories, you don't have to work with it at all. Features The Inventories app comes with some great features that work well with AliceOS: A fast and easy way to define items using the ASInventoryItem class that can state what an item is and how it can be used Methods to add and remove items from the inventory, as well as importing an inventory from a Python list GUI for players to use an item and see what they have in store Optional HUD to let players access the first five items in the inventory A sample inventory system Creating and maintaining the inventory can be accomplished easily in Ren'Py: label the_story : python : used_office_key = False def use_office_key () : store . used_office_key = True office_key_item = ASInventoryItem ( name = Office Key , description = Opens up the office door , canBeUsedOnce = True , specialUseCase = use_office_key ) Quickly, I look around the room for any keys to open the door and finally get out of the office. After searching under a few desks, I manage to find a key. $ inventory . addItem ( office_key_item ) while not used_office_key : Great! Now to just get the door open. The key unlocks the door, and I happily skip out. return When a player uses the item via the Inventories app, all of the logic for handling one-time use and even removing the item from the inventory is taken care of for you. Creating an item The inventory works with the ASInventoryItem class as a means of defining items and how they can be used in Inventories. Below are the required fields in the constructor ( __init__ ). Note Items in the inventory must use the ASInventoryItem class to ensure compatibility with the app and with the inventory methods. name : String containing the name of the item. Defaults to \"Item\" description : String containing the description of the item. Defaults to an empty string. canBeUsed : Boolean dictating whether the item can be used. Defaults to True . specialUseCase : Function that dictates any game-changing behavior or any other actions to be completed when an item is used. Defaults to None . canBeUsedOnce : Boolean dictating whether the item is a one-time-use. Defaults to False . imageName : String containing the path to the image. Should be 128px by 128px. Defaults to the standard missing item image path. Managing the inventory The inventory can be invoked from inventory and is an instance of the ASInventories class, an app written with AppKit. The following methods are provided to make inventory management easier: applicationWillLaunch() Open the Inventories app. Inherited from ASAppRepresentative . callRecentItems() Opens the Inventories HUD which lets players access the first five items in the inventory. Useful in the quick menu or in scenarios where opening the Inventories app is impractical. isEmpty() Returns whether the inventory is empty or not as a boolean. retrieve() Returns the inventory as a list of items ( ASInventoryItem ). containsItem(item) Checks whether the inventory contains a specific item. Parameters item : The item to check for ( ASInventoryItem ) Returns : Boolean value stating whether the item is in the inventory getItemByName(name) Looks for an item in the inventory and returns it, if possible. Parameters name : String containing the name of the item Returns : The appropriate ASInventoryItem object if found or None if the search fails. addItem(item) Adds an item to the inventory if possible and displays a notification if the user permits. Parameters item : The item to insert ( ASInventoryItem ) Raises : May raise a TypeError if the item isn't an ASInventoryItem object useItem(item) Use an item if it exists in the inventory. Also removes any items that can no longer be used. Parameters item : The item to use ( ASInventoryItem ) Raises : May raise a KeyError if the item is not in the inventory importFromList(list) Imports the inventory from a Python list by appending each item to the inventory. Parameters list : The list containing ASInventoryItem items to import Raises : May raise a TypeError if the list contains elements that are not ASInventoryItem objects Saving the inventory It might be helpful to make sure that the player's inventory is properly saved since the class re-initialized with an empty inventory from the beginning. We recommend storing the current inventory before closing out the game. For example, if you wanted to store the inventory to the persistent file: label quit : $ persistent . saved_inventory = inventory . retrieve () return Then, when you start the game again, you can reload these items: label before_main_menu : $ inventory . importFromList ( persistent . saved_inventory ) return Alternatively, you can save the state of these items in your game's file save or in Ren'Py's store variables: default player_inventory = [] $ player_inventory = inventory . retrieve () label after_load : $ inventory . importFromList ( player_inventory ) return Using the HUD The Inventories HUD is a great way to let players quickly access items without opening up the Inventories app. While you could make a cutton to open the app directly, it might be impractical at times. The HUD offers a solution as it shows players just the items and optionally lets them open the app for more items/details. For instance, it might be useful to include this HUD in the quick menu of your visual novel: screen quick_menu () : ## Ensure this appears on top of other screens . zorder 100 if quick_menu : hbox : style_prefix quick xalign 0 . 5 yalign 1 . 0 textbutton _ ( Back ) action Rollback () textbutton _ ( History ) action ShowMenu ( history ) textbutton _ ( Skip ) action Skip () alternate Skip ( fast = True , confirm = True ) textbutton _ ( Auto ) action Preference ( auto-forward , toggle ) textbutton _ ( Save ) action ShowMenu ( save ) textbutton _ ( Use Item ) action Function ( inventory . callRecentItems ) textbutton _ ( Q.Save ) action QuickSave () textbutton _ ( Q.Load ) action QuickLoad () textbutton _ ( Prefs ) action ShowMenu ( preferences ) During gameplay, the \"Use Item\" button will appear next to the typical buttons in the quick menu and players can click on it to open the HUD. More information on the callRecentItems() method used can be found in the inventory's class documentation .","title":"Inventories"},{"location":"System/07-inventories/#inventories","text":"Inventories is a great tool included with AliceOS to set up, manage, and use an inventory system in any AliceOS-powered visual novel. Developers can easily define items and manage the inventory with the Inventories API, and users get an easy experience with managing items using the Inventories app built with ScreenKit. Inventories is an opt-in system, so if you don't think you need Inventories, you don't have to work with it at all.","title":"Inventories"},{"location":"System/07-inventories/#features","text":"The Inventories app comes with some great features that work well with AliceOS: A fast and easy way to define items using the ASInventoryItem class that can state what an item is and how it can be used Methods to add and remove items from the inventory, as well as importing an inventory from a Python list GUI for players to use an item and see what they have in store Optional HUD to let players access the first five items in the inventory","title":"Features"},{"location":"System/07-inventories/#a-sample-inventory-system","text":"Creating and maintaining the inventory can be accomplished easily in Ren'Py: label the_story : python : used_office_key = False def use_office_key () : store . used_office_key = True office_key_item = ASInventoryItem ( name = Office Key , description = Opens up the office door , canBeUsedOnce = True , specialUseCase = use_office_key ) Quickly, I look around the room for any keys to open the door and finally get out of the office. After searching under a few desks, I manage to find a key. $ inventory . addItem ( office_key_item ) while not used_office_key : Great! Now to just get the door open. The key unlocks the door, and I happily skip out. return When a player uses the item via the Inventories app, all of the logic for handling one-time use and even removing the item from the inventory is taken care of for you.","title":"A sample inventory system"},{"location":"System/07-inventories/#creating-an-item","text":"The inventory works with the ASInventoryItem class as a means of defining items and how they can be used in Inventories. Below are the required fields in the constructor ( __init__ ). Note Items in the inventory must use the ASInventoryItem class to ensure compatibility with the app and with the inventory methods. name : String containing the name of the item. Defaults to \"Item\" description : String containing the description of the item. Defaults to an empty string. canBeUsed : Boolean dictating whether the item can be used. Defaults to True . specialUseCase : Function that dictates any game-changing behavior or any other actions to be completed when an item is used. Defaults to None . canBeUsedOnce : Boolean dictating whether the item is a one-time-use. Defaults to False . imageName : String containing the path to the image. Should be 128px by 128px. Defaults to the standard missing item image path.","title":"Creating an item"},{"location":"System/07-inventories/#managing-the-inventory","text":"The inventory can be invoked from inventory and is an instance of the ASInventories class, an app written with AppKit. The following methods are provided to make inventory management easier:","title":"Managing the inventory"},{"location":"System/07-inventories/#applicationwilllaunch","text":"Open the Inventories app. Inherited from ASAppRepresentative .","title":"applicationWillLaunch()"},{"location":"System/07-inventories/#callrecentitems","text":"Opens the Inventories HUD which lets players access the first five items in the inventory. Useful in the quick menu or in scenarios where opening the Inventories app is impractical.","title":"callRecentItems()"},{"location":"System/07-inventories/#isempty","text":"Returns whether the inventory is empty or not as a boolean.","title":"isEmpty()"},{"location":"System/07-inventories/#retrieve","text":"Returns the inventory as a list of items ( ASInventoryItem ).","title":"retrieve()"},{"location":"System/07-inventories/#containsitemitem","text":"Checks whether the inventory contains a specific item. Parameters item : The item to check for ( ASInventoryItem ) Returns : Boolean value stating whether the item is in the inventory","title":"containsItem(item)"},{"location":"System/07-inventories/#getitembynamename","text":"Looks for an item in the inventory and returns it, if possible. Parameters name : String containing the name of the item Returns : The appropriate ASInventoryItem object if found or None if the search fails.","title":"getItemByName(name)"},{"location":"System/07-inventories/#additemitem","text":"Adds an item to the inventory if possible and displays a notification if the user permits. Parameters item : The item to insert ( ASInventoryItem ) Raises : May raise a TypeError if the item isn't an ASInventoryItem object","title":"addItem(item)"},{"location":"System/07-inventories/#useitemitem","text":"Use an item if it exists in the inventory. Also removes any items that can no longer be used. Parameters item : The item to use ( ASInventoryItem ) Raises : May raise a KeyError if the item is not in the inventory","title":"useItem(item)"},{"location":"System/07-inventories/#importfromlistlist","text":"Imports the inventory from a Python list by appending each item to the inventory. Parameters list : The list containing ASInventoryItem items to import Raises : May raise a TypeError if the list contains elements that are not ASInventoryItem objects","title":"importFromList(list)"},{"location":"System/07-inventories/#saving-the-inventory","text":"It might be helpful to make sure that the player's inventory is properly saved since the class re-initialized with an empty inventory from the beginning. We recommend storing the current inventory before closing out the game. For example, if you wanted to store the inventory to the persistent file: label quit : $ persistent . saved_inventory = inventory . retrieve () return Then, when you start the game again, you can reload these items: label before_main_menu : $ inventory . importFromList ( persistent . saved_inventory ) return Alternatively, you can save the state of these items in your game's file save or in Ren'Py's store variables: default player_inventory = [] $ player_inventory = inventory . retrieve () label after_load : $ inventory . importFromList ( player_inventory ) return","title":"Saving the inventory"},{"location":"System/07-inventories/#using-the-hud","text":"The Inventories HUD is a great way to let players quickly access items without opening up the Inventories app. While you could make a cutton to open the app directly, it might be impractical at times. The HUD offers a solution as it shows players just the items and optionally lets them open the app for more items/details. For instance, it might be useful to include this HUD in the quick menu of your visual novel: screen quick_menu () : ## Ensure this appears on top of other screens . zorder 100 if quick_menu : hbox : style_prefix quick xalign 0 . 5 yalign 1 . 0 textbutton _ ( Back ) action Rollback () textbutton _ ( History ) action ShowMenu ( history ) textbutton _ ( Skip ) action Skip () alternate Skip ( fast = True , confirm = True ) textbutton _ ( Auto ) action Preference ( auto-forward , toggle ) textbutton _ ( Save ) action ShowMenu ( save ) textbutton _ ( Use Item ) action Function ( inventory . callRecentItems ) textbutton _ ( Q.Save ) action QuickSave () textbutton _ ( Q.Load ) action QuickLoad () textbutton _ ( Prefs ) action ShowMenu ( preferences ) During gameplay, the \"Use Item\" button will appear next to the typical buttons in the quick menu and players can click on it to open the HUD. More information on the callRecentItems() method used can be found in the inventory's class documentation .","title":"Using the HUD"}]} \ No newline at end of file +{"config":{"lang":["en"],"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome AliceOS is a robust and evolving framework for developing interactive visual novel experiences with operating system-like features such as notifications and setup assistants. Features and Principles The core principles of AliceOS are: Modular : AliceOS uses a new framework format, under the .aosframework format. These frameworks are placed in the System/Frameworks folder and are not heavily reliant on AppKit.aosframework. However, the definitions file that states the default directories and what-not must be included in the System folder (including fonts). Apple-style APIs : AliceOS's APIs aim to be easy-to-use and familiar to developers that have worked with APIs for macOS, iOS, tvOS, and watchOS. Safely extensible : AliceOS includes support for extending itself with apps that are protected using appropriate, official APIs. Easy-to-install : AliceOS installation is as easy as just copying the Ren'Py archive over to the game folder.","title":"Welcome"},{"location":"#welcome","text":"AliceOS is a robust and evolving framework for developing interactive visual novel experiences with operating system-like features such as notifications and setup assistants.","title":"Welcome"},{"location":"#features-and-principles","text":"The core principles of AliceOS are: Modular : AliceOS uses a new framework format, under the .aosframework format. These frameworks are placed in the System/Frameworks folder and are not heavily reliant on AppKit.aosframework. However, the definitions file that states the default directories and what-not must be included in the System folder (including fonts). Apple-style APIs : AliceOS's APIs aim to be easy-to-use and familiar to developers that have worked with APIs for macOS, iOS, tvOS, and watchOS. Safely extensible : AliceOS includes support for extending itself with apps that are protected using appropriate, official APIs. Easy-to-install : AliceOS installation is as easy as just copying the Ren'Py archive over to the game folder.","title":"Features and Principles"},{"location":"01-install/","text":"Installing AliceOS This document will help you get started with installing AliceOS and attaching it to your Ren'Py project. Downloading the base system If you do not plan to customize AliceOS too much, you can add the base system archive and use AliceOS that way. Download the latest release from the Downloads page and extract the ZIP archive. Then, copy AliceOSBaseSystem.rpa over to your Ren'Py project's game folder. Ensure compatibility The latest version of AliceOS for download will always correspond to the latest version of the Ren'Py SDK made available at that time. At the time of writing, this means that AliceOS is building against Ren'Py SDK v 7.3.5 . If you are unsure of what version AliceOS is built with, check the GitHub Actions page and click on \"Build AliceOS Archive\". It is recommend that you make sure that your version of Ren'Py is up to date to ensure compatibility with AliceOS. Usage with DDLC Mods If you plan to use AliceOS in a mod for Doki Doki Literature Club! , you must make sure that the base system version that you use is built against Ren'Py 6.99.12.4 to maintain compatibility. The release ZIP file is generally noted as AliceOS-x.x.x-_6.99.12.4-ASBaseSystem.zip . Building from source code Alternatively, you can build AliceOSBaseSystem.rpa yourself with the customization you need. This may also be helpful in building AliceOS for your specific Ren'Py version, if necessary. Download the source code for the particular release you'd like and open Ren'Py Launcher. Select the AliceOS source code and click \"Build Distributions\". Uncheck the distribution options and check \"Alice OS Base System Distributable\". Click \"Build\". Your resulting ZIP file will be located in AliceOS-x.x.x-dists , and you can follow the instructions from Downloading the base system to finalize installation.","title":"Installing AliceOS"},{"location":"01-install/#installing-aliceos","text":"This document will help you get started with installing AliceOS and attaching it to your Ren'Py project.","title":"Installing AliceOS"},{"location":"01-install/#downloading-the-base-system","text":"If you do not plan to customize AliceOS too much, you can add the base system archive and use AliceOS that way. Download the latest release from the Downloads page and extract the ZIP archive. Then, copy AliceOSBaseSystem.rpa over to your Ren'Py project's game folder. Ensure compatibility The latest version of AliceOS for download will always correspond to the latest version of the Ren'Py SDK made available at that time. At the time of writing, this means that AliceOS is building against Ren'Py SDK v 7.3.5 . If you are unsure of what version AliceOS is built with, check the GitHub Actions page and click on \"Build AliceOS Archive\". It is recommend that you make sure that your version of Ren'Py is up to date to ensure compatibility with AliceOS.","title":"Downloading the base system"},{"location":"01-install/#usage-with-ddlc-mods","text":"If you plan to use AliceOS in a mod for Doki Doki Literature Club! , you must make sure that the base system version that you use is built against Ren'Py 6.99.12.4 to maintain compatibility. The release ZIP file is generally noted as AliceOS-x.x.x-_6.99.12.4-ASBaseSystem.zip .","title":"Usage with DDLC Mods"},{"location":"01-install/#building-from-source-code","text":"Alternatively, you can build AliceOSBaseSystem.rpa yourself with the customization you need. This may also be helpful in building AliceOS for your specific Ren'Py version, if necessary. Download the source code for the particular release you'd like and open Ren'Py Launcher. Select the AliceOS source code and click \"Build Distributions\". Uncheck the distribution options and check \"Alice OS Base System Distributable\". Click \"Build\". Your resulting ZIP file will be located in AliceOS-x.x.x-dists , and you can follow the instructions from Downloading the base system to finalize installation.","title":"Building from source code"},{"location":"02-contributing/","text":"Contribution Guidelines AliceOS is free and open-source software, hosted on GitHub, and accepts contributions from the community. To make the contribution process quick, smooth, easy, and fun, we've devised a set of guidelines to ensure code quality and security. Please consult these when making a pull request, issue, etc. General Code Guidelines These guidelines apply to code that is written in AliceOS. Follow the AliceOS API Styling Although AliceOS is a Python-based framework, our APIs are similarly written to those of the APIs used when creating macOS and iOS apps and are in camel case. This usually serves two purposes: To identify AliceOS code from the rest of a visual novel project To make it easy to understand when migrating from Apple platform development Example: applicationWillRequestNotification vs. application_will_request_notification System-wide variables such as release names should be capitalized and use snake case as normal. Example: AS_SYS_VERSION vs. asSysVersion Follow commit conventions The AliceOS team has adopted the same commit conventions from Clarity , the parent organization running Sayonika. This commit style definitely explains where changes occured and what was changed in a succinct manner. However, there are some changes we have made to this commit style: Common directories such as System, Applications, and Library do not need to be fully typed out. File extensions for frameworks ( .aosframework ), core services ( .aoscservice ), and applications ( .aosapp ) do not need to be typed out. Example: [S/F/ServiceKit] Resolve misnaming of serviceWillRequestNotification from applicationWillRequestNotification Keep code organized The AliceOS structure is organized based on a simple macOS file structure to make everything easy to locate. Please try to keep this organization when contributing your code. Issues These guidelines apply to issues on GitHub. Be as descriptive and concise as possible So that AliceOS contributors and developers can better understand what the issue or request may be, issue descriptions should be concise but also descrptive. Refrain from writing an issue in a convoluted way that confuses others. Additionally, if you feel using a screenshot or video will better illustrate your description, add them in conjuction with (or to replace) the description. Remember to consult the Screenshot Guidelines . Label your issue during creation Issues are categorized by types such as bug , enhancement , question , etc. by contributors that can access labels. Since it isn't possible to tag an issue during creation, prepend the tag to your issue's title. Example: [Bug] applicationShouldRequestNotification always returns False Pull Requests These guides apply to pull requests on GitHub. Describe all of your changes Pull requests generally include many changes that address a particular problem or a set of problems. Explain all of the changes you made; you may also specify the subsystems (directories) by using the commit message style. Example: This PR makes the following changes: [S/F/ServiceKit] Renames applicationWillRequestSync to serviceWillRequestSync [S/A/Messages] Adds new MessagesView to view conversation history Reference existing issues and PRs If applicable, pull requests will reference the issues they are fixing in the description. This helps organize contributions in a few ways: Automates closing issues when they are fixed Verifies that the pull request fixes the issue(s) in question Makes a reference in the issue's thread for context If there are any documented issues that the pull request addresses, reference them in the description of the pull request. Example: [S/A/Logokas] Resolve applicationShouldRequestLogokasPermission to correct booleans (fixes #1) Screenshots These guidelines apply to screenshots that are used for reference in issues and/or pull requests. Respect the user's/developer's visibility Make sure that your screenshots don't display personally-identifiable information. When possible, try to use fake data designed for testing instead of real data. Ensure screenshots are clear Screenshots are often included to help illustrate or demonstrate a point with an issue or pull request. It may be difficult to understand the screenshot's purpose if the image is too small or distorted. Ensure that all screenshots are clear and visible. For Official Contributors For official developers and Project Alice members, there are some additional guidelines to follow to ensure that code is signed and verified: Sign off your code and enable verified commits Verified commits let developers, contributors, and users know that the code they are working with is from a trusted source. These commits are signed using GPG or S/MIME and are verified on GitHub. It is mandatory that AliceOS developers and Project Alice members set up verified commits on their device(s) and any tools to digitally sign their code when pushing to GitHub. More information can be found on GitHub's support page .","title":"Contribution Guidelines"},{"location":"02-contributing/#contribution-guidelines","text":"AliceOS is free and open-source software, hosted on GitHub, and accepts contributions from the community. To make the contribution process quick, smooth, easy, and fun, we've devised a set of guidelines to ensure code quality and security. Please consult these when making a pull request, issue, etc.","title":"Contribution Guidelines"},{"location":"02-contributing/#general-code-guidelines","text":"These guidelines apply to code that is written in AliceOS.","title":"General Code Guidelines"},{"location":"02-contributing/#follow-the-aliceos-api-styling","text":"Although AliceOS is a Python-based framework, our APIs are similarly written to those of the APIs used when creating macOS and iOS apps and are in camel case. This usually serves two purposes: To identify AliceOS code from the rest of a visual novel project To make it easy to understand when migrating from Apple platform development Example: applicationWillRequestNotification vs. application_will_request_notification System-wide variables such as release names should be capitalized and use snake case as normal. Example: AS_SYS_VERSION vs. asSysVersion","title":"Follow the AliceOS API Styling"},{"location":"02-contributing/#follow-commit-conventions","text":"The AliceOS team has adopted the same commit conventions from Clarity , the parent organization running Sayonika. This commit style definitely explains where changes occured and what was changed in a succinct manner. However, there are some changes we have made to this commit style: Common directories such as System, Applications, and Library do not need to be fully typed out. File extensions for frameworks ( .aosframework ), core services ( .aoscservice ), and applications ( .aosapp ) do not need to be typed out. Example: [S/F/ServiceKit] Resolve misnaming of serviceWillRequestNotification from applicationWillRequestNotification","title":"Follow commit conventions"},{"location":"02-contributing/#keep-code-organized","text":"The AliceOS structure is organized based on a simple macOS file structure to make everything easy to locate. Please try to keep this organization when contributing your code.","title":"Keep code organized"},{"location":"02-contributing/#issues","text":"These guidelines apply to issues on GitHub.","title":"Issues"},{"location":"02-contributing/#be-as-descriptive-and-concise-as-possible","text":"So that AliceOS contributors and developers can better understand what the issue or request may be, issue descriptions should be concise but also descrptive. Refrain from writing an issue in a convoluted way that confuses others. Additionally, if you feel using a screenshot or video will better illustrate your description, add them in conjuction with (or to replace) the description. Remember to consult the Screenshot Guidelines .","title":"Be as descriptive and concise as possible"},{"location":"02-contributing/#label-your-issue-during-creation","text":"Issues are categorized by types such as bug , enhancement , question , etc. by contributors that can access labels. Since it isn't possible to tag an issue during creation, prepend the tag to your issue's title. Example: [Bug] applicationShouldRequestNotification always returns False","title":"Label your issue during creation"},{"location":"02-contributing/#pull-requests","text":"These guides apply to pull requests on GitHub.","title":"Pull Requests"},{"location":"02-contributing/#describe-all-of-your-changes","text":"Pull requests generally include many changes that address a particular problem or a set of problems. Explain all of the changes you made; you may also specify the subsystems (directories) by using the commit message style. Example: This PR makes the following changes: [S/F/ServiceKit] Renames applicationWillRequestSync to serviceWillRequestSync [S/A/Messages] Adds new MessagesView to view conversation history","title":"Describe all of your changes"},{"location":"02-contributing/#reference-existing-issues-and-prs","text":"If applicable, pull requests will reference the issues they are fixing in the description. This helps organize contributions in a few ways: Automates closing issues when they are fixed Verifies that the pull request fixes the issue(s) in question Makes a reference in the issue's thread for context If there are any documented issues that the pull request addresses, reference them in the description of the pull request. Example: [S/A/Logokas] Resolve applicationShouldRequestLogokasPermission to correct booleans (fixes #1)","title":"Reference existing issues and PRs"},{"location":"02-contributing/#screenshots","text":"These guidelines apply to screenshots that are used for reference in issues and/or pull requests.","title":"Screenshots"},{"location":"02-contributing/#respect-the-usersdevelopers-visibility","text":"Make sure that your screenshots don't display personally-identifiable information. When possible, try to use fake data designed for testing instead of real data.","title":"Respect the user's/developer's visibility"},{"location":"02-contributing/#ensure-screenshots-are-clear","text":"Screenshots are often included to help illustrate or demonstrate a point with an issue or pull request. It may be difficult to understand the screenshot's purpose if the image is too small or distorted. Ensure that all screenshots are clear and visible.","title":"Ensure screenshots are clear"},{"location":"02-contributing/#for-official-contributors","text":"For official developers and Project Alice members, there are some additional guidelines to follow to ensure that code is signed and verified:","title":"For Official Contributors"},{"location":"02-contributing/#sign-off-your-code-and-enable-verified-commits","text":"Verified commits let developers, contributors, and users know that the code they are working with is from a trusted source. These commits are signed using GPG or S/MIME and are verified on GitHub. It is mandatory that AliceOS developers and Project Alice members set up verified commits on their device(s) and any tools to digitally sign their code when pushing to GitHub. More information can be found on GitHub's support page .","title":"Sign off your code and enable verified commits"},{"location":"Develop-Apps/","text":"Welcome Apps are a fun and extensible means of further enhancing the AliceOS environment without needing to customize the base installation and recompile from source. Apps also take advantage of AliceOS's features and frameworks, such as NotificationKit and ScreenKit. To accomplish this, apps use AppKit, the official API set for writing custom apps for the AliceOS framework. About this section The following documentation will cover the important facets of creating an AliceOS app and what frameworks are available. It will also cover important guidelines that all AliceOS apps should follow to maintain security, privacy, and consistency.","title":"Welcome"},{"location":"Develop-Apps/#welcome","text":"Apps are a fun and extensible means of further enhancing the AliceOS environment without needing to customize the base installation and recompile from source. Apps also take advantage of AliceOS's features and frameworks, such as NotificationKit and ScreenKit. To accomplish this, apps use AppKit, the official API set for writing custom apps for the AliceOS framework.","title":"Welcome"},{"location":"Develop-Apps/#about-this-section","text":"The following documentation will cover the important facets of creating an AliceOS app and what frameworks are available. It will also cover important guidelines that all AliceOS apps should follow to maintain security, privacy, and consistency.","title":"About this section"},{"location":"Develop-Apps/01-manifest/","text":"Declaring Your App Any app for AliceOS has its own manifest and declarations for what the app does. Luckily, defining an app is as easy as writing it directly into the class that all AliceOS apps inherit from. Typical app structure Apps are usually located in Applications , inside of the game folder, and have the file extension .aosapp . Inside of the file, a Ren'Py script help determine details about the app, and a Resources folder is included to add assets such as icons, images, and definitions. For instance, if we are creating an app call Foobanizer , the structure would look like this: game / Applications / Foobanizer . aosapp / Foobanizer . rpy Resources / Iconset / 16 . png 24 . png 32 . png 48 . png 64 . png 128 . png 256 . png Note that the icons are located in Resources/Iconset/ and have sizes for 16px, 24px, 32px, 48px, 64px, 128px, and 256px. These icons are important as they will appear in notifications, the desktop, and other places that require an icon. Writing your app's manifest AliceOS apps' manifests are included directly inside of their main app delegate, a subclass of ASAppRepresentative() . There are several important key field that should be directly written: bundleName : The name of the application. bundleId : The ID of the application in reverse domain name notation . bundleDir : The location of the application. By default, apps use AS_APPS_DIR + \" applicationname .aosapp/\" . bundleAuthor : The author or organization that developed the application. bundleVersion : The version of the application. bundleDescription : The description of the application. Agan, if we wanted to write Foobanizer's manifest, it'd look like this: init 10 python : class Foobanizer ( ASAppRepresentative ): bundleName = Foobanizer bundleId = app.aliceos.foobanizer bundleDir = AS_APPS_DIR + Foobanizer.aosapp/ bundleAuthor = AliceOS Developers bundleVersion = 1.0.0 bundleDescription = \\ Generate random foobanized strings on the fly. ... Declaring permissions Apps that need to make use of notifications via NotificationKit, modify files, watch system events, etc., must declare their permissions. This is done inside of the class via the requires dictionary: requires = { } The main permissions are: AS_REQUIRES_NOTIFICATIONKIT : Requires NotificationKit to send notifications AS_REQUIRES_FULL_DISK_ACCESS : Requires accessing files AS_REQUIRES_SYSTEM_EVENTS : Requires changing settings or watching for events Important All AppKit apps must include this field. If you don't need any permissions or aren't using specific frameworks, leave the dictionary empty. Rebuilding icons Icons for AliceOS apps typically reside in the app's Resources folder, though ASAppRepresentative may not pick it up at first. To ensure your app's icon locations are updated, make sure you initialize the class, where applicationname is the name of your app: def __init__ ( self ): ASAppRepresentative . __init__ ( self , AS_DEFAULT_APP_DIR + applicationname .aosapp/ ) Again, if we wanted to rebuild Foobanizer's icons: def __init__ ( self ): ASAppRepresentative . __init__ ( self , AS_APPS_DIR + Foobanizer.aosapp/ ) Example manifest Here's what the manifest file for Foobanizer would look like: # ASAppRepresentative is a Python class. # Everything must be wrapped in a Python block. init 10 python : class Foobanizer ( ASAppRepresentative ): bundleName = Foobanizer bundleId = app.aliceos.foobanizer bundleDir = AS_APPS_DIR + Foobanizer.aosapp/ bundleAuthor = AliceOS Developers bundleVersion = 1.0.0 bundleDescription = \\ Generate random foobanized strings on the fly. # Foobanizer doesn t require any permissions. requires = { } def __init__ ( self ): ASAppRepresentative . __init__ ( self , AS_APPS_DIR + Foobanizer.aosapp/ ) # Finally, we create an instance to pre-load. foobanizer = Foobanizer () Suggested documentation ASAppRepresentative","title":"Declaring Your App"},{"location":"Develop-Apps/01-manifest/#declaring-your-app","text":"Any app for AliceOS has its own manifest and declarations for what the app does. Luckily, defining an app is as easy as writing it directly into the class that all AliceOS apps inherit from.","title":"Declaring Your App"},{"location":"Develop-Apps/01-manifest/#typical-app-structure","text":"Apps are usually located in Applications , inside of the game folder, and have the file extension .aosapp . Inside of the file, a Ren'Py script help determine details about the app, and a Resources folder is included to add assets such as icons, images, and definitions. For instance, if we are creating an app call Foobanizer , the structure would look like this: game / Applications / Foobanizer . aosapp / Foobanizer . rpy Resources / Iconset / 16 . png 24 . png 32 . png 48 . png 64 . png 128 . png 256 . png Note that the icons are located in Resources/Iconset/ and have sizes for 16px, 24px, 32px, 48px, 64px, 128px, and 256px. These icons are important as they will appear in notifications, the desktop, and other places that require an icon.","title":"Typical app structure"},{"location":"Develop-Apps/01-manifest/#writing-your-apps-manifest","text":"AliceOS apps' manifests are included directly inside of their main app delegate, a subclass of ASAppRepresentative() . There are several important key field that should be directly written: bundleName : The name of the application. bundleId : The ID of the application in reverse domain name notation . bundleDir : The location of the application. By default, apps use AS_APPS_DIR + \" applicationname .aosapp/\" . bundleAuthor : The author or organization that developed the application. bundleVersion : The version of the application. bundleDescription : The description of the application. Agan, if we wanted to write Foobanizer's manifest, it'd look like this: init 10 python : class Foobanizer ( ASAppRepresentative ): bundleName = Foobanizer bundleId = app.aliceos.foobanizer bundleDir = AS_APPS_DIR + Foobanizer.aosapp/ bundleAuthor = AliceOS Developers bundleVersion = 1.0.0 bundleDescription = \\ Generate random foobanized strings on the fly. ...","title":"Writing your app's manifest"},{"location":"Develop-Apps/01-manifest/#declaring-permissions","text":"Apps that need to make use of notifications via NotificationKit, modify files, watch system events, etc., must declare their permissions. This is done inside of the class via the requires dictionary: requires = { } The main permissions are: AS_REQUIRES_NOTIFICATIONKIT : Requires NotificationKit to send notifications AS_REQUIRES_FULL_DISK_ACCESS : Requires accessing files AS_REQUIRES_SYSTEM_EVENTS : Requires changing settings or watching for events Important All AppKit apps must include this field. If you don't need any permissions or aren't using specific frameworks, leave the dictionary empty.","title":"Declaring permissions"},{"location":"Develop-Apps/01-manifest/#rebuilding-icons","text":"Icons for AliceOS apps typically reside in the app's Resources folder, though ASAppRepresentative may not pick it up at first. To ensure your app's icon locations are updated, make sure you initialize the class, where applicationname is the name of your app: def __init__ ( self ): ASAppRepresentative . __init__ ( self , AS_DEFAULT_APP_DIR + applicationname .aosapp/ ) Again, if we wanted to rebuild Foobanizer's icons: def __init__ ( self ): ASAppRepresentative . __init__ ( self , AS_APPS_DIR + Foobanizer.aosapp/ )","title":"Rebuilding icons"},{"location":"Develop-Apps/01-manifest/#example-manifest","text":"Here's what the manifest file for Foobanizer would look like: # ASAppRepresentative is a Python class. # Everything must be wrapped in a Python block. init 10 python : class Foobanizer ( ASAppRepresentative ): bundleName = Foobanizer bundleId = app.aliceos.foobanizer bundleDir = AS_APPS_DIR + Foobanizer.aosapp/ bundleAuthor = AliceOS Developers bundleVersion = 1.0.0 bundleDescription = \\ Generate random foobanized strings on the fly. # Foobanizer doesn t require any permissions. requires = { } def __init__ ( self ): ASAppRepresentative . __init__ ( self , AS_APPS_DIR + Foobanizer.aosapp/ ) # Finally, we create an instance to pre-load. foobanizer = Foobanizer ()","title":"Example manifest"},{"location":"Develop-Apps/01-manifest/#suggested-documentation","text":"ASAppRepresentative","title":"Suggested documentation"},{"location":"Develop-Apps/02-sending-notifications/","text":"Sending Notifications Notifications are a great way to extend your visual novel project. If done correctly, they often can add an interactive experience that immerses players into the environment. Apps using AppKit have a way to send notification requests to the user that also respect's users' preferences. Declaring notification permissions Your app should have the proper permissions to send notifications via NotificationKit in the app's manifest. To ensure that your app lists itself as needing this permission, be sure to add AS_REQUIRES_NOTIFICATIONKIT into the requires field: requires = { AS_REQUIRES_NOTIFICATIONKIT , ... } Requesting for permission Typically, apps request for notification access before sending notification requests. There are two methods for handling this behavior: requestAllPermissions() will request for all permissions available. Use this only if notifications are dependent on other permissions that must be addressed immediately. requestPermission(forPermission=AS_REQUIRES_NOTIFICATIONKIT) will request specifically for the NotificationKit permission. Sending a temporary notification request (banner) Apps using AppKit have an official means of handling temporary notifications as banners via several methods. More details are provided on the Banners page . applicationShouldRequestNotification() This function is provided to check that the app has been given permission to send notifications. Returns Whether the app has been given permission to send notifications as a Boolean value. Danger Do not override this function unless you need to perform an additional check. applicationWillRequestNotification() Parameters message : The message or title of the notification. withDetails : The details of the notification. responseCallback (Optional) The action to perform when clicking 'Respond'. Tip If there are preliminary actions that should be performed before requesting a notification, you may redefine the function, granted that you also include ASAppRepresentative.applicationWillRequestNotification() . Example def applicationWillRequestNotification ( self , message , withDetails , responseCallback ) : if not Error in message : ASAppRepresentative . applicationWillRequestNotification ( message , withDetails , responseCallback ) else : print (Err: + message + ) + withDetails Danger Do not use any other methods for sending temporary notifications that do not listen to applicationShouldRequestNotification() . All notifications should adhere to users' preference. applicationDidRequestNotification() applicationDidRequestNotification() runs after a notification has been sent. This can be used to watch for a particular action or to do something else. Guidelines Banners are intended for temporary actions that can be ignored, if possible. Keep these guidelines in mind when using banners: Refrain from overloading banners . This can be visually distracting and may annoy the user. Keep the message and details short . Banners are intended for a quick glance or something that doesn't require a lot of attention. Don't force the user to interact with the banner . Banners shouldn't require the user to perform an action. Sending an alert request Apps using AppKit can also make use of alerts to present immediate information to the user and ask for an action. Details on how alerts work can be found in the Alerts documentation . applicationWillRequestBasicAlert(message, withDetails, onDismissCallback) Display a basic alert with a title, message, and a callback when 'OK' is clicked. Parameters message : The message or title of the alert. withDetails : The details of the alert. onDismissCallback (Optional) The action to perform when clicking 'OK'. applicationWillRequestExtendedAlert(message, withDetails, primaryActionText, onPrimaryCallback, secondaryActionText, onSecondaryCallback) Display an alert with a title, message, and two action with respective callbacks. Parameters message : The message or title of the alert. withDetails : The details of the alert. primaryActionText : The text for the primary action button onPrimaryCallback (Optional) The action to perform when clicking the primary button. secondaryActionText : (Optional) The text for the secondary action button onSecondaryCallback (Optional) The action to perform when clicking the secondary button. applicationDidRequestAlert() applicationDidRequestAlert() runs after an alert has been displayed. This can be used to watch for any other events during the alert process. Guidelines Refrain from overloading alerts. Alerts can be seen as intrivusive if too many are displayed at one time. Unless the user needs to make an immediate decision, refrain from using an alert. If the content isn't important, consider a banner. Banners are less intrusive by nature and don't require an immediate action. Suggested documentation Notification banners Notification alerts","title":"Sending Notifications"},{"location":"Develop-Apps/02-sending-notifications/#sending-notifications","text":"Notifications are a great way to extend your visual novel project. If done correctly, they often can add an interactive experience that immerses players into the environment. Apps using AppKit have a way to send notification requests to the user that also respect's users' preferences.","title":"Sending Notifications"},{"location":"Develop-Apps/02-sending-notifications/#declaring-notification-permissions","text":"Your app should have the proper permissions to send notifications via NotificationKit in the app's manifest. To ensure that your app lists itself as needing this permission, be sure to add AS_REQUIRES_NOTIFICATIONKIT into the requires field: requires = { AS_REQUIRES_NOTIFICATIONKIT , ... }","title":"Declaring notification permissions"},{"location":"Develop-Apps/02-sending-notifications/#requesting-for-permission","text":"Typically, apps request for notification access before sending notification requests. There are two methods for handling this behavior: requestAllPermissions() will request for all permissions available. Use this only if notifications are dependent on other permissions that must be addressed immediately. requestPermission(forPermission=AS_REQUIRES_NOTIFICATIONKIT) will request specifically for the NotificationKit permission.","title":"Requesting for permission"},{"location":"Develop-Apps/02-sending-notifications/#sending-a-temporary-notification-request-banner","text":"Apps using AppKit have an official means of handling temporary notifications as banners via several methods. More details are provided on the Banners page .","title":"Sending a temporary notification request (banner)"},{"location":"Develop-Apps/02-sending-notifications/#applicationshouldrequestnotification","text":"This function is provided to check that the app has been given permission to send notifications. Returns Whether the app has been given permission to send notifications as a Boolean value. Danger Do not override this function unless you need to perform an additional check.","title":"applicationShouldRequestNotification()"},{"location":"Develop-Apps/02-sending-notifications/#applicationwillrequestnotification","text":"Parameters message : The message or title of the notification. withDetails : The details of the notification. responseCallback (Optional) The action to perform when clicking 'Respond'. Tip If there are preliminary actions that should be performed before requesting a notification, you may redefine the function, granted that you also include ASAppRepresentative.applicationWillRequestNotification() . Example def applicationWillRequestNotification ( self , message , withDetails , responseCallback ) : if not Error in message : ASAppRepresentative . applicationWillRequestNotification ( message , withDetails , responseCallback ) else : print (Err: + message + ) + withDetails Danger Do not use any other methods for sending temporary notifications that do not listen to applicationShouldRequestNotification() . All notifications should adhere to users' preference.","title":"applicationWillRequestNotification()"},{"location":"Develop-Apps/02-sending-notifications/#applicationdidrequestnotification","text":"applicationDidRequestNotification() runs after a notification has been sent. This can be used to watch for a particular action or to do something else.","title":"applicationDidRequestNotification()"},{"location":"Develop-Apps/02-sending-notifications/#guidelines","text":"Banners are intended for temporary actions that can be ignored, if possible. Keep these guidelines in mind when using banners: Refrain from overloading banners . This can be visually distracting and may annoy the user. Keep the message and details short . Banners are intended for a quick glance or something that doesn't require a lot of attention. Don't force the user to interact with the banner . Banners shouldn't require the user to perform an action.","title":"Guidelines"},{"location":"Develop-Apps/02-sending-notifications/#sending-an-alert-request","text":"Apps using AppKit can also make use of alerts to present immediate information to the user and ask for an action. Details on how alerts work can be found in the Alerts documentation .","title":"Sending an alert request"},{"location":"Develop-Apps/02-sending-notifications/#applicationwillrequestbasicalertmessage-withdetails-ondismisscallback","text":"Display a basic alert with a title, message, and a callback when 'OK' is clicked. Parameters message : The message or title of the alert. withDetails : The details of the alert. onDismissCallback (Optional) The action to perform when clicking 'OK'.","title":"applicationWillRequestBasicAlert(message, withDetails, onDismissCallback)"},{"location":"Develop-Apps/02-sending-notifications/#applicationwillrequestextendedalertmessage-withdetails-primaryactiontext-onprimarycallback-secondaryactiontext-onsecondarycallback","text":"Display an alert with a title, message, and two action with respective callbacks. Parameters message : The message or title of the alert. withDetails : The details of the alert. primaryActionText : The text for the primary action button onPrimaryCallback (Optional) The action to perform when clicking the primary button. secondaryActionText : (Optional) The text for the secondary action button onSecondaryCallback (Optional) The action to perform when clicking the secondary button.","title":"applicationWillRequestExtendedAlert(message, withDetails, primaryActionText, onPrimaryCallback, secondaryActionText, onSecondaryCallback)"},{"location":"Develop-Apps/02-sending-notifications/#applicationdidrequestalert","text":"applicationDidRequestAlert() runs after an alert has been displayed. This can be used to watch for any other events during the alert process.","title":"applicationDidRequestAlert()"},{"location":"Develop-Apps/02-sending-notifications/#guidelines_1","text":"Refrain from overloading alerts. Alerts can be seen as intrivusive if too many are displayed at one time. Unless the user needs to make an immediate decision, refrain from using an alert. If the content isn't important, consider a banner. Banners are less intrusive by nature and don't require an immediate action.","title":"Guidelines"},{"location":"Develop-Apps/02-sending-notifications/#suggested-documentation","text":"Notification banners Notification alerts","title":"Suggested documentation"},{"location":"Develop-Apps/03-interface-design/","text":"Giving your App an Interface Some apps may want to provide a user interface for players to work with to manage settings or work with things in-game. AppKit works hand-in-hand with Ren'Py's screens and makes it easy to work with a Ren'Py-defined UI. AliceOS also comes with ScreenKit, a great way to define an interface that's designed for AliceOS. Attaching a screen to your app Apps that want to display an interface when their icon is clicked in Activities or the App Manager should show the screen in their applicationWillLaunch method, like so: def applicationWillLaunch ( self ): renpy . show_screen ( screenname ) Although it's recommended to design the app's interface with ScreenKit for consistency, this will work for any screen defined in a Ren'Py project. Creating an interface with ScreenKit Creating an interface with ScreenKit is relatively easy since ScreenKit works directly with Ren'Py's screen language. For an existing screen, it's easy to port it over to ScreenKit by adding the style_prefix property at the top of the screen: screen my_screen (): style_prefix ASInterface ... If you are creating an interface from scratch, you can take a look at how to create a very basic UI using screen language and ScreenKit in A Simple UI . Organizing screens in your app Apps might have multiple screens and may lose track of what screen goes where. We recommend adopting a similar structure to the one below to keep your screens organized: AppRoot / Resources / Views / ScreenName . rpy SecondScreen . rpy Styles / ScreenStyles . rpy AppManifest . rpy Suggested documentation A Simple UI Special ScreenKit Styles","title":"Giving your App an Interface"},{"location":"Develop-Apps/03-interface-design/#giving-your-app-an-interface","text":"Some apps may want to provide a user interface for players to work with to manage settings or work with things in-game. AppKit works hand-in-hand with Ren'Py's screens and makes it easy to work with a Ren'Py-defined UI. AliceOS also comes with ScreenKit, a great way to define an interface that's designed for AliceOS.","title":"Giving your App an Interface"},{"location":"Develop-Apps/03-interface-design/#attaching-a-screen-to-your-app","text":"Apps that want to display an interface when their icon is clicked in Activities or the App Manager should show the screen in their applicationWillLaunch method, like so: def applicationWillLaunch ( self ): renpy . show_screen ( screenname ) Although it's recommended to design the app's interface with ScreenKit for consistency, this will work for any screen defined in a Ren'Py project.","title":"Attaching a screen to your app"},{"location":"Develop-Apps/03-interface-design/#creating-an-interface-with-screenkit","text":"Creating an interface with ScreenKit is relatively easy since ScreenKit works directly with Ren'Py's screen language. For an existing screen, it's easy to port it over to ScreenKit by adding the style_prefix property at the top of the screen: screen my_screen (): style_prefix ASInterface ... If you are creating an interface from scratch, you can take a look at how to create a very basic UI using screen language and ScreenKit in A Simple UI .","title":"Creating an interface with ScreenKit"},{"location":"Develop-Apps/03-interface-design/#organizing-screens-in-your-app","text":"Apps might have multiple screens and may lose track of what screen goes where. We recommend adopting a similar structure to the one below to keep your screens organized: AppRoot / Resources / Views / ScreenName . rpy SecondScreen . rpy Styles / ScreenStyles . rpy AppManifest . rpy","title":"Organizing screens in your app"},{"location":"Develop-Apps/03-interface-design/#suggested-documentation","text":"A Simple UI Special ScreenKit Styles","title":"Suggested documentation"},{"location":"Develop-Apps/04-watching-events/","text":"Watching for Events Starting with AliceOS Prospect Park, apps can declare and make use of System Events. Apps that want to use system event watching must declare the AS_REQUIRES_SYSTEM_EVENTS permission in their manifest and use the appropriate methods outlined in this document. What are system events? Any operation that AliceOS performs such as startup, login, or displaying an error is considered a system event. Apps that have the permission can access the following system events: Startup Running tasks during boot Apps using AppKit may want to perform some initialization tasks when AliceOS boots. This can be accomplished by making use of the applicationWillLaunchAtLogin method. applicationWillLaunchAtLogin(self) Runs any initial tasks or specified startup tasks during boot. applicationShouldLaunchAtLogin(self) Determines whether the application has permission to run tasks during boot. Returns : Boolean value dictating if the app has permission to run at boot. Suggested documentation ASAppRepresentative Bootloader","title":"Watching for Events"},{"location":"Develop-Apps/04-watching-events/#watching-for-events","text":"Starting with AliceOS Prospect Park, apps can declare and make use of System Events. Apps that want to use system event watching must declare the AS_REQUIRES_SYSTEM_EVENTS permission in their manifest and use the appropriate methods outlined in this document.","title":"Watching for Events"},{"location":"Develop-Apps/04-watching-events/#what-are-system-events","text":"Any operation that AliceOS performs such as startup, login, or displaying an error is considered a system event. Apps that have the permission can access the following system events: Startup","title":"What are system events?"},{"location":"Develop-Apps/04-watching-events/#running-tasks-during-boot","text":"Apps using AppKit may want to perform some initialization tasks when AliceOS boots. This can be accomplished by making use of the applicationWillLaunchAtLogin method.","title":"Running tasks during boot"},{"location":"Develop-Apps/04-watching-events/#applicationwilllaunchatloginself","text":"Runs any initial tasks or specified startup tasks during boot.","title":"applicationWillLaunchAtLogin(self)"},{"location":"Develop-Apps/04-watching-events/#applicationshouldlaunchatloginself","text":"Determines whether the application has permission to run tasks during boot. Returns : Boolean value dictating if the app has permission to run at boot.","title":"applicationShouldLaunchAtLogin(self)"},{"location":"Develop-Apps/04-watching-events/#suggested-documentation","text":"ASAppRepresentative Bootloader","title":"Suggested documentation"},{"location":"Frameworks/AppKit/","text":"AppKit Overview AppKit is the official API responsible for making apps on AliceOS. AppKit contains the necessary pieces of information to create fun and safe applications that work directly with AliceOS. About this documentation section This section will cover most of the Python class documentation and backend information about AppKit and apps built with it. For more information on how to build an app for AliceOS, see the Develop Apps section. Warning AliceOS's AppKit should not be confused with Apple's AppKit for macOS, the interface kit responsible for creating macOS applications.","title":"AppKit Overview"},{"location":"Frameworks/AppKit/#appkit-overview","text":"AppKit is the official API responsible for making apps on AliceOS. AppKit contains the necessary pieces of information to create fun and safe applications that work directly with AliceOS.","title":"AppKit Overview"},{"location":"Frameworks/AppKit/#about-this-documentation-section","text":"This section will cover most of the Python class documentation and backend information about AppKit and apps built with it. For more information on how to build an app for AliceOS, see the Develop Apps section. Warning AliceOS's AppKit should not be confused with Apple's AppKit for macOS, the interface kit responsible for creating macOS applications.","title":"About this documentation section"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/","text":"ASAppRepresentative ASAppRepresentative is the Python class responsible for defining apps in AliceOS. This class acts as the app's delegate and information manifest. The following documentation covers all of the methods and properties of this class. Properties bundleName : The name of the application. bundleId : The ID of the application in reverse domain name notation . bundleDir : The location of the application. By default, apps use AS_APPS_DIR + \" applicationname .aosapp/\" . bundleAuthor : The author or organization that developed the application. bundleVersion : The version of the application. bundleDescription : The description of the application. requires : A dictionary containing all of the permissions needed for the app to function. icons : A dictionary containing the paths of all icons for the appropriate sizes. Methods __init__(appDirectory) Constructs an instance of ASAppRepresentative . Parameters appDirectory : The directory of which the app is located. Equivalent to bundleDir . requestPermission(forPermission) Requests a particular permission located in requires . Parameters forPermission : The permission to request. Must be in requires to execute. requestAllPermissions() Requests all permissions located in requires , one by one. applicationShouldLaunchAtLogin() Returns whether the app is authorized to run any login tasks. applicationWillLaunchAtLogin() Executes and preliminary actions during the boot sequence. applicationWillLaunch() Executes any preliminary actions before the app launches. applicationDidLaunch() Executes post-launch actions after the app has launched. applicationWillTerminate() Executes cleanup actions before the app closes. applicationDidTerminate() Executes any tasks before finally closing. applicationShouldRequestNotification() Return whether the app is authorized to send notifications. Returns Boolean value dictating whether the app includes the notification permission and has permission to send notifications from the user. applicationWillRequestNotification(message, withDetails, responseCallback) Executes any pre-processing for a notification request and then sends a request. Parameters message : The message or title of the notification. withDetails : The details of the notification. responseCallback (Optional) The action to perform when clicking 'Respond'. applicationDidRequestNotification() Executes any actions after sending a notification request. applicationWillRequestBasicAlert(message, withDetails, onDismissCallback) Executes any pre-processing for an alert and then sends an alert request. Parameters message : The message or title of the alert. withDetails : The details of the alert. onDismissCallback (Optional) The action to perform when clicking 'OK'. applicationWillRequestExtendedAlert(message, withDetails, primaryActionText, onPrimaryCallback, secondaryActionText, onSecondaryCallback) Executes any pre-processing for an extended alert and then sends an alert request. message : The message or title of the alert. withDetails : The details of the alert. primaryActionText : The text for the primary action button onPrimaryCallback (Optional) The action to perform when clicking the primary button. secondaryActionText : (Optional) The text for the secondary action button onSecondaryCallback (Optional) The action to perform when clicking the secondary button. applicationDidRequestAlert() Executes any actions after sending an alert.","title":"ASAppRepresentative"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#asapprepresentative","text":"ASAppRepresentative is the Python class responsible for defining apps in AliceOS. This class acts as the app's delegate and information manifest. The following documentation covers all of the methods and properties of this class.","title":"ASAppRepresentative"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#properties","text":"bundleName : The name of the application. bundleId : The ID of the application in reverse domain name notation . bundleDir : The location of the application. By default, apps use AS_APPS_DIR + \" applicationname .aosapp/\" . bundleAuthor : The author or organization that developed the application. bundleVersion : The version of the application. bundleDescription : The description of the application. requires : A dictionary containing all of the permissions needed for the app to function. icons : A dictionary containing the paths of all icons for the appropriate sizes.","title":"Properties"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#methods","text":"","title":"Methods"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#__init__appdirectory","text":"Constructs an instance of ASAppRepresentative . Parameters appDirectory : The directory of which the app is located. Equivalent to bundleDir .","title":"__init__(appDirectory)"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#requestpermissionforpermission","text":"Requests a particular permission located in requires . Parameters forPermission : The permission to request. Must be in requires to execute.","title":"requestPermission(forPermission)"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#requestallpermissions","text":"Requests all permissions located in requires , one by one.","title":"requestAllPermissions()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationshouldlaunchatlogin","text":"Returns whether the app is authorized to run any login tasks.","title":"applicationShouldLaunchAtLogin()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationwilllaunchatlogin","text":"Executes and preliminary actions during the boot sequence.","title":"applicationWillLaunchAtLogin()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationwilllaunch","text":"Executes any preliminary actions before the app launches.","title":"applicationWillLaunch()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationdidlaunch","text":"Executes post-launch actions after the app has launched.","title":"applicationDidLaunch()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationwillterminate","text":"Executes cleanup actions before the app closes.","title":"applicationWillTerminate()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationdidterminate","text":"Executes any tasks before finally closing.","title":"applicationDidTerminate()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationshouldrequestnotification","text":"Return whether the app is authorized to send notifications. Returns Boolean value dictating whether the app includes the notification permission and has permission to send notifications from the user.","title":"applicationShouldRequestNotification()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationwillrequestnotificationmessage-withdetails-responsecallback","text":"Executes any pre-processing for a notification request and then sends a request. Parameters message : The message or title of the notification. withDetails : The details of the notification. responseCallback (Optional) The action to perform when clicking 'Respond'.","title":"applicationWillRequestNotification(message, withDetails, responseCallback)"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationdidrequestnotification","text":"Executes any actions after sending a notification request.","title":"applicationDidRequestNotification()"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationwillrequestbasicalertmessage-withdetails-ondismisscallback","text":"Executes any pre-processing for an alert and then sends an alert request. Parameters message : The message or title of the alert. withDetails : The details of the alert. onDismissCallback (Optional) The action to perform when clicking 'OK'.","title":"applicationWillRequestBasicAlert(message, withDetails, onDismissCallback)"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationwillrequestextendedalertmessage-withdetails-primaryactiontext-onprimarycallback-secondaryactiontext-onsecondarycallback","text":"Executes any pre-processing for an extended alert and then sends an alert request. message : The message or title of the alert. withDetails : The details of the alert. primaryActionText : The text for the primary action button onPrimaryCallback (Optional) The action to perform when clicking the primary button. secondaryActionText : (Optional) The text for the secondary action button onSecondaryCallback (Optional) The action to perform when clicking the secondary button.","title":"applicationWillRequestExtendedAlert(message, withDetails, primaryActionText, onPrimaryCallback, secondaryActionText, onSecondaryCallback)"},{"location":"Frameworks/AppKit/01-ASAppRepresentative/#applicationdidrequestalert","text":"Executes any actions after sending an alert.","title":"applicationDidRequestAlert()"},{"location":"Frameworks/NotificationKit/","text":"NotificationKit Overview NotificationKit is the official API set for sending notifications in AliceOS. Notifications include the following: Banners : Temporary popups from the top of the screen that can be acted upon or dismissed. Alerts : Full-screen dialog boxes that require user input immediately. Sounds: Sounds that play to incidate something has occured. About this documentation section The documentation provided on NotificationKit does not cover usage of their implementation with apps. Rather, the documentation covers the screens in use and how they can be called without needing Applets. This kind of scenario applies in cases where the AliceOS base only includes NotificationKit. If you wish to create an app that makes use of NotificationKit, please consult the Apps documentation under \"Sending Notifications\".","title":"NotificationKit Overview"},{"location":"Frameworks/NotificationKit/#notificationkit-overview","text":"NotificationKit is the official API set for sending notifications in AliceOS. Notifications include the following: Banners : Temporary popups from the top of the screen that can be acted upon or dismissed. Alerts : Full-screen dialog boxes that require user input immediately. Sounds: Sounds that play to incidate something has occured.","title":"NotificationKit Overview"},{"location":"Frameworks/NotificationKit/#about-this-documentation-section","text":"The documentation provided on NotificationKit does not cover usage of their implementation with apps. Rather, the documentation covers the screens in use and how they can be called without needing Applets. This kind of scenario applies in cases where the AliceOS base only includes NotificationKit. If you wish to create an app that makes use of NotificationKit, please consult the Apps documentation under \"Sending Notifications\".","title":"About this documentation section"},{"location":"Frameworks/NotificationKit/01-banner/","text":"Banners Banners provide a temporary pop-up at the top of the screen that automatically dismiss after five seconds. Banners usually include an app's name, primary message, details, and a response callback upon clicking 'Respond'. ASNotificationBanner() ASNotificationBanner(applet=None, message, withDetails, responseCallback=Return('didClickRespond')) Parameters applet : (Optional) The app object to pass in. If None, the app icon and bundle name on the top will display as \"Unknown Bundle\". message : (Required) The main message or sender. withDetails : (Required) The details of the message. responseCallback (Optional) The action to run upon clicking \"Respond\". Returns If the notification times out and dismisses, the banner will return 'notificationTimedOut' . If the notification's response callback is left as the default, the banner will return 'didClickRespond' when clicking the \"Respond\" button.","title":"Banners"},{"location":"Frameworks/NotificationKit/01-banner/#banners","text":"Banners provide a temporary pop-up at the top of the screen that automatically dismiss after five seconds. Banners usually include an app's name, primary message, details, and a response callback upon clicking 'Respond'.","title":"Banners"},{"location":"Frameworks/NotificationKit/01-banner/#asnotificationbanner","text":"ASNotificationBanner(applet=None, message, withDetails, responseCallback=Return('didClickRespond'))","title":"ASNotificationBanner()"},{"location":"Frameworks/NotificationKit/01-banner/#parameters","text":"applet : (Optional) The app object to pass in. If None, the app icon and bundle name on the top will display as \"Unknown Bundle\". message : (Required) The main message or sender. withDetails : (Required) The details of the message. responseCallback (Optional) The action to run upon clicking \"Respond\".","title":"Parameters"},{"location":"Frameworks/NotificationKit/01-banner/#returns","text":"If the notification times out and dismisses, the banner will return 'notificationTimedOut' . If the notification's response callback is left as the default, the banner will return 'didClickRespond' when clicking the \"Respond\" button.","title":"Returns"},{"location":"Frameworks/NotificationKit/02-alerts/","text":"Alerts Alerts provide important information for the user and request an immediate action. There are two types of alerts AliceOS has: basic and extended. Both types of alerts are designed to request an immediate action, though there are different uses for each alert type. ASNotificationAlert() (Basic) ASNotificationAlert(message, withDetails, onDismissCallback=Return('didDismissAlert')) Parameters message : The message or title of the alert. withDetails : The details of the alert. onDismissCallback (Optional) The action to perform when clicking 'OK'. Returns If the onDismissCallback remains at the default, the alert returns 'didDismissAlert' . ASNotificationExtendedAlert() (Extended) ASNotificationExtendedAlert(message, withDetails, primaryActionText, onPrimaryCallback=Return('didClickPrimary'), secondaryActionText=None, onSecondaryCallback=Return('didClickSecondary')) Parameters message : The message or title of the alert. withDetails : The details of the alert. primaryActionText : The text for the primary action button onPrimaryCallback (Optional) The action to perform when clicking the primary button. secondaryActionText : (Optional) The text for the secondary action button. If set to None , the secondary action button will not be displayed. onSecondaryCallback (Optional) The action to perform when clicking the secondary button. Returns If the user clicks the primary action button and the action callback is left at the default, the alert returns 'didClickPrimary' . Likewise, if the user clicks the secondary action button and the action callback is left at the default, the alert returns 'didClickSecondary' .","title":"Alerts"},{"location":"Frameworks/NotificationKit/02-alerts/#alerts","text":"Alerts provide important information for the user and request an immediate action. There are two types of alerts AliceOS has: basic and extended. Both types of alerts are designed to request an immediate action, though there are different uses for each alert type.","title":"Alerts"},{"location":"Frameworks/NotificationKit/02-alerts/#asnotificationalert-basic","text":"ASNotificationAlert(message, withDetails, onDismissCallback=Return('didDismissAlert'))","title":"ASNotificationAlert() (Basic)"},{"location":"Frameworks/NotificationKit/02-alerts/#parameters","text":"message : The message or title of the alert. withDetails : The details of the alert. onDismissCallback (Optional) The action to perform when clicking 'OK'.","title":"Parameters"},{"location":"Frameworks/NotificationKit/02-alerts/#returns","text":"If the onDismissCallback remains at the default, the alert returns 'didDismissAlert' .","title":"Returns"},{"location":"Frameworks/NotificationKit/02-alerts/#asnotificationextendedalert-extended","text":"ASNotificationExtendedAlert(message, withDetails, primaryActionText, onPrimaryCallback=Return('didClickPrimary'), secondaryActionText=None, onSecondaryCallback=Return('didClickSecondary'))","title":"ASNotificationExtendedAlert() (Extended)"},{"location":"Frameworks/NotificationKit/02-alerts/#parameters_1","text":"message : The message or title of the alert. withDetails : The details of the alert. primaryActionText : The text for the primary action button onPrimaryCallback (Optional) The action to perform when clicking the primary button. secondaryActionText : (Optional) The text for the secondary action button. If set to None , the secondary action button will not be displayed. onSecondaryCallback (Optional) The action to perform when clicking the secondary button.","title":"Parameters"},{"location":"Frameworks/NotificationKit/02-alerts/#returns_1","text":"If the user clicks the primary action button and the action callback is left at the default, the alert returns 'didClickPrimary' . Likewise, if the user clicks the secondary action button and the action callback is left at the default, the alert returns 'didClickSecondary' .","title":"Returns"},{"location":"Frameworks/ScreenKit/","text":"ScreenKit Overview ScreenKit is the official API that offer beautiful interfaces for AliceOS apps and services. ScreenKit works on top of Ren'Py's beautiful screen language with new styles and puts more control of the interface into developers' hands. Apps using AppKit get to leverage ScreenKit easily without adding any additional code to their manifest. Warning ScreenKit is still heavy in development and styles may change over time. The API and documentation may change over time as ScreenKit matures. About this documentation section This section will go over the different aspects of ScreenKit and how a ScreenKit interface is constructed using Ren'Py's screen language.","title":"ScreenKit Overview"},{"location":"Frameworks/ScreenKit/#screenkit-overview","text":"ScreenKit is the official API that offer beautiful interfaces for AliceOS apps and services. ScreenKit works on top of Ren'Py's beautiful screen language with new styles and puts more control of the interface into developers' hands. Apps using AppKit get to leverage ScreenKit easily without adding any additional code to their manifest. Warning ScreenKit is still heavy in development and styles may change over time. The API and documentation may change over time as ScreenKit matures.","title":"ScreenKit Overview"},{"location":"Frameworks/ScreenKit/#about-this-documentation-section","text":"This section will go over the different aspects of ScreenKit and how a ScreenKit interface is constructed using Ren'Py's screen language.","title":"About this documentation section"},{"location":"Frameworks/ScreenKit/01-a-simple-ui/","text":"A Simple UI ScreenKit works beautifully with Ren'Py's screen language, a mostly-declarative and direct means of defining screens. Most of ScreenKit's UI magic works in such a way where, most of the time, you'll only need to add one extra line to your existing screen. Tip All of the examples provided in the documentation will use screen language instead of dynamic creation with Python. If you are unfamiliar with Ren'Py's screen language, we recommend that you read about it and how it works on the official documentation. Get started Creating a simple UI For this simple example, we'll create the UI seen at the top of this documentation page as part of an app called \"Samples\". The screen includes a few elements: Window title bar with window controls Vertical box with text and a button To get started, we'll need to first define our screen. Generally, AliceOS screen naming conventions follow that of the app's class: screen SamplesAppView (): We also have provided an empty parameter list since later versions of Ren'Py require a parameter list. Now that we've created the screen itself, we'll need to tell it to use ScreenKit to style the elements; otherwise, the screen will use the default GUI included in the visual novel. To do this, we need to set the screen's style_prefix , meaning that any styles in this screen are named starting with ASInterface . screen SamplesAppView (): style_prefix ASInterface Now that we have created a blank screen, we'll need to define a window frame, where the contents of the interface will be stored, as well as its maximum size: screen SamplesAppView (): style_prefix ASInterface frame : xalign 0 . 5 # Align it to the middle of the display yalign 0 . 5 # Align it to the center of the display xmaximum 700 # This is the biggest the frame can get ymaximum 600 # This is the tallest the frame can get The frame will now appear in the center of the display and will be at most 700 pixels wide and 600 pixels tall. By default, most ScreenKit UIs will be at most 1248 pixels wide and 688 pixels tall. Warning UIs built with ScreenKit should not be bigger than the maximum size of the game window (1280 pixels wide and 720 pixels tall). If it goes beyond this limit, the interface may get cut off. Now that we have a frame in place, we need to create the area where the content will appear. To do so, we'll need to create a vertical box: screen SamplesAppView (): style_prefix ASInterface frame : xalign 0 . 5 yalign 0 . 5 xmaximum 700 ymaximum 600 has vbox : xalign 0 . 5 yalign 0 . 5 Any content inside of the has vbox statement will appear inside of the vertical box and not interfere with anything else. We can now try to attach our screen to our SamplesApp by telling it to show the screen when the application is open under the app's applicationWillLaunch method in the manifest: def applicationWillLaunch ( self ): renpy . show_screen ( SamplesAppView ) return Note We used the method renpy.show_screen to show this screen rather than renpy.call_screen . If the app is launched while in an existing screen like the AliceOS Desktop, Ren'Py won't be able to call it because it would interrupt the current screen's interaction. However, you can get around this by using renpy.invoke_in_new_context so that the screen is in a different context from the default: renpy . invoke_in_new_context ( renpy . call_screen , SamplesAppView ) This method will also allow any return values to be passed in. After launching the app in either the Desktop or from App Manager, we can see that a frame is visible, but there isn't a title bar, and you can't exit the screen. To fix this, we'll need to call ASInterfaceTitlebar , a screen component: screen SamplesAppView (): style_prefix ASInterface frame : xalign 0 . 5 yalign 0 . 5 xmaximum 700 ymaximum 600 has vbox : xalign 0 . 5 yalign 0 . 5 use ASInterfaceTitlebar ( Sample Application , onClose = Hide ( SamplesAppView )) When we launch the application again this time, we will see our title bar and can click the close button to close out of the screen. Note In our onClose parameter, we specified the Hide screen action rather than Return . Since we didn't call the screen from a new context, we opted for Hide since it would hide the screen without closing out of the AliceOS desktop. Adding content to our UI Now we've set up a basic interface, we can start adding the rest of the interface, what we'll call the content . Since we're making just a basic interface, we can just add the text and our button inside of the vbox : ... # This is inside the screen from before has vbox : xalign 0 . 5 yalign 0 . 5 use ASInterfaceTitlebar ( Sample Application , onClose = Hide ( SamplesAppView )) text \\Welcome to this sample application! The view you are looking at works directly with ScreenKit to make a beautiful interface while still using Ren Py s screen language. hbox : xalign 1 . 0 yalign 1 . 0 textbutton Cool beans! action Hide ( SamplesAppView ) : style ASInterfacePushButton Note that for our push button, we wrapped it in a horizontal box ( hbox ) and added xalign 1.0 to move all the items to the right, as well as yalign 1.0 to keep them at the bottom of the window. This can be useful if you have multiple buttons and want to keep them at the right. Also, for the push button, we added an additional style property to the push button style, ASInterfacePushButton . This lets us use the AliceOS style for push buttons; otherwise, they would default to the text buttons AliceOS uses. Now we can open the application and verify that it looks exactly the way we want and that clicking \"Cool beans!\" closes the window as expected. Finished code Here is the final code for our screen: screen SamplesAppView () : style_prefix ASInterface frame : xalign 0 . 5 yalign 0 . 5 xmaximum 700 ymaximum 600 has vbox : xalign 0 . 5 yalign 0 . 5 use ASInterfaceTitlebar ( Sample Application , onClose = Hide ( SamplesAppView )) text \\Welcome to this sample application! The view you are looking at works directly with ScreenKit to make a beautiful interface while still using Ren Py s screen language. hbox : xalign 1 . 0 yalign 1 . 0 textbutton Cool beans! action Hide ( SamplesAppView ) : style ASInterfacePushButton","title":"A Simple UI"},{"location":"Frameworks/ScreenKit/01-a-simple-ui/#a-simple-ui","text":"ScreenKit works beautifully with Ren'Py's screen language, a mostly-declarative and direct means of defining screens. Most of ScreenKit's UI magic works in such a way where, most of the time, you'll only need to add one extra line to your existing screen. Tip All of the examples provided in the documentation will use screen language instead of dynamic creation with Python. If you are unfamiliar with Ren'Py's screen language, we recommend that you read about it and how it works on the official documentation. Get started","title":"A Simple UI"},{"location":"Frameworks/ScreenKit/01-a-simple-ui/#creating-a-simple-ui","text":"For this simple example, we'll create the UI seen at the top of this documentation page as part of an app called \"Samples\". The screen includes a few elements: Window title bar with window controls Vertical box with text and a button To get started, we'll need to first define our screen. Generally, AliceOS screen naming conventions follow that of the app's class: screen SamplesAppView (): We also have provided an empty parameter list since later versions of Ren'Py require a parameter list. Now that we've created the screen itself, we'll need to tell it to use ScreenKit to style the elements; otherwise, the screen will use the default GUI included in the visual novel. To do this, we need to set the screen's style_prefix , meaning that any styles in this screen are named starting with ASInterface . screen SamplesAppView (): style_prefix ASInterface Now that we have created a blank screen, we'll need to define a window frame, where the contents of the interface will be stored, as well as its maximum size: screen SamplesAppView (): style_prefix ASInterface frame : xalign 0 . 5 # Align it to the middle of the display yalign 0 . 5 # Align it to the center of the display xmaximum 700 # This is the biggest the frame can get ymaximum 600 # This is the tallest the frame can get The frame will now appear in the center of the display and will be at most 700 pixels wide and 600 pixels tall. By default, most ScreenKit UIs will be at most 1248 pixels wide and 688 pixels tall. Warning UIs built with ScreenKit should not be bigger than the maximum size of the game window (1280 pixels wide and 720 pixels tall). If it goes beyond this limit, the interface may get cut off. Now that we have a frame in place, we need to create the area where the content will appear. To do so, we'll need to create a vertical box: screen SamplesAppView (): style_prefix ASInterface frame : xalign 0 . 5 yalign 0 . 5 xmaximum 700 ymaximum 600 has vbox : xalign 0 . 5 yalign 0 . 5 Any content inside of the has vbox statement will appear inside of the vertical box and not interfere with anything else. We can now try to attach our screen to our SamplesApp by telling it to show the screen when the application is open under the app's applicationWillLaunch method in the manifest: def applicationWillLaunch ( self ): renpy . show_screen ( SamplesAppView ) return Note We used the method renpy.show_screen to show this screen rather than renpy.call_screen . If the app is launched while in an existing screen like the AliceOS Desktop, Ren'Py won't be able to call it because it would interrupt the current screen's interaction. However, you can get around this by using renpy.invoke_in_new_context so that the screen is in a different context from the default: renpy . invoke_in_new_context ( renpy . call_screen , SamplesAppView ) This method will also allow any return values to be passed in. After launching the app in either the Desktop or from App Manager, we can see that a frame is visible, but there isn't a title bar, and you can't exit the screen. To fix this, we'll need to call ASInterfaceTitlebar , a screen component: screen SamplesAppView (): style_prefix ASInterface frame : xalign 0 . 5 yalign 0 . 5 xmaximum 700 ymaximum 600 has vbox : xalign 0 . 5 yalign 0 . 5 use ASInterfaceTitlebar ( Sample Application , onClose = Hide ( SamplesAppView )) When we launch the application again this time, we will see our title bar and can click the close button to close out of the screen. Note In our onClose parameter, we specified the Hide screen action rather than Return . Since we didn't call the screen from a new context, we opted for Hide since it would hide the screen without closing out of the AliceOS desktop.","title":"Creating a simple UI"},{"location":"Frameworks/ScreenKit/01-a-simple-ui/#adding-content-to-our-ui","text":"Now we've set up a basic interface, we can start adding the rest of the interface, what we'll call the content . Since we're making just a basic interface, we can just add the text and our button inside of the vbox : ... # This is inside the screen from before has vbox : xalign 0 . 5 yalign 0 . 5 use ASInterfaceTitlebar ( Sample Application , onClose = Hide ( SamplesAppView )) text \\Welcome to this sample application! The view you are looking at works directly with ScreenKit to make a beautiful interface while still using Ren Py s screen language. hbox : xalign 1 . 0 yalign 1 . 0 textbutton Cool beans! action Hide ( SamplesAppView ) : style ASInterfacePushButton Note that for our push button, we wrapped it in a horizontal box ( hbox ) and added xalign 1.0 to move all the items to the right, as well as yalign 1.0 to keep them at the bottom of the window. This can be useful if you have multiple buttons and want to keep them at the right. Also, for the push button, we added an additional style property to the push button style, ASInterfacePushButton . This lets us use the AliceOS style for push buttons; otherwise, they would default to the text buttons AliceOS uses. Now we can open the application and verify that it looks exactly the way we want and that clicking \"Cool beans!\" closes the window as expected.","title":"Adding content to our UI"},{"location":"Frameworks/ScreenKit/01-a-simple-ui/#finished-code","text":"Here is the final code for our screen: screen SamplesAppView () : style_prefix ASInterface frame : xalign 0 . 5 yalign 0 . 5 xmaximum 700 ymaximum 600 has vbox : xalign 0 . 5 yalign 0 . 5 use ASInterfaceTitlebar ( Sample Application , onClose = Hide ( SamplesAppView )) text \\Welcome to this sample application! The view you are looking at works directly with ScreenKit to make a beautiful interface while still using Ren Py s screen language. hbox : xalign 1 . 0 yalign 1 . 0 textbutton Cool beans! action Hide ( SamplesAppView ) : style ASInterfacePushButton","title":"Finished code"},{"location":"Frameworks/ScreenKit/02-special-styles/","text":"Special ScreenKit Styles Not all ScreenKit elements can be easily inherited via the style prefix. To accommodate for this, ScreenKit also includes some special styles that must be applied to an interface element specifically. Text Buttons The following styles apply to text buttons ( textbutton ). These styles can also be used as a style prefix when in a hbox or a vbox . For example, both are acceptable: textbutton Continue action NullAction () : style ASInterfacePushButton hbox : style_prefix ASInterfacePushButton textbutton Cancel action NullAction () textbutton Continue action NullAction () ASInterfacePushButton The base style for a push button. ASInterfaceCheckbox The base style for a checkbox. ASInterfaceRadio The base style for a radio button. Scrollable Content The following styles apply to scrollable areas where a scrollbar is present. Generally, this is called as a style prefix rather than the style itself. ASInterfaceScrollbar The base style for a scrollable area. Used with viewport . Can be used as a style prefix.","title":"Special ScreenKit Styles"},{"location":"Frameworks/ScreenKit/02-special-styles/#special-screenkit-styles","text":"Not all ScreenKit elements can be easily inherited via the style prefix. To accommodate for this, ScreenKit also includes some special styles that must be applied to an interface element specifically.","title":"Special ScreenKit Styles"},{"location":"Frameworks/ScreenKit/02-special-styles/#text-buttons","text":"The following styles apply to text buttons ( textbutton ). These styles can also be used as a style prefix when in a hbox or a vbox . For example, both are acceptable: textbutton Continue action NullAction () : style ASInterfacePushButton hbox : style_prefix ASInterfacePushButton textbutton Cancel action NullAction () textbutton Continue action NullAction ()","title":"Text Buttons"},{"location":"Frameworks/ScreenKit/02-special-styles/#asinterfacepushbutton","text":"The base style for a push button.","title":"ASInterfacePushButton"},{"location":"Frameworks/ScreenKit/02-special-styles/#asinterfacecheckbox","text":"The base style for a checkbox.","title":"ASInterfaceCheckbox"},{"location":"Frameworks/ScreenKit/02-special-styles/#asinterfaceradio","text":"The base style for a radio button.","title":"ASInterfaceRadio"},{"location":"Frameworks/ScreenKit/02-special-styles/#scrollable-content","text":"The following styles apply to scrollable areas where a scrollbar is present. Generally, this is called as a style prefix rather than the style itself.","title":"Scrollable Content"},{"location":"Frameworks/ScreenKit/02-special-styles/#asinterfacescrollbar","text":"The base style for a scrollable area. Used with viewport . Can be used as a style prefix.","title":"ASInterfaceScrollbar"},{"location":"Release-Notes/","text":"Prospect Park (2.0.0) The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). If you are upgrading from Developer Beta 3, you can read the latest changes since that release . Before you upgrade AliceOS Prospect Park is a dramatic overhaul of the classic AliceOS and may break upon installation. Please review everything carefully. General The system organization has migrated over to a macOS-styled directory structure with System, Library, and Applications. Installation has changed over to an RPA-based solution. Installation now is as simple as dragging the RPA. AliceOS APIs, class names, and function names have been renamed and switch over to camel case instead of snake case. Apps Applets have been deprecated in favor of new apps written with AppKit in mind. Apps no longer need to declare a desktop shell component as this is handled by the native applicationWillLaunch method. Apps can now write starup/login services via applicationWillLaunchAtLogin() and check for System Events permissions with applicationShouldLaunchAtLogin() . Notifications and alerts in AppKit are now invoked in a new context instead of interrupting the current one. The 48 pixel icon entry in ASAppRepresentative has been re-added. If unimplemented, applicationWillLaunch() will log a warning in the terminal. Introduces a new Inventories app, a fast and fun way to create and manage a game inventory. Messages Messages now displays a \"Coming Soon\" alert when launched from the Desktop. Core Services and Applications Applications such as Messages have been moved to System/Applications/ and use AppKit. The halt screen, bootloader, and Setup Assistant are now Core Services that use ServiceKit. Desktop The Desktop now uses the applicationWillLaunch method from AppKit apps to start apps accordingly and will invoke applicationWillLaunch as a Ren'Py function callback. The Desktop image is defined as AS_DESKTOP_IMG . The Desktop now refreshes quickly to get the latest time on the clock. Halt screens (formerly Stop errors) The halt screen uses the AliceOS dynamic blur instead of its own background. A QR code has been added that redirects users to the AliceOS Error Database. The text has been changed to indicate how long before AliceOS will automatically restart the game. Notifications Notifications are now under the NotificationKit framework. Alerts no longer appear as a white square. They now use the AliceOS dynamic blur feature. Bootloader The bootloader will now attempt to run any authorized startup services in a new thread. An optional bootView parameter allows developers to set a custom boot screen to display instead of the default. Setup Assistant Express Mode is on by default, but can be disabled in the bootloader's boot method. Instructions have been rewritten for conciseness and clarity. The interface has changed to a more macOS-like experience. Setup Assistant now uses ScreenKit to draw elements. ScreenKit ScreenKit has been introduced as a means of creating user interfaces for AliceOS using Ren'Py's screen language and styling. Styles for frames, vertical and horizontal boxes, text, checkbox buttons, vertical scrollbars, and push buttons have been implemented. ASInterfaceTitlebar has been implemented as a smaller component to add a title bar to a given frame. ScreenKit now include horizontal scrollbars and radio buttons. ScreenKit frames are more rectangular. About AliceOS The main interface has been written entirely with ScreenKit and displays information from system definitions. The Ren'Py version should now match the proper built version and not be hard-coded. App Manager App Manager has been introduced as a means of managing an app's permissions and viewing details about the app. Apps in App Manager list their permissions as toggleable checkboxes. Changes since Developer Beta 3 Inventories ASInventoryItem objects can now have an optional ID field, itemId . ASInventories includes new methods: export(filter=None) : Return the inventory with a filter, if specified. getItemById(itemId) : Find an item by its ID. AppKit Permission strings now reference App Manager instead of Settings. Desktop showDesktop() now calls renpy.show_screen instead of renpy.call_screen . For the old behavior, reference _callDesktop() . CI/CD AliceOS now produces builds on every push/pull request that can be accessed on GitHub Actions. Warning Treat these builds from GitHub as a developer release; do not use these builds in production-ready visual novels.","title":"Prospect Park (2.0.0)"},{"location":"Release-Notes/#prospect-park-200","text":"The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). If you are upgrading from Developer Beta 3, you can read the latest changes since that release . Before you upgrade AliceOS Prospect Park is a dramatic overhaul of the classic AliceOS and may break upon installation. Please review everything carefully.","title":"Prospect Park (2.0.0)"},{"location":"Release-Notes/#general","text":"The system organization has migrated over to a macOS-styled directory structure with System, Library, and Applications. Installation has changed over to an RPA-based solution. Installation now is as simple as dragging the RPA. AliceOS APIs, class names, and function names have been renamed and switch over to camel case instead of snake case.","title":"General"},{"location":"Release-Notes/#apps","text":"Applets have been deprecated in favor of new apps written with AppKit in mind. Apps no longer need to declare a desktop shell component as this is handled by the native applicationWillLaunch method. Apps can now write starup/login services via applicationWillLaunchAtLogin() and check for System Events permissions with applicationShouldLaunchAtLogin() . Notifications and alerts in AppKit are now invoked in a new context instead of interrupting the current one. The 48 pixel icon entry in ASAppRepresentative has been re-added. If unimplemented, applicationWillLaunch() will log a warning in the terminal. Introduces a new Inventories app, a fast and fun way to create and manage a game inventory.","title":"Apps"},{"location":"Release-Notes/#messages","text":"Messages now displays a \"Coming Soon\" alert when launched from the Desktop.","title":"Messages"},{"location":"Release-Notes/#core-services-and-applications","text":"Applications such as Messages have been moved to System/Applications/ and use AppKit. The halt screen, bootloader, and Setup Assistant are now Core Services that use ServiceKit.","title":"Core Services and Applications"},{"location":"Release-Notes/#desktop","text":"The Desktop now uses the applicationWillLaunch method from AppKit apps to start apps accordingly and will invoke applicationWillLaunch as a Ren'Py function callback. The Desktop image is defined as AS_DESKTOP_IMG . The Desktop now refreshes quickly to get the latest time on the clock.","title":"Desktop"},{"location":"Release-Notes/#halt-screens-formerly-stop-errors","text":"The halt screen uses the AliceOS dynamic blur instead of its own background. A QR code has been added that redirects users to the AliceOS Error Database. The text has been changed to indicate how long before AliceOS will automatically restart the game.","title":"Halt screens (formerly Stop errors)"},{"location":"Release-Notes/#notifications","text":"Notifications are now under the NotificationKit framework. Alerts no longer appear as a white square. They now use the AliceOS dynamic blur feature.","title":"Notifications"},{"location":"Release-Notes/#bootloader","text":"The bootloader will now attempt to run any authorized startup services in a new thread. An optional bootView parameter allows developers to set a custom boot screen to display instead of the default.","title":"Bootloader"},{"location":"Release-Notes/#setup-assistant","text":"Express Mode is on by default, but can be disabled in the bootloader's boot method. Instructions have been rewritten for conciseness and clarity. The interface has changed to a more macOS-like experience. Setup Assistant now uses ScreenKit to draw elements.","title":"Setup Assistant"},{"location":"Release-Notes/#screenkit","text":"ScreenKit has been introduced as a means of creating user interfaces for AliceOS using Ren'Py's screen language and styling. Styles for frames, vertical and horizontal boxes, text, checkbox buttons, vertical scrollbars, and push buttons have been implemented. ASInterfaceTitlebar has been implemented as a smaller component to add a title bar to a given frame. ScreenKit now include horizontal scrollbars and radio buttons. ScreenKit frames are more rectangular.","title":"ScreenKit"},{"location":"Release-Notes/#about-aliceos","text":"The main interface has been written entirely with ScreenKit and displays information from system definitions. The Ren'Py version should now match the proper built version and not be hard-coded.","title":"About AliceOS"},{"location":"Release-Notes/#app-manager","text":"App Manager has been introduced as a means of managing an app's permissions and viewing details about the app. Apps in App Manager list their permissions as toggleable checkboxes.","title":"App Manager"},{"location":"Release-Notes/#changes-since-developer-beta-3","text":"","title":"Changes since Developer Beta 3"},{"location":"Release-Notes/#inventories","text":"ASInventoryItem objects can now have an optional ID field, itemId . ASInventories includes new methods: export(filter=None) : Return the inventory with a filter, if specified. getItemById(itemId) : Find an item by its ID.","title":"Inventories"},{"location":"Release-Notes/#appkit","text":"Permission strings now reference App Manager instead of Settings.","title":"AppKit"},{"location":"Release-Notes/#desktop_1","text":"showDesktop() now calls renpy.show_screen instead of renpy.call_screen . For the old behavior, reference _callDesktop() .","title":"Desktop"},{"location":"Release-Notes/#cicd","text":"AliceOS now produces builds on every push/pull request that can be accessed on GitHub Actions. Warning Treat these builds from GitHub as a developer release; do not use these builds in production-ready visual novels.","title":"CI/CD"},{"location":"Release-Notes/1tp1/","text":"Technical Preview 1 (1.0.0) This is the first initial release of AliceOS Technical Preview.","title":"Technical Preview 1 (1.0.0)"},{"location":"Release-Notes/1tp1/#technical-preview-1-100","text":"This is the first initial release of AliceOS Technical Preview.","title":"Technical Preview 1 (1.0.0)"},{"location":"Release-Notes/1tp2/","text":"Technical Preview 2 (1.0.0) Setup assistant has been completely rewritten from the ground-up. Now supports dynamic font changes and a large font mode. Stop errors have been rewritten and are now dynamically called using ThrowASError() Default backgrounds have changed. OEM settings have been adjusted to use the new Setup assistant and now use hardcoded values for font files instead of dynamic assignments. Issue where Ren'Py projects crash upon loading an AliceOS dialog from a save file in OEM font mode has been resolved (#22).","title":"Technical Preview 2 (1.0.0)"},{"location":"Release-Notes/1tp2/#technical-preview-2-100","text":"Setup assistant has been completely rewritten from the ground-up. Now supports dynamic font changes and a large font mode. Stop errors have been rewritten and are now dynamically called using ThrowASError() Default backgrounds have changed. OEM settings have been adjusted to use the new Setup assistant and now use hardcoded values for font files instead of dynamic assignments. Issue where Ren'Py projects crash upon loading an AliceOS dialog from a save file in OEM font mode has been resolved (#22).","title":"Technical Preview 2 (1.0.0)"},{"location":"Release-Notes/2.0.0_db1/","text":"Prospect Park (2.0.0) Developer Beta 1 The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). This document is not complete More documentation is being worked on with this document to describe exact changes. Before you upgrade AliceOS Prospect Park is a dramatic overhaul of the classic AliceOS and may break upon installation. Please review everything carefully. General The system organization has migrated over to a macOS-styled directory structure with System, Library, and Applications. Installation has changed over to an RPA-based solution. Installation now is as simple as dragging the RPA. AliceOS APIs, class names, and function names have been renamed and switch over to camel case instead of snake case. Apps Applets have been deprecated in favor of new apps written with AppKit in mind. Apps no longer need to declare a desktop shell component as this is handled by the native applicationWillLaunch method. Core Services and Applications Applications such as Messages have been moved to System/Applications/ and use AppKit. The halt screen, bootloader, and Setup Assistant are now Core Services that use ServiceKit. Desktop The Desktop now uses the applicationWillLaunch method from AppKit apps to start apps accordingly. The Desktop image is defined as AS_DESKTOP_IMG . The Desktop now refreshes quickly to get the latest time on the clock. Known issues The Desktop doesn't hide the quick menu. The showDesktop() method from ASDesktop doesn't work in Ren'Py screen language. Workarounds Call ASDesktopShell directly instead of using the showDesktop() method. Halt screens (formerly Stop errors) The halt screen uses the AliceOS dynamic blur instead of its own background. A QR code has been added that redirects users to the AliceOS Error Database. The text has been changed to indicate how long before AliceOS will automatically restart the game. Notifications Notifications are now under the NotificationKit framework. Alerts no longer appear as a white square. They now use the AliceOS dynamic blur feature. Known issues Notification banners do not make a sound. Setup Assistant Express Mode is on by default, but can be disabled in the bootloader's boot method. Instructions have been rewritten for conciseness and clarity. The interface has changed to a more macOS-like experience.","title":"Prospect Park (2.0.0) Developer Beta 1"},{"location":"Release-Notes/2.0.0_db1/#prospect-park-200-developer-beta-1","text":"The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). This document is not complete More documentation is being worked on with this document to describe exact changes. Before you upgrade AliceOS Prospect Park is a dramatic overhaul of the classic AliceOS and may break upon installation. Please review everything carefully.","title":"Prospect Park (2.0.0) Developer Beta 1"},{"location":"Release-Notes/2.0.0_db1/#general","text":"The system organization has migrated over to a macOS-styled directory structure with System, Library, and Applications. Installation has changed over to an RPA-based solution. Installation now is as simple as dragging the RPA. AliceOS APIs, class names, and function names have been renamed and switch over to camel case instead of snake case.","title":"General"},{"location":"Release-Notes/2.0.0_db1/#apps","text":"Applets have been deprecated in favor of new apps written with AppKit in mind. Apps no longer need to declare a desktop shell component as this is handled by the native applicationWillLaunch method.","title":"Apps"},{"location":"Release-Notes/2.0.0_db1/#core-services-and-applications","text":"Applications such as Messages have been moved to System/Applications/ and use AppKit. The halt screen, bootloader, and Setup Assistant are now Core Services that use ServiceKit.","title":"Core Services and Applications"},{"location":"Release-Notes/2.0.0_db1/#desktop","text":"The Desktop now uses the applicationWillLaunch method from AppKit apps to start apps accordingly. The Desktop image is defined as AS_DESKTOP_IMG . The Desktop now refreshes quickly to get the latest time on the clock.","title":"Desktop"},{"location":"Release-Notes/2.0.0_db1/#known-issues","text":"The Desktop doesn't hide the quick menu. The showDesktop() method from ASDesktop doesn't work in Ren'Py screen language.","title":"Known issues"},{"location":"Release-Notes/2.0.0_db1/#workarounds","text":"Call ASDesktopShell directly instead of using the showDesktop() method.","title":"Workarounds"},{"location":"Release-Notes/2.0.0_db1/#halt-screens-formerly-stop-errors","text":"The halt screen uses the AliceOS dynamic blur instead of its own background. A QR code has been added that redirects users to the AliceOS Error Database. The text has been changed to indicate how long before AliceOS will automatically restart the game.","title":"Halt screens (formerly Stop errors)"},{"location":"Release-Notes/2.0.0_db1/#notifications","text":"Notifications are now under the NotificationKit framework. Alerts no longer appear as a white square. They now use the AliceOS dynamic blur feature.","title":"Notifications"},{"location":"Release-Notes/2.0.0_db1/#known-issues_1","text":"Notification banners do not make a sound.","title":"Known issues"},{"location":"Release-Notes/2.0.0_db1/#setup-assistant","text":"Express Mode is on by default, but can be disabled in the bootloader's boot method. Instructions have been rewritten for conciseness and clarity. The interface has changed to a more macOS-like experience.","title":"Setup Assistant"},{"location":"Release-Notes/2.0.0_db2/","text":"Prospect Park (2.0.0) Developer Beta 2 The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). Apps Apps can now write starup/login services via applicationWillLaunchAtLogin() and check for System Events permissions with applicationShouldLaunchAtLogin() . Notfications and alerts in AppKit are now invoked in a new context instead of interrupting the current one. The 48 pixel icon entry in ASAppRepresentative has been re-added. If unimplemented, applicationWillLaunch() will log a warning in the terminal. Messages Messages now displays a \"Coming Soon\" alert when launched from the Desktop. Desktop Apps on the desktop will invoke applicationWillLaunch as a Ren'Py function callback instead of calling the Python function directly to prevent continuous calls. The main views in Desktop now have empty parameter lists to resolve linter warnings. Known Issues The Desktop doesn't hide the quick menu. The showDesktop() method from ASDesktop doesn't work in Ren'Py screen language when calling it as a button action. Workarounds Use Ren'Py's Function call to run showDesktop() or make a call directly to the screen. Notifications Known issues Notification banners do not make a sound. Workarounds Include a sound in your applet and make a wrapper around applicationWillRequestNotification() . Bootloader The bootloader will now attempt to run any authorized startup services in a new thread. An optional bootView parameter allows developers to set a custom boot screen to display instead of the default. ScreenKit ScreenKit has been introduced as a means of creating user interfaces for AliceOS using Ren'Py's screen language and styling. Styles for frames, vertical and horizontal boxes, text, checkbox buttons, vertical scrollbars, and push buttons have been implemented. ASInterfaceTitlebar has been implemented as a smaller component to add a title bar to a given frame. About AliceOS The main interface has been written entirely with ScreenKit and displays information from system definitions. App Manager App Manager has been introduced as a means of managing an app's permissions and viewing details about the app. Apps in App Manager list their permissions as toggleable checkboxes.","title":"Prospect Park (2.0.0) Developer Beta 2"},{"location":"Release-Notes/2.0.0_db2/#prospect-park-200-developer-beta-2","text":"The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0).","title":"Prospect Park (2.0.0) Developer Beta 2"},{"location":"Release-Notes/2.0.0_db2/#apps","text":"Apps can now write starup/login services via applicationWillLaunchAtLogin() and check for System Events permissions with applicationShouldLaunchAtLogin() . Notfications and alerts in AppKit are now invoked in a new context instead of interrupting the current one. The 48 pixel icon entry in ASAppRepresentative has been re-added. If unimplemented, applicationWillLaunch() will log a warning in the terminal.","title":"Apps"},{"location":"Release-Notes/2.0.0_db2/#messages","text":"Messages now displays a \"Coming Soon\" alert when launched from the Desktop.","title":"Messages"},{"location":"Release-Notes/2.0.0_db2/#desktop","text":"Apps on the desktop will invoke applicationWillLaunch as a Ren'Py function callback instead of calling the Python function directly to prevent continuous calls. The main views in Desktop now have empty parameter lists to resolve linter warnings.","title":"Desktop"},{"location":"Release-Notes/2.0.0_db2/#known-issues","text":"The Desktop doesn't hide the quick menu. The showDesktop() method from ASDesktop doesn't work in Ren'Py screen language when calling it as a button action.","title":"Known Issues"},{"location":"Release-Notes/2.0.0_db2/#workarounds","text":"Use Ren'Py's Function call to run showDesktop() or make a call directly to the screen.","title":"Workarounds"},{"location":"Release-Notes/2.0.0_db2/#notifications","text":"","title":"Notifications"},{"location":"Release-Notes/2.0.0_db2/#known-issues_1","text":"Notification banners do not make a sound.","title":"Known issues"},{"location":"Release-Notes/2.0.0_db2/#workarounds_1","text":"Include a sound in your applet and make a wrapper around applicationWillRequestNotification() .","title":"Workarounds"},{"location":"Release-Notes/2.0.0_db2/#bootloader","text":"The bootloader will now attempt to run any authorized startup services in a new thread. An optional bootView parameter allows developers to set a custom boot screen to display instead of the default.","title":"Bootloader"},{"location":"Release-Notes/2.0.0_db2/#screenkit","text":"ScreenKit has been introduced as a means of creating user interfaces for AliceOS using Ren'Py's screen language and styling. Styles for frames, vertical and horizontal boxes, text, checkbox buttons, vertical scrollbars, and push buttons have been implemented. ASInterfaceTitlebar has been implemented as a smaller component to add a title bar to a given frame.","title":"ScreenKit"},{"location":"Release-Notes/2.0.0_db2/#about-aliceos","text":"The main interface has been written entirely with ScreenKit and displays information from system definitions.","title":"About AliceOS"},{"location":"Release-Notes/2.0.0_db2/#app-manager","text":"App Manager has been introduced as a means of managing an app's permissions and viewing details about the app. Apps in App Manager list their permissions as toggleable checkboxes.","title":"App Manager"},{"location":"Release-Notes/20.0_db3/","text":"Prospect Park (2.0.0) Developer Beta 3 The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). ScreenKit ScreenKit now include horizontal scrollbars and radio buttons. ScreenKit frames are more rectangular. Apps Introduces a new Inventories app, a fast and fun way to create and manage a game inventory. About AliceOS The Ren'Py version should now match the proper built version and not be hard-coded. Setup Assistant Setup Assistant now uses ScreenKit to draw elements.","title":"Prospect Park (2.0.0) Developer Beta 3"},{"location":"Release-Notes/20.0_db3/#prospect-park-200-developer-beta-3","text":"The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0).","title":"Prospect Park (2.0.0) Developer Beta 3"},{"location":"Release-Notes/20.0_db3/#screenkit","text":"ScreenKit now include horizontal scrollbars and radio buttons. ScreenKit frames are more rectangular.","title":"ScreenKit"},{"location":"Release-Notes/20.0_db3/#apps","text":"Introduces a new Inventories app, a fast and fun way to create and manage a game inventory.","title":"Apps"},{"location":"Release-Notes/20.0_db3/#about-aliceos","text":"The Ren'Py version should now match the proper built version and not be hard-coded.","title":"About AliceOS"},{"location":"Release-Notes/20.0_db3/#setup-assistant","text":"Setup Assistant now uses ScreenKit to draw elements.","title":"Setup Assistant"},{"location":"System/01-definitions/","text":"AliceOS Definitions To make referencing common AliceOS build settings and structures easier, AliceOS provides the following definitions and dictionaries. These are located in System/ASDefinitions.rpy and can be modified if necessary. AliceOS release definitions These definitions are used to specify important release information regarding AliceOS. These definitions might be referenced to specify OS version information to the user, in a help screen, for example. This is stored as a dictionary in AS_SYS_INFO Definition name Used for VERSION The release version. Typically X.x.x ; this isn't the build number generated from the Git hash COMMON_NAME The common name for the release. (ex. \"Prospect Park\") BUILD_ID The build number as generated by the Git hash or the Travis tag Directory definitions Definition name Points to Used for AS_SYSTEM_DIR System/ The default System directory. AS_FRAMEWORKS_DIR System/Frameworks/ The default Frameworks directory. AS_CORESERVICES_DIR System/CoreServices/ The default Core Services directory. AS_DEFAULT_APP_DIR System/Applications/ The default System applications directory. This isn't necessary for developer use. AS_FONTS_DIR System/Fonts/ The default Fonts directory. AS_APPS_DIR Applications/ The default Applications directory. AS_LIBRARY_DIR System/Library/ The default Library directory. Framework directory definitions AS_FRAMEWORK_DIR(FRAMEWORK_NAME=\"Default\") The directory where a particular Framework is located. Makes use of AS_FRAMEWORKS_DIR . Parameters FRAMEWORK_NAME : The name of the framework to reference. Example: NotificationKit Returns The path to the framework. Example: System/Frameworks/NotificationKit.aosframework/ Permissions definitions These definitions are used to specify important strings when asking the user permission for a particular item. These are dictionaries that include the values for a particular permission. AS_REQUIRE_PERMS_NAME : The dictionary containing the name of the permission name. Example: \"Send Notifications\" AS_REQUIRE_PERMS_DESC : The dictionary containing the description of a permission. Example: \"Notifications may include banners, alerts, and sounds. These can be configured in Settings.\"","title":"AliceOS Definitions"},{"location":"System/01-definitions/#aliceos-definitions","text":"To make referencing common AliceOS build settings and structures easier, AliceOS provides the following definitions and dictionaries. These are located in System/ASDefinitions.rpy and can be modified if necessary.","title":"AliceOS Definitions"},{"location":"System/01-definitions/#aliceos-release-definitions","text":"These definitions are used to specify important release information regarding AliceOS. These definitions might be referenced to specify OS version information to the user, in a help screen, for example. This is stored as a dictionary in AS_SYS_INFO Definition name Used for VERSION The release version. Typically X.x.x ; this isn't the build number generated from the Git hash COMMON_NAME The common name for the release. (ex. \"Prospect Park\") BUILD_ID The build number as generated by the Git hash or the Travis tag","title":"AliceOS release definitions"},{"location":"System/01-definitions/#directory-definitions","text":"Definition name Points to Used for AS_SYSTEM_DIR System/ The default System directory. AS_FRAMEWORKS_DIR System/Frameworks/ The default Frameworks directory. AS_CORESERVICES_DIR System/CoreServices/ The default Core Services directory. AS_DEFAULT_APP_DIR System/Applications/ The default System applications directory. This isn't necessary for developer use. AS_FONTS_DIR System/Fonts/ The default Fonts directory. AS_APPS_DIR Applications/ The default Applications directory. AS_LIBRARY_DIR System/Library/ The default Library directory.","title":"Directory definitions"},{"location":"System/01-definitions/#framework-directory-definitions","text":"AS_FRAMEWORK_DIR(FRAMEWORK_NAME=\"Default\") The directory where a particular Framework is located. Makes use of AS_FRAMEWORKS_DIR . Parameters FRAMEWORK_NAME : The name of the framework to reference. Example: NotificationKit Returns The path to the framework. Example: System/Frameworks/NotificationKit.aosframework/","title":"Framework directory definitions"},{"location":"System/01-definitions/#permissions-definitions","text":"These definitions are used to specify important strings when asking the user permission for a particular item. These are dictionaries that include the values for a particular permission. AS_REQUIRE_PERMS_NAME : The dictionary containing the name of the permission name. Example: \"Send Notifications\" AS_REQUIRE_PERMS_DESC : The dictionary containing the description of a permission. Example: \"Notifications may include banners, alerts, and sounds. These can be configured in Settings.\"","title":"Permissions definitions"},{"location":"System/02-default-apps/","text":"Default Apps AliceOS includes several default applications that are located in System/Applications/ . These applications are designed to enhance the AliceOS experience and provide functionalities for core parts without having to write a third-party app for them. Messages Messages is a simple app designed to simulate text messaging between characters and the player in a fun way. Available methods messages.receiveMessage(fromPerson, message) Send a notification request that displays a text message from a person. Parameters fromPerson : The person the message is being sent from message : The text message being sent Returns Returns the default values as indicated from ASNotificationBanner About AliceOS About AliceOS is a simple app that displays information about the current distribution of AliceOS. Users can click on the app in Activites and view the information there. There are no available methods as the app uses the standard applicationWillLaunch method from AppKit. App Manager App Manager is a(n) utility in AliceOS that lets users view the apps installed on the AliceOS system and manage their permissions quickly. It is the official method of changing an app's permissions in AliceOS. There are no available methods as the app uses the standard applicationWillLaunch method from AppKit. Inventories Inventories is a tool for AliceOS that lets developers and players work with an inventory. More information on Inventories can be found in the Inventories documentation .","title":"Default Apps"},{"location":"System/02-default-apps/#default-apps","text":"AliceOS includes several default applications that are located in System/Applications/ . These applications are designed to enhance the AliceOS experience and provide functionalities for core parts without having to write a third-party app for them.","title":"Default Apps"},{"location":"System/02-default-apps/#messages","text":"Messages is a simple app designed to simulate text messaging between characters and the player in a fun way. Available methods messages.receiveMessage(fromPerson, message) Send a notification request that displays a text message from a person. Parameters fromPerson : The person the message is being sent from message : The text message being sent Returns Returns the default values as indicated from ASNotificationBanner","title":"Messages"},{"location":"System/02-default-apps/#about-aliceos","text":"About AliceOS is a simple app that displays information about the current distribution of AliceOS. Users can click on the app in Activites and view the information there. There are no available methods as the app uses the standard applicationWillLaunch method from AppKit.","title":"About AliceOS"},{"location":"System/02-default-apps/#app-manager","text":"App Manager is a(n) utility in AliceOS that lets users view the apps installed on the AliceOS system and manage their permissions quickly. It is the official method of changing an app's permissions in AliceOS. There are no available methods as the app uses the standard applicationWillLaunch method from AppKit.","title":"App Manager"},{"location":"System/02-default-apps/#inventories","text":"Inventories is a tool for AliceOS that lets developers and players work with an inventory. More information on Inventories can be found in the Inventories documentation .","title":"Inventories"},{"location":"System/03-core-services/","text":"Core Services AliceOS comes with several bundled Core Services that you should be aware of. These Core Services are crucial to AliceOS's core and are included in every AliceOS installation. Core Services are given the .aoscservice file extension and exist under System/CoreServices . Core services also make use of ServiceKit, an in-house framework for defining core services. About ServiceKit At all costs, do not remove ServiceKit.aosframework or attempt to write your own applications using ServiceKit. ServiceKit is a service-only API set that should be used for system-level utilities, not for third-party applications. Use AppKit instead. Desktop The Desktop Core Service is responsible for displaying current applications installed on the system as well as providing a desktop shell if necessary. Error Halt System The Error Halt System (Halt) Core Service is responsible for displaying any critical errors that cause AliceOS to restart. It provides helpful information such as the error code and where to go for more information. More information on how this Core Service works can be found on the article about Critical Errors . Bootloader The Bootloader is responsible for displaying a boot screen while important components are loading. The bootloader is cusomizable with a certain timeout, depending on how fast you want the OS to \"load\". If the Setup Assistant hasn't fired or completed, the bootloader will also load the Setup Assistant. Setup Assistant The Setup Assistant is responsible for setting up any important configurations and settings for AliceOS, as well as creating a username stored in persistent.playername and letting users read any legal agreements before playing a visual novel project. Removing a service If you find that you don't need a particular core service, you can delete it from the CoreServices directory and rebuild AliceOS. Warning If you plan to remove a Core Service, do so with caution. Other parts of AliceOS may make system calls that heavily rely on them.","title":"Core Services"},{"location":"System/03-core-services/#core-services","text":"AliceOS comes with several bundled Core Services that you should be aware of. These Core Services are crucial to AliceOS's core and are included in every AliceOS installation. Core Services are given the .aoscservice file extension and exist under System/CoreServices . Core services also make use of ServiceKit, an in-house framework for defining core services. About ServiceKit At all costs, do not remove ServiceKit.aosframework or attempt to write your own applications using ServiceKit. ServiceKit is a service-only API set that should be used for system-level utilities, not for third-party applications. Use AppKit instead.","title":"Core Services"},{"location":"System/03-core-services/#desktop","text":"The Desktop Core Service is responsible for displaying current applications installed on the system as well as providing a desktop shell if necessary.","title":"Desktop"},{"location":"System/03-core-services/#error-halt-system","text":"The Error Halt System (Halt) Core Service is responsible for displaying any critical errors that cause AliceOS to restart. It provides helpful information such as the error code and where to go for more information. More information on how this Core Service works can be found on the article about Critical Errors .","title":"Error Halt System"},{"location":"System/03-core-services/#bootloader","text":"The Bootloader is responsible for displaying a boot screen while important components are loading. The bootloader is cusomizable with a certain timeout, depending on how fast you want the OS to \"load\". If the Setup Assistant hasn't fired or completed, the bootloader will also load the Setup Assistant.","title":"Bootloader"},{"location":"System/03-core-services/#setup-assistant","text":"The Setup Assistant is responsible for setting up any important configurations and settings for AliceOS, as well as creating a username stored in persistent.playername and letting users read any legal agreements before playing a visual novel project.","title":"Setup Assistant"},{"location":"System/03-core-services/#removing-a-service","text":"If you find that you don't need a particular core service, you can delete it from the CoreServices directory and rebuild AliceOS. Warning If you plan to remove a Core Service, do so with caution. Other parts of AliceOS may make system calls that heavily rely on them.","title":"Removing a service"},{"location":"System/04-critical-errors/","text":"Critical Errors If AliceOS encounters a critical error where it needs to restart to continue, the user will see the above warning and the system will restart automatically after 10 seconds. An error code is provided at the bottom and a QR cose is present to search the error on the Error Database . Critical errors and the halt screen is managed by the Error Halt System (Halt), a Core Service and can be used to present errors that aren't already caught by the base AliceOS distribution. Displaying a halt To display the halt screen with a respective error code, call $ ASHalt.halt(\"ERR_CODE\") . The system will display the halt and automatically restart after ten seconds. Guidelines Halt screens should be used to catch important, critical errors. Make your error code descriptive. The user should be able to get an idea of what the problem might be from the error code itself. For instance, \" MISSING_CYANIDE_INSTRUMENT \" is more descriptive than \" INSTRUMENT_FAIL \". Make sure your error is searchable in the database. The user should be able to search for your error in the Error Database to investigate what went wrong. Don't call the halt screen for a non-critical error. The halt screen is designed to present immediate and important information to the user about a potential error that could damage AliceOS or your game in some way. It shouldn't be used to present an app-wide or section-wide error as the screen is rather intrusive.","title":"Critical Errors"},{"location":"System/04-critical-errors/#critical-errors","text":"If AliceOS encounters a critical error where it needs to restart to continue, the user will see the above warning and the system will restart automatically after 10 seconds. An error code is provided at the bottom and a QR cose is present to search the error on the Error Database . Critical errors and the halt screen is managed by the Error Halt System (Halt), a Core Service and can be used to present errors that aren't already caught by the base AliceOS distribution.","title":"Critical Errors"},{"location":"System/04-critical-errors/#displaying-a-halt","text":"To display the halt screen with a respective error code, call $ ASHalt.halt(\"ERR_CODE\") . The system will display the halt and automatically restart after ten seconds.","title":"Displaying a halt"},{"location":"System/04-critical-errors/#guidelines","text":"Halt screens should be used to catch important, critical errors. Make your error code descriptive. The user should be able to get an idea of what the problem might be from the error code itself. For instance, \" MISSING_CYANIDE_INSTRUMENT \" is more descriptive than \" INSTRUMENT_FAIL \". Make sure your error is searchable in the database. The user should be able to search for your error in the Error Database to investigate what went wrong. Don't call the halt screen for a non-critical error. The halt screen is designed to present immediate and important information to the user about a potential error that could damage AliceOS or your game in some way. It shouldn't be used to present an app-wide or section-wide error as the screen is rather intrusive.","title":"Guidelines"},{"location":"System/05-bootloader/","text":"Bootloader The bootloader is responsible for displaying a boot screen while important components are loading. The bootloader is cusomizable with a certain timeout, depending on how fast you want the OS to \"load\". Available methods $ ASBootloader.boot(timeout=5, expressSetup=True, disclaimer=None, bootView=\"ASBootloaderView\") Show the bootloader for a certain amount of time. Parameters timeout : The amount of seconds to show the bootloader for. expressSetup : Whether the Setup Assistant should start in Express Mode. disclaimer : Any license agreement or disclaimer that must be displayed during the Setup Assistant. bootView : The name of the Ren'Py screen to display as the GUI for the boot loader.","title":"Bootloader"},{"location":"System/05-bootloader/#bootloader","text":"The bootloader is responsible for displaying a boot screen while important components are loading. The bootloader is cusomizable with a certain timeout, depending on how fast you want the OS to \"load\".","title":"Bootloader"},{"location":"System/05-bootloader/#available-methods","text":"","title":"Available methods"},{"location":"System/05-bootloader/#asbootloaderboottimeout5-expresssetuptrue-disclaimernone-bootviewasbootloaderview","text":"Show the bootloader for a certain amount of time. Parameters timeout : The amount of seconds to show the bootloader for. expressSetup : Whether the Setup Assistant should start in Express Mode. disclaimer : Any license agreement or disclaimer that must be displayed during the Setup Assistant. bootView : The name of the Ren'Py screen to display as the GUI for the boot loader.","title":"$ ASBootloader.boot(timeout=5, expressSetup=True, disclaimer=None, bootView=\"ASBootloaderView\")"},{"location":"System/06-setup-assistant/","text":"Setup Assistant The Setup Assistant is a first-run tool designed to set any initial settings and/or configurations for AliceOS before starting the visual novel. It also lets the user create a username as well as read over and legel agreements or disclaimers the game creator has provided. Tip Starting with AliceOS Prospect Park, the Setup Assistant is automatically configured to use Express Mode, which skips a lot of the onerous steps in the original process. However, for a more thorough experience, Express Mode can be turned off. Automatic Setup In the Bootloader, the Setup Assistant will run if it doesn't detect that any setup was done. This check is done via persistent.AS_COMPLETED_SETUP . The boot loader's boot() method contains parameters to customize the Assistant's modes and any additional disclaimers, if necessary. Manual Setup If you want to call the Setup Assistant manually, you can use ASSetup.startSetup() to call the Assistant at any time. startSetup(express=True, disclaimer=None) Parameters express : Whether Express Mode is enabled. The default is set to True. disclaimer : A string containing any disclaimers or legal agreements. If set to None, the Setup Assistant will skip this step. Returns The Setup Assistant will return persistent.playername if it is deemed necessary for use. Adding steps to the Setup Assistant The Setup Assistant can be further customized by editing startSetup() in the core service file. The function calls the ASSetupAssistantView to display the step as a slide and collect any information if necessary. For example: renpy . call_screen ( ASSetupAssistantView , title = Create Your Username , instructions = Type in a username that you want to use while using AliceOS. This name will also appear as your character name if applicable. , useInputMethod = True ) ASSetupAssistantView(title=\"Setup Assistant\", instructions, useInputMethod=False, completed=False) Parameters title : The title of the step or slide. instructions : A brief description or set of instructions of what needs to be done on the step. useInputMethod : Whether to hide the 'Next' button and insert a text field instead. completed : Whether to change the 'Next' button text to 'Finish'. Returns If the screen is called using renpy.call_screen() , the following is returned: For steps that do not use the input method, 'didCompleteStep' is returned. For steps that use the input method, the input is returned as a string.","title":"Setup Assistant"},{"location":"System/06-setup-assistant/#setup-assistant","text":"The Setup Assistant is a first-run tool designed to set any initial settings and/or configurations for AliceOS before starting the visual novel. It also lets the user create a username as well as read over and legel agreements or disclaimers the game creator has provided. Tip Starting with AliceOS Prospect Park, the Setup Assistant is automatically configured to use Express Mode, which skips a lot of the onerous steps in the original process. However, for a more thorough experience, Express Mode can be turned off.","title":"Setup Assistant"},{"location":"System/06-setup-assistant/#automatic-setup","text":"In the Bootloader, the Setup Assistant will run if it doesn't detect that any setup was done. This check is done via persistent.AS_COMPLETED_SETUP . The boot loader's boot() method contains parameters to customize the Assistant's modes and any additional disclaimers, if necessary.","title":"Automatic Setup"},{"location":"System/06-setup-assistant/#manual-setup","text":"If you want to call the Setup Assistant manually, you can use ASSetup.startSetup() to call the Assistant at any time.","title":"Manual Setup"},{"location":"System/06-setup-assistant/#startsetupexpresstrue-disclaimernone","text":"Parameters express : Whether Express Mode is enabled. The default is set to True. disclaimer : A string containing any disclaimers or legal agreements. If set to None, the Setup Assistant will skip this step. Returns The Setup Assistant will return persistent.playername if it is deemed necessary for use.","title":"startSetup(express=True, disclaimer=None)"},{"location":"System/06-setup-assistant/#adding-steps-to-the-setup-assistant","text":"The Setup Assistant can be further customized by editing startSetup() in the core service file. The function calls the ASSetupAssistantView to display the step as a slide and collect any information if necessary. For example: renpy . call_screen ( ASSetupAssistantView , title = Create Your Username , instructions = Type in a username that you want to use while using AliceOS. This name will also appear as your character name if applicable. , useInputMethod = True )","title":"Adding steps to the Setup Assistant"},{"location":"System/06-setup-assistant/#assetupassistantviewtitlesetup-assistant-instructions-useinputmethodfalse-completedfalse","text":"Parameters title : The title of the step or slide. instructions : A brief description or set of instructions of what needs to be done on the step. useInputMethod : Whether to hide the 'Next' button and insert a text field instead. completed : Whether to change the 'Next' button text to 'Finish'. Returns If the screen is called using renpy.call_screen() , the following is returned: For steps that do not use the input method, 'didCompleteStep' is returned. For steps that use the input method, the input is returned as a string.","title":"ASSetupAssistantView(title=\"Setup Assistant\", instructions, useInputMethod=False, completed=False)"},{"location":"System/07-inventories/","text":"Inventories Inventories is a great tool included with AliceOS to set up, manage, and use an inventory system in any AliceOS-powered visual novel. Developers can easily define items and manage the inventory with the Inventories API, and users get an easy experience with managing items using the Inventories app built with ScreenKit. Inventories is an opt-in system, so if you don't think you need Inventories, you don't have to work with it at all. Features The Inventories app comes with some great features that work well with AliceOS: A fast and easy way to define items using the ASInventoryItem class that can state what an item is and how it can be used Methods to add and remove items from the inventory, as well as importing an inventory from a Python list GUI for players to use an item and see what they have in store Optional HUD to let players access the first five items in the inventory A sample inventory system Creating and maintaining the inventory can be accomplished easily in Ren'Py: label the_story : python : used_office_key = False def use_office_key () : store . used_office_key = True office_key_item = ASInventoryItem ( name = Office Key , description = Opens up the office door , canBeUsedOnce = True , specialUseCase = use_office_key ) Quickly, I look around the room for any keys to open the door and finally get out of the office. After searching under a few desks, I manage to find a key. $ inventory . addItem ( office_key_item ) while not used_office_key : Great! Now to just get the door open. The key unlocks the door, and I happily skip out. return When a player uses the item via the Inventories app, all of the logic for handling one-time use and even removing the item from the inventory is taken care of for you. Creating an item The inventory works with the ASInventoryItem class as a means of defining items and how they can be used in Inventories. Below are the required fields in the constructor ( __init__ ). Note Items in the inventory must use the ASInventoryItem class to ensure compatibility with the app and with the inventory methods. itemId : Any kind of identifier for this item. Defaults to None (no ID) name : String containing the name of the item. Defaults to \"Item\" description : String containing the description of the item. Defaults to an empty string. canBeUsed : Boolean dictating whether the item can be used. Defaults to True . specialUseCase : Function that dictates any game-changing behavior or any other actions to be completed when an item is used. Defaults to None . canBeUsedOnce : Boolean dictating whether the item is a one-time-use. Defaults to False . imageName : String containing the path to the image. Should be 128px by 128px. Defaults to the standard missing item image path. Managing the inventory The inventory can be invoked from inventory and is an instance of the ASInventories class, an app written with AppKit. The following methods are provided to make inventory management easier: applicationWillLaunch() Open the Inventories app. Inherited from ASAppRepresentative . callRecentItems() Opens the Inventories HUD which lets players access the first five items in the inventory. Useful in the quick menu or in scenarios where opening the Inventories app is impractical. isEmpty() Returns whether the inventory is empty or not as a boolean. export(filter=None) Returns the inventory as a list. Parameters : filter : (Optional) A function that defines what part of the inventory to return. Defaults to None , meaning return the item itself. Example The following can be used to grab the inventory, containing only the items' IDs. filter_id = lambda item : item . itemId items_by_id = inventory . export ( filter = filter_id ) retrieve() Warning This method had been deprecated in favor of export(filter=None) as of Prospect Park 2.0.0-devbeta4. Returns the inventory as a list of items ( ASInventoryItem ). containsItem(item) Checks whether the inventory contains a specific item. Parameters item : The item to check for ( ASInventoryItem ) Returns : Boolean value stating whether the item is in the inventory getItemByName(name) Looks for an item in the inventory and returns it, if possible. Parameters name : String containing the name of the item Returns : The appropriate ASInventoryItem object if found or None if the search fails. getItemById(itemId) Looks for an item in the inventory and returns it, if possible. Parameters itemId : The item's ID Returns : The appropriate ASInventoryItem object if found or None if the search fails. addItem(item, silent=False) Adds an item to the inventory if possible and displays a notification if the user permits. Parameters item : The item to insert ( ASInventoryItem ) silent : (Optional) Whether to silence the notification request upon adding the item. Defaults to False . Raises : May raise a TypeError if the item isn't an ASInventoryItem object useItem(item) Use an item if it exists in the inventory. Also removes any items that can no longer be used. Parameters item : The item to use ( ASInventoryItem ) Raises : May raise a KeyError if the item is not in the inventory importFromList(list) Imports the inventory from a Python list by appending each item to the inventory. Parameters list : The list containing ASInventoryItem items to import Raises : May raise a TypeError if the list contains elements that are not ASInventoryItem objects Saving the inventory It might be helpful to make sure that the player's inventory is properly saved since the class re-initialized with an empty inventory from the beginning. We recommend storing the current inventory before closing out the game. For example, if you wanted to store the inventory to the persistent file: label quit : $ persistent . saved_inventory = inventory . export () return Then, when you start the game again, you can reload these items: label before_main_menu : $ inventory . importFromList ( persistent . saved_inventory ) return Alternatively, you can save the state of these items in your game's file save or in Ren'Py's store variables: default player_inventory = [] $ player_inventory = inventory . retrieve () label after_load : $ inventory . importFromList ( player_inventory ) return Using the HUD The Inventories HUD is a great way to let players quickly access items without opening up the Inventories app. While you could make a cutton to open the app directly, it might be impractical at times. The HUD offers a solution as it shows players just the items and optionally lets them open the app for more items/details. For instance, it might be useful to include this HUD in the quick menu of your visual novel: screen quick_menu () : ## Ensure this appears on top of other screens . zorder 100 if quick_menu : hbox : style_prefix quick xalign 0 . 5 yalign 1 . 0 textbutton _ ( Back ) action Rollback () textbutton _ ( History ) action ShowMenu ( history ) textbutton _ ( Skip ) action Skip () alternate Skip ( fast = True , confirm = True ) textbutton _ ( Auto ) action Preference ( auto-forward , toggle ) textbutton _ ( Save ) action ShowMenu ( save ) textbutton _ ( Use Item ) action Function ( inventory . callRecentItems ) textbutton _ ( Q.Save ) action QuickSave () textbutton _ ( Q.Load ) action QuickLoad () textbutton _ ( Prefs ) action ShowMenu ( preferences ) During gameplay, the \"Use Item\" button will appear next to the typical buttons in the quick menu and players can click on it to open the HUD. More information on the callRecentItems() method used can be found in the inventory's class documentation .","title":"Inventories"},{"location":"System/07-inventories/#inventories","text":"Inventories is a great tool included with AliceOS to set up, manage, and use an inventory system in any AliceOS-powered visual novel. Developers can easily define items and manage the inventory with the Inventories API, and users get an easy experience with managing items using the Inventories app built with ScreenKit. Inventories is an opt-in system, so if you don't think you need Inventories, you don't have to work with it at all.","title":"Inventories"},{"location":"System/07-inventories/#features","text":"The Inventories app comes with some great features that work well with AliceOS: A fast and easy way to define items using the ASInventoryItem class that can state what an item is and how it can be used Methods to add and remove items from the inventory, as well as importing an inventory from a Python list GUI for players to use an item and see what they have in store Optional HUD to let players access the first five items in the inventory","title":"Features"},{"location":"System/07-inventories/#a-sample-inventory-system","text":"Creating and maintaining the inventory can be accomplished easily in Ren'Py: label the_story : python : used_office_key = False def use_office_key () : store . used_office_key = True office_key_item = ASInventoryItem ( name = Office Key , description = Opens up the office door , canBeUsedOnce = True , specialUseCase = use_office_key ) Quickly, I look around the room for any keys to open the door and finally get out of the office. After searching under a few desks, I manage to find a key. $ inventory . addItem ( office_key_item ) while not used_office_key : Great! Now to just get the door open. The key unlocks the door, and I happily skip out. return When a player uses the item via the Inventories app, all of the logic for handling one-time use and even removing the item from the inventory is taken care of for you.","title":"A sample inventory system"},{"location":"System/07-inventories/#creating-an-item","text":"The inventory works with the ASInventoryItem class as a means of defining items and how they can be used in Inventories. Below are the required fields in the constructor ( __init__ ). Note Items in the inventory must use the ASInventoryItem class to ensure compatibility with the app and with the inventory methods. itemId : Any kind of identifier for this item. Defaults to None (no ID) name : String containing the name of the item. Defaults to \"Item\" description : String containing the description of the item. Defaults to an empty string. canBeUsed : Boolean dictating whether the item can be used. Defaults to True . specialUseCase : Function that dictates any game-changing behavior or any other actions to be completed when an item is used. Defaults to None . canBeUsedOnce : Boolean dictating whether the item is a one-time-use. Defaults to False . imageName : String containing the path to the image. Should be 128px by 128px. Defaults to the standard missing item image path.","title":"Creating an item"},{"location":"System/07-inventories/#managing-the-inventory","text":"The inventory can be invoked from inventory and is an instance of the ASInventories class, an app written with AppKit. The following methods are provided to make inventory management easier:","title":"Managing the inventory"},{"location":"System/07-inventories/#applicationwilllaunch","text":"Open the Inventories app. Inherited from ASAppRepresentative .","title":"applicationWillLaunch()"},{"location":"System/07-inventories/#callrecentitems","text":"Opens the Inventories HUD which lets players access the first five items in the inventory. Useful in the quick menu or in scenarios where opening the Inventories app is impractical.","title":"callRecentItems()"},{"location":"System/07-inventories/#isempty","text":"Returns whether the inventory is empty or not as a boolean.","title":"isEmpty()"},{"location":"System/07-inventories/#exportfilternone","text":"Returns the inventory as a list. Parameters : filter : (Optional) A function that defines what part of the inventory to return. Defaults to None , meaning return the item itself. Example The following can be used to grab the inventory, containing only the items' IDs. filter_id = lambda item : item . itemId items_by_id = inventory . export ( filter = filter_id )","title":"export(filter=None)"},{"location":"System/07-inventories/#retrieve","text":"Warning This method had been deprecated in favor of export(filter=None) as of Prospect Park 2.0.0-devbeta4. Returns the inventory as a list of items ( ASInventoryItem ).","title":"retrieve()"},{"location":"System/07-inventories/#containsitemitem","text":"Checks whether the inventory contains a specific item. Parameters item : The item to check for ( ASInventoryItem ) Returns : Boolean value stating whether the item is in the inventory","title":"containsItem(item)"},{"location":"System/07-inventories/#getitembynamename","text":"Looks for an item in the inventory and returns it, if possible. Parameters name : String containing the name of the item Returns : The appropriate ASInventoryItem object if found or None if the search fails.","title":"getItemByName(name)"},{"location":"System/07-inventories/#getitembyiditemid","text":"Looks for an item in the inventory and returns it, if possible. Parameters itemId : The item's ID Returns : The appropriate ASInventoryItem object if found or None if the search fails.","title":"getItemById(itemId)"},{"location":"System/07-inventories/#additemitem-silentfalse","text":"Adds an item to the inventory if possible and displays a notification if the user permits. Parameters item : The item to insert ( ASInventoryItem ) silent : (Optional) Whether to silence the notification request upon adding the item. Defaults to False . Raises : May raise a TypeError if the item isn't an ASInventoryItem object","title":"addItem(item, silent=False)"},{"location":"System/07-inventories/#useitemitem","text":"Use an item if it exists in the inventory. Also removes any items that can no longer be used. Parameters item : The item to use ( ASInventoryItem ) Raises : May raise a KeyError if the item is not in the inventory","title":"useItem(item)"},{"location":"System/07-inventories/#importfromlistlist","text":"Imports the inventory from a Python list by appending each item to the inventory. Parameters list : The list containing ASInventoryItem items to import Raises : May raise a TypeError if the list contains elements that are not ASInventoryItem objects","title":"importFromList(list)"},{"location":"System/07-inventories/#saving-the-inventory","text":"It might be helpful to make sure that the player's inventory is properly saved since the class re-initialized with an empty inventory from the beginning. We recommend storing the current inventory before closing out the game. For example, if you wanted to store the inventory to the persistent file: label quit : $ persistent . saved_inventory = inventory . export () return Then, when you start the game again, you can reload these items: label before_main_menu : $ inventory . importFromList ( persistent . saved_inventory ) return Alternatively, you can save the state of these items in your game's file save or in Ren'Py's store variables: default player_inventory = [] $ player_inventory = inventory . retrieve () label after_load : $ inventory . importFromList ( player_inventory ) return","title":"Saving the inventory"},{"location":"System/07-inventories/#using-the-hud","text":"The Inventories HUD is a great way to let players quickly access items without opening up the Inventories app. While you could make a cutton to open the app directly, it might be impractical at times. The HUD offers a solution as it shows players just the items and optionally lets them open the app for more items/details. For instance, it might be useful to include this HUD in the quick menu of your visual novel: screen quick_menu () : ## Ensure this appears on top of other screens . zorder 100 if quick_menu : hbox : style_prefix quick xalign 0 . 5 yalign 1 . 0 textbutton _ ( Back ) action Rollback () textbutton _ ( History ) action ShowMenu ( history ) textbutton _ ( Skip ) action Skip () alternate Skip ( fast = True , confirm = True ) textbutton _ ( Auto ) action Preference ( auto-forward , toggle ) textbutton _ ( Save ) action ShowMenu ( save ) textbutton _ ( Use Item ) action Function ( inventory . callRecentItems ) textbutton _ ( Q.Save ) action QuickSave () textbutton _ ( Q.Load ) action QuickLoad () textbutton _ ( Prefs ) action ShowMenu ( preferences ) During gameplay, the \"Use Item\" button will appear next to the typical buttons in the quick menu and players can click on it to open the HUD. More information on the callRecentItems() method used can be found in the inventory's class documentation .","title":"Using the HUD"}]} \ No newline at end of file diff --git a/docs/sitemap.xml b/docs/sitemap.xml index d6158ad..c5374f7 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -2,142 +2,147 @@ None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 daily None - 2019-11-29 + 2019-12-21 + daily + + + None + 2019-12-21 daily \ No newline at end of file diff --git a/docs/sitemap.xml.gz b/docs/sitemap.xml.gz index 322ba0e..091bcb9 100644 Binary files a/docs/sitemap.xml.gz and b/docs/sitemap.xml.gz differ diff --git a/game/System/ASDefinitions.rpy b/game/System/ASDefinitions.rpy index 0473bc8..5b6129a 100644 --- a/game/System/ASDefinitions.rpy +++ b/game/System/ASDefinitions.rpy @@ -44,11 +44,11 @@ init -1000: # MARK: OS permissions strings define AS_REQUIRE_NOTIFKIT_NAME = "Send Notifications" - define AS_REQUIRE_NOTIFKIT_DESC = "Notifications may include banners, alerts, and sounds. These can be configured in Settings." + define AS_REQUIRE_NOTIFKIT_DESC = "Notifications may include banners, alerts, and sounds. These can be configured in App Manager." define AS_REQUIRE_FDA_NAME = "Access Your Files" - define AS_REQUIRE_FDA_DESC = "File access may include your Home directory and your AliceOS installation. This can be configured in Settings." + define AS_REQUIRE_FDA_DESC = "File access may include your Home directory and your AliceOS installation. This can be configured in App Manager." define AS_REQUIRE_SYSEV_NAME = "Control AliceOS Settings" - define AS_REQUIRE_SYSEV_DESC = "Settings access may include accessibility settings, system events, and preferences. This can be configured in Settings." + define AS_REQUIRE_SYSEV_DESC = "Settings access may include accessibility settings, system events, and preferences. This can be configured in App Manager." # MARK: OS permissions enumerations define AS_REQUIRE_PERMS_NAME = { diff --git a/game/System/Applications/Inventories.aosapp/Inventories.rpy b/game/System/Applications/Inventories.aosapp/Inventories.rpy index 425158f..c3890d7 100644 --- a/game/System/Applications/Inventories.aosapp/Inventories.rpy +++ b/game/System/Applications/Inventories.aosapp/Inventories.rpy @@ -34,24 +34,38 @@ init 10 python: return len(self.inventory) == 0 def retrieve(self): - return self.inventory + print "WARN: ASInventories.retrieve is deprecated. Please use ASInventories.export instead." + return self.export() + + def export(self, filter=None): + new_inventory = self.inventory.copy() + if callable(filter): + new_inventory = map(filter, new_inventory) + return new_inventory def containsItem(self, item): return item in self.inventory + def getItemById(self, itemId): + for item in self.inventory: + if item.itemId == itemId: + return item + return None + def getItemByName(self, name): for item in self.inventory: if item.name == name: return item return None - def addItem(self, item): + def addItem(self, item, silent=False): if isinstance(item, ASInventoryItem): self.inventory.append(item) - shouldDisplayItem = self.applicationWillRequestNotification("%s received!" % (item.name), "Go to Inventories to learn more.") + if not silent: + shouldDisplayItem = self.applicationWillRequestNotification("%s received!" % (item.name), "Go to Inventories to learn more.") - if shouldDisplayItem == "didClickRespond": - renpy.show_screen("ASInventoryManagerView", currentItem=item) + if shouldDisplayItem == "didClickRespond": + renpy.show_screen("ASInventoryManagerView", currentItem=item) else: raise TypeError("Expected item to be ASInventoryItem, but received %s" % (type(item))) @@ -64,6 +78,12 @@ init 10 python: else: raise KeyError("Item not found in the inventory: %s" % (item,) ) + def removeItem(self, item): + if item in self.inventory: + self.inventory.remove(item) + else: + raise KeyError("Item not found in the inventory: %s" % (item,) ) + def importFromList(self, list): listAsInventoryChecks = map(lambda x: isinstance(x, ASInventoryItem), list) diff --git a/game/System/Applications/Inventories.aosapp/Structures/ASInventoryItem.rpy b/game/System/Applications/Inventories.aosapp/Structures/ASInventoryItem.rpy index 7e252f5..4f5f096 100644 --- a/game/System/Applications/Inventories.aosapp/Structures/ASInventoryItem.rpy +++ b/game/System/Applications/Inventories.aosapp/Structures/ASInventoryItem.rpy @@ -9,13 +9,14 @@ init 10 python: class ASInventoryItem(object): - def __init__(self, name="Item", description="", canBeUsed=True, specialUseCase=None, canBeUsedOnce=False, imageName=ASInventories.bundleDir + "Resources/Item.png"): + def __init__(self, itemId=None, name="Item", description="", canBeUsed=True, specialUseCase=None, canBeUsedOnce=False, imageName=ASInventories.bundleDir + "Resources/Item.png"): self.name = name self.description = description self.canBeUsed = canBeUsed self.canBeUsedOnce = canBeUsedOnce self.runSpecialUseCase = specialUseCase if callable(specialUseCase) else None self.imageName = imageName + self.itemId = itemId def useItem(self): if self.canBeUsed: diff --git a/game/System/CoreServices/Desktop.aoscservice/ASDesktopCoreService.rpy b/game/System/CoreServices/Desktop.aoscservice/ASDesktopCoreService.rpy index 1bd2e3b..9221546 100644 --- a/game/System/CoreServices/Desktop.aoscservice/ASDesktopCoreService.rpy +++ b/game/System/CoreServices/Desktop.aoscservice/ASDesktopCoreService.rpy @@ -31,9 +31,12 @@ init 5 python: from time import gmtime, strftime return strftime("%a. %I:%M %p") - def showDesktop(self): + def _callDesktop(self): renpy.call_screen("ASDesktopShellView") + def showDesktop(self): + renpy.show_screen("ASDesktopShellView") + def showTopBar(self): renpy.call_screen("ASDesktopTopBar") diff --git a/mkdocs/01-install.md b/mkdocs/01-install.md index bac4c5c..8f3bad8 100644 --- a/mkdocs/01-install.md +++ b/mkdocs/01-install.md @@ -9,14 +9,14 @@ If you do not plan to customize AliceOS too much, you can add the base system ar Download the latest release from the Downloads page and extract the ZIP archive. Then, copy `AliceOSBaseSystem.rpa` over to your Ren'Py project's game folder. !!! info "Ensure compatibility" - The latest version of AliceOS for download will always correspond to the latest version of the Ren'Py SDK made available at that time. At the time of writing, this means that AliceOS is building against Ren'Py SDK v**7.3.2**. If you are unsure of what version AliceOS is built with, check the [Travis results](https://travis-ci.com/alicerunsonfedora/CatalinaToriel) and click on "Ren'Py Latest SDK". + The latest version of AliceOS for download will always correspond to the latest version of the Ren'Py SDK made available at that time. At the time of writing, this means that AliceOS is building against Ren'Py SDK v**7.3.5**. If you are unsure of what version AliceOS is built with, check the [GitHub Actions page](https://github.com/projectalicedev/aliceos/actions) and click on "Build AliceOS Archive". It is recommend that you make sure that your version of Ren'Py is up to date to ensure compatibility with AliceOS. ### Usage with DDLC Mods If you plan to use AliceOS in a mod for _Doki Doki Literature Club!_, you must make sure that the base system version that you use is built against Ren'Py **6.99.12.4** to maintain compatibility. -The release ZIP file is generally noted as 'AliceOS-x.x.x-_AliceOSBaseSystem-rp6.zip'. +The release ZIP file is generally noted as `AliceOS-x.x.x-_6.99.12.4-ASBaseSystem.zip`. ## Building from source code diff --git a/mkdocs/Release-Notes/20.0_db3.md b/mkdocs/Release-Notes/20.0_db3.md new file mode 100644 index 0000000..80401ce --- /dev/null +++ b/mkdocs/Release-Notes/20.0_db3.md @@ -0,0 +1,20 @@ +# Prospect Park (2.0.0) Developer Beta 3 + +The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). + +## ScreenKit + +- ScreenKit now include horizontal scrollbars and radio buttons. +- ScreenKit frames are more rectangular. + +## Apps + +- Introduces a new Inventories app, a fast and fun way to create and manage a game inventory. + +## About AliceOS + +- The Ren'Py version should now match the proper built version and not be hard-coded. + +## Setup Assistant + +- Setup Assistant now uses ScreenKit to draw elements. \ No newline at end of file diff --git a/mkdocs/Release-Notes/index.md b/mkdocs/Release-Notes/index.md index 80401ce..f63bd25 100644 --- a/mkdocs/Release-Notes/index.md +++ b/mkdocs/Release-Notes/index.md @@ -1,20 +1,104 @@ -# Prospect Park (2.0.0) Developer Beta 3 +# Prospect Park (2.0.0) -The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). +The following document covers the latest changes in AliceOS Prospect Park (v. 2.0.0). If you are upgrading from Developer Beta 3, you can read the [latest changes since that release](#changes-since-developer-beta-3). -## ScreenKit +!!! info "Before you upgrade" + AliceOS Prospect Park is a dramatic overhaul of the classic AliceOS and may break upon installation. Please review everything carefully. -- ScreenKit now include horizontal scrollbars and radio buttons. -- ScreenKit frames are more rectangular. +## General + +- The system organization has migrated over to a macOS-styled directory structure with System, Library, and Applications. +- Installation has changed over to an RPA-based solution. Installation now is as simple as dragging the RPA. +- AliceOS APIs, class names, and function names have been renamed and switch over to camel case instead of snake case. ## Apps +- Applets have been deprecated in favor of new apps written with AppKit in mind. +- Apps no longer need to declare a desktop shell component as this is handled by the native `applicationWillLaunch` method. +- Apps can now write starup/login services via `applicationWillLaunchAtLogin()` and check for System Events permissions with `applicationShouldLaunchAtLogin()`. +- Notifications and alerts in AppKit are now invoked in a new context instead of interrupting the current one. +- The 48 pixel icon entry in `ASAppRepresentative` has been re-added. +- If unimplemented, `applicationWillLaunch()` will log a warning in the terminal. - Introduces a new Inventories app, a fast and fun way to create and manage a game inventory. -## About AliceOS +## Messages + +- Messages now displays a "Coming Soon" alert when launched from the Desktop. + + +## Core Services and Applications + +- Applications such as Messages have been moved to `System/Applications/` and use AppKit. +- The halt screen, bootloader, and Setup Assistant are now Core Services that use ServiceKit. + +## Desktop -- The Ren'Py version should now match the proper built version and not be hard-coded. +- The Desktop now uses the `applicationWillLaunch` method from AppKit apps to start apps accordingly and will invoke `applicationWillLaunch` as a Ren'Py function callback. +- The Desktop image is defined as `AS_DESKTOP_IMG`. +- The Desktop now refreshes quickly to get the latest time on the clock. + +## Halt screens (formerly Stop errors) + +- The halt screen uses the AliceOS dynamic blur instead of its own background. +- A QR code has been added that redirects users to the AliceOS Error Database. +- The text has been changed to indicate how long before AliceOS will automatically restart the game. + +## Notifications + +- Notifications are now under the NotificationKit framework. +- Alerts no longer appear as a white square. They now use the AliceOS dynamic blur feature. + +## Bootloader + +- The bootloader will now attempt to run any authorized startup services in a new thread. +- An optional `bootView` parameter allows developers to set a custom boot screen to display instead of the default. ## Setup Assistant -- Setup Assistant now uses ScreenKit to draw elements. \ No newline at end of file +- Express Mode is on by default, but can be disabled in the bootloader's `boot` method. +- Instructions have been rewritten for conciseness and clarity. +- The interface has changed to a more macOS-like experience. +- Setup Assistant now uses ScreenKit to draw elements. + +## ScreenKit + +- ScreenKit has been introduced as a means of creating user interfaces for AliceOS using Ren'Py's screen language and styling. +- Styles for frames, vertical and horizontal boxes, text, checkbox buttons, vertical scrollbars, and push buttons have been implemented. +- `ASInterfaceTitlebar` has been implemented as a smaller component to add a title bar to a given frame. +- ScreenKit now include horizontal scrollbars and radio buttons. +- ScreenKit frames are more rectangular. + +## About AliceOS + +- The main interface has been written entirely with ScreenKit and displays information from system definitions. + - The Ren'Py version should now match the proper built version and not be hard-coded. + +## App Manager + +- App Manager has been introduced as a means of managing an app's permissions and viewing details about the app. +- Apps in App Manager list their permissions as toggleable checkboxes. + + +## Changes since Developer Beta 3 + +### Inventories + +- `ASInventoryItem` objects can now have an optional ID field, `itemId`. +- `ASInventories` includes new methods: + - `export(filter=None)`: Return the inventory with a filter, if specified. + - `getItemById(itemId)`: Find an item by its ID. + +### AppKit + +- Permission strings now reference App Manager instead of Settings. + +### Desktop + +- `showDesktop()` now calls `renpy.show_screen` instead of `renpy.call_screen`. For the old behavior, reference `_callDesktop()`. + +### CI/CD + +- AliceOS now produces builds on every push/pull request that can be accessed on GitHub Actions. + +!!! warning + Treat these builds from GitHub as a developer release; do _not_ use these builds in production-ready visual novels. \ No newline at end of file diff --git a/mkdocs/System/07-inventories.md b/mkdocs/System/07-inventories.md index 275385b..ee6cede 100644 --- a/mkdocs/System/07-inventories.md +++ b/mkdocs/System/07-inventories.md @@ -54,6 +54,7 @@ The inventory works with the `ASInventoryItem` class as a means of defining item !!! note Items in the inventory must use the `ASInventoryItem` class to ensure compatibility with the app and with the inventory methods. +- `itemId`: Any kind of identifier for this item. Defaults to `None` (no ID) - `name`: String containing the name of the item. Defaults to `"Item"` - `description`: String containing the description of the item. Defaults to an empty string. - `canBeUsed`: Boolean dictating whether the item can be used. Defaults to `True`. @@ -77,8 +78,27 @@ Opens the Inventories HUD which lets players access the first five items in the Returns whether the inventory is empty or not as a boolean. +### `export(filter=None)` + +Returns the inventory as a list. + +**Parameters**: + +- `filter`: (Optional) A function that defines what part of the inventory to return. Defaults to `None`, meaning return the item itself. + +!!! example + The following can be used to grab the inventory, containing only the items' IDs. + + + filter_id = lambda item: item.itemId + items_by_id = inventory.export(filter=filter_id) + + ### `retrieve()` +!!! warning Deprecated + This method had been deprecated in favor of `export(filter=None)` as of Prospect Park 2.0.0-devbeta4. + Returns the inventory as a list of items (`ASInventoryItem`). ### `containsItem(item)` @@ -101,13 +121,24 @@ Looks for an item in the inventory and returns it, if possible. **Returns**: The appropriate `ASInventoryItem` object if found or `None` if the search fails. -### `addItem(item)` +### `getItemById(itemId)` + +Looks for an item in the inventory and returns it, if possible. + +**Parameters** + +- `itemId`: The item's ID + +**Returns**: The appropriate `ASInventoryItem` object if found or `None` if the search fails. + +### `addItem(item, silent=False)` Adds an item to the inventory if possible and displays a notification if the user permits. **Parameters** - `item`: The item to insert (`ASInventoryItem`) +- `silent`: (Optional) Whether to silence the notification request upon adding the item. Defaults to `False`. **Raises**: May raise a `TypeError` if the item isn't an `ASInventoryItem` object @@ -138,7 +169,7 @@ It might be helpful to make sure that the player's inventory is properly saved s ```renpy label quit: - $ persistent.saved_inventory = inventory.retrieve() + $ persistent.saved_inventory = inventory.export() return ``` diff --git a/mkdocs/index.md b/mkdocs/index.md index a3bc8c4..1aa38d2 100644 --- a/mkdocs/index.md +++ b/mkdocs/index.md @@ -2,7 +2,7 @@ ![AliceOS Screenshot](images/hero.jpg) -![AliceOS 2.0.0](https://img.shields.io/badge/aliceos-2.0.0-yellow.svg) [![Build Status](https://travis-ci.com/ProjectAliceDev/aliceos.svg?token=d7YdxjzD7RWGCxysa2ip&branch=master)](https://travis-ci.com/ProjectAliceDev/aliceos) +[![Latest release on GitHub](https://img.shields.io/github/v/release/projectalicedev/aliceos?include_prereleases)](https://github.com/hyperspacedev/hyperspace/releases) [![Build Status](https://github.com/ProjectAliceDev/aliceos/workflows/Build%20AliceOS%20Archive/badge.svg)](https://github.com/projectalicedev/aliceos/actions) AliceOS is a robust and evolving framework for developing interactive visual novel experiences with operating system-like features such as notifications and setup assistants.