Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5ba5cefd23 | |||
| 5496b76370 | |||
| c2348fa700 | |||
| 35c7ef0cb6 | |||
| 8f545fb137 | |||
| 061f9d23c1 | |||
| 4b53ac3001 | |||
| 1f7a40d8a8 |
3
.vs/ProjectSettings.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"CurrentProjectSetting": null
|
||||
}
|
||||
8
.vs/VSWorkspaceState.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"ExpandedNodes": [
|
||||
"",
|
||||
"\\game"
|
||||
],
|
||||
"SelectedNode": "\\game\\shiro_route.rpy",
|
||||
"PreviewInSolutionExplorer": false
|
||||
}
|
||||
BIN
.vs/otomai/v16/.suo
Normal file
BIN
.vs/slnx.sqlite
Normal file
2
Jenkinsfile
vendored
@@ -19,7 +19,7 @@ pipeline {
|
||||
}
|
||||
stage('Download Latest release') {
|
||||
steps {
|
||||
sh 'curl -LO https://git.ruff.co.il/amai.ig/otomai/releases/latest/download/Otomai-web.zip'
|
||||
sh 'curl -LO https://git.ruff.co.il/amai.ig/otomai/releases/download/latest/Otomai-web.zip'
|
||||
}
|
||||
}
|
||||
stage('Create web game directory') {
|
||||
|
||||
64
README.md
@@ -1,2 +1,62 @@
|
||||
# otomai
|
||||
short amai visual novel
|
||||
# Otomai: A Harucon Easter Egg ✨
|
||||
|
||||
**Otomai** is a short Ren'Py visual novel game created as a secret easter egg for the Israeli anime and sci-fi convention, Harucon.
|
||||
|
||||
This project is a single-player, narrative-driven experience built with the Ren'Py visual novel engine.
|
||||
|
||||
**Note:** This game is currently intended as a web experience running inside a Docker container.
|
||||
|
||||
### Features
|
||||
|
||||
* Short, interactive visual novel experience
|
||||
* Original story and characters
|
||||
* A fun (hopefully!) surprise for Harucon attendees
|
||||
|
||||
### Getting Started
|
||||
|
||||
**Prerequisites**
|
||||
|
||||
**For building the game from source**
|
||||
* Python3 installed
|
||||
* Ren'Py installed
|
||||
|
||||
**For running the game inside a docker container**
|
||||
* Docker installed on your system. You can find installation instructions for your OS on the official Docker website: [https://www.docker.com/products/docker-desktop/](https://www.docker.com/products/docker-desktop/)
|
||||
|
||||
**Building the Game**
|
||||
|
||||
1. Clone this repository:
|
||||
```
|
||||
git clone https://git.ruff.co.il/amai.ig/otomai.git
|
||||
```
|
||||
2. Using Ren'Py, load the source and build for your desired platform.
|
||||
3. Run the final compiled result.
|
||||
|
||||
**Running the game inside a docker container**
|
||||
|
||||
1. Pull the docker image:
|
||||
```
|
||||
docker pull git.ruff.co.il/amai.ig/otomai:latest
|
||||
```
|
||||
2. Start a container with port 5000 exposed:
|
||||
```
|
||||
docker run git.ruff.co.il/amai.ig/otomai:latest -p 5000:80 --name otomai
|
||||
```
|
||||
3. Open your web browser and navigate to `http://docker-host:5000`
|
||||
|
||||
This should launch the Otomai game within your web browser.
|
||||
|
||||
### Contributing
|
||||
|
||||
We welcome contributions to this project! If you'd like to help with development, please open a pull request on this repository.
|
||||
|
||||
### License
|
||||
|
||||
This project is licensed under the MIT License. See the `LICENSE` file for details.
|
||||
|
||||
|
||||
### Contact
|
||||
|
||||
For any questions or feedback, feel free to open an issue on this repository.
|
||||
|
||||
We hope you enjoy your Otomai experience!
|
||||
10
errors.txt
@@ -2,13 +2,9 @@
|
||||
errors listed below, and try again.
|
||||
|
||||
|
||||
File "game/script.rpy", line 44: choice menuitem expects a non-empty block.
|
||||
"אני גם אוהב פפסי":
|
||||
^
|
||||
|
||||
File "game/script.rpy", line 47: Line is indented, but the preceding jump statement statement does not expect a block. Please check this line's indentation. You may have forgotten a colon (:).
|
||||
"אני לא אוהב פפסי":
|
||||
File "game/akai_route.rpy", line 395: play requires a file
|
||||
play bgm_convention
|
||||
^
|
||||
|
||||
Ren'Py Version: Ren'Py 8.3.2.24090902
|
||||
Sat Sep 28 09:59:45 2024
|
||||
Sun Jan 12 14:45:42 2025
|
||||
|
||||
135
game/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"files.exclude": {
|
||||
"**/*.rpyc": true,
|
||||
"**/*.rpa": true,
|
||||
"**/*.rpymc": true,
|
||||
"**/cache/": true
|
||||
},
|
||||
"editor.tokenColorCustomizations": {
|
||||
"textMateRules": [
|
||||
{
|
||||
"scope": "renpy.meta.plain",
|
||||
"settings": {
|
||||
"fontStyle": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.i",
|
||||
"settings": {
|
||||
"fontStyle": "italic"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.b",
|
||||
"settings": {
|
||||
"fontStyle": "bold"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": [
|
||||
"renpy.meta.u",
|
||||
"renpy.meta.a"
|
||||
],
|
||||
"settings": {
|
||||
"fontStyle": "underline"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.s",
|
||||
"settings": {
|
||||
"fontStyle": "strikethrough"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.i renpy.meta.b",
|
||||
"settings": {
|
||||
"fontStyle": "italic bold"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.i renpy.meta.u",
|
||||
"settings": {
|
||||
"fontStyle": "italic underline"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.i renpy.meta.s",
|
||||
"settings": {
|
||||
"fontStyle": "italic strikethrough"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.b renpy.meta.u",
|
||||
"settings": {
|
||||
"fontStyle": "bold underline"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.b renpy.meta.s",
|
||||
"settings": {
|
||||
"fontStyle": "bold strikethrough"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.u renpy.meta.s",
|
||||
"settings": {
|
||||
"fontStyle": "underline strikethrough"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.i renpy.meta.b renpy.meta.u",
|
||||
"settings": {
|
||||
"fontStyle": "italic bold underline"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.i renpy.meta.b renpy.meta.s",
|
||||
"settings": {
|
||||
"fontStyle": "italic bold strikethrough"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.i renpy.meta.u renpy.meta.s",
|
||||
"settings": {
|
||||
"fontStyle": "italic underline strikethrough"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.b renpy.meta.u renpy.meta.s",
|
||||
"settings": {
|
||||
"fontStyle": "bold underline strikethrough"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.i renpy.meta.b renpy.meta.u renpy.meta.s",
|
||||
"settings": {
|
||||
"fontStyle": "italic bold underline strikethrough"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.color.text",
|
||||
"settings": {
|
||||
"foreground": "#ffffff"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.color.#fff",
|
||||
"settings": {
|
||||
"foreground": "#fff"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.color.#ff0000",
|
||||
"settings": {
|
||||
"foreground": "#ff0000"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.color.#5e9cff",
|
||||
"settings": {
|
||||
"foreground": "#5e9cff"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
BIN
game/Assistant-Bold.ttf
Normal file
BIN
game/Assistant-Light.ttf
Normal file
BIN
game/Assistant-Medium.ttf
Normal file
BIN
game/Assistant-Regular.ttf
Normal file
BIN
game/MPLUSRounded1c-Regular.ttf
Normal file
BIN
game/Rubik-Black.ttf
Normal file
BIN
game/Rubik-Bold.ttf
Normal file
BIN
game/Rubik-ExtraBold.ttf
Normal file
1339
game/akai_route.rpy
Normal file
BIN
game/akai_route.rpyc
Normal file
1066
game/aoi_route.rpy
Normal file
BIN
game/aoi_route.rpyc
Normal file
BIN
game/audio/bgm_amaidol.mp3
Normal file
BIN
game/audio/bgm_bad_ending.mp3
Normal file
BIN
game/audio/bgm_convention.mp3
Normal file
BIN
game/audio/bgm_cosplay_contest.mp3
Normal file
BIN
game/audio/bgm_crisis.mp3
Normal file
BIN
game/audio/bgm_good_ending.mp3
Normal file
BIN
game/audio/bgm_magical.flac
Normal file
BIN
game/audio/bgm_song_bad.mp3
Normal file
BIN
game/audio/bgm_song_good.mp3
Normal file
BIN
game/audio/bgm_weird.mp3
Normal file
BIN
game/audio/sfx_awkward_clap.mp3
Normal file
BIN
game/audio/sfx_bump.mp3
Normal file
BIN
game/audio/sfx_crowd_cheer.mp3
Normal file
BIN
game/audio/sfx_crowd_murmur.mp3
Normal file
BIN
game/audio/sfx_drumroll.mp3
Normal file
BIN
game/audio/sfx_fixing.mp3
Normal file
BIN
game/audio/sfx_gasp.mp3
Normal file
BIN
game/audio/sfx_mic_drop.mp3
Normal file
BIN
game/audio/sfx_phone.mp3
Normal file
BIN
game/audio/sfx_train_arrive.wav
Normal file
BIN
game/audio/sfx_train_door_open.wav
Normal file
BIN
game/cache/bytecode-39.rpyb
vendored
BIN
game/cache/py3analysis.rpyb
vendored
BIN
game/cache/screens.rpyb
vendored
11
game/cache/shaders.txt
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
renpy.geometry renpy.solid
|
||||
|
||||
renpy.texture
|
||||
|
||||
renpy.geometry renpy.matrixcolor renpy.texture
|
||||
|
||||
renpy.dissolve renpy.geometry
|
||||
|
||||
renpy.alpha renpy.texture
|
||||
|
||||
renpy.alpha renpy.geometry renpy.texture
|
||||
32
game/gui.rpy
@@ -30,7 +30,7 @@ define config.check_conflicting_properties = True
|
||||
define gui.accent_color = '#990000'
|
||||
|
||||
## The color used for a text button when it is neither selected nor hovered.
|
||||
define gui.idle_color = '#707070'
|
||||
define gui.idle_color = '#ffffff'
|
||||
|
||||
## The small color is used for small text, which needs to be brighter/darker to
|
||||
## achieve the same effect.
|
||||
@@ -52,20 +52,20 @@ define gui.muted_color = '#c16666'
|
||||
define gui.hover_muted_color = '#d69999'
|
||||
|
||||
## The colors used for dialogue and menu choice text.
|
||||
define gui.text_color = '#404040'
|
||||
define gui.text_color = '#ffffff'
|
||||
define gui.interface_text_color = '#404040'
|
||||
|
||||
|
||||
## Fonts and Font Sizes ########################################################
|
||||
|
||||
## The font used for in-game text.
|
||||
define gui.text_font = "DejaVuSans.ttf"
|
||||
define gui.text_font = "Assistant-Regular.ttf"
|
||||
|
||||
## The font used for character names.
|
||||
define gui.name_text_font = "DejaVuSans.ttf"
|
||||
define gui.name_text_font = "Rubik-ExtraBold.ttf"
|
||||
|
||||
## The font used for out-of-game text.
|
||||
define gui.interface_text_font = "DejaVuSans.ttf"
|
||||
define gui.interface_text_font = "Assistant-Bold.ttf"
|
||||
|
||||
## The size of normal dialogue text.
|
||||
define gui.text_size = 33
|
||||
@@ -108,12 +108,12 @@ define gui.textbox_yalign = 1.0
|
||||
|
||||
## The placement of the speaking character's name, relative to the textbox.
|
||||
## These can be a whole number of pixels from the left or top, or 0.5 to center.
|
||||
define gui.name_xpos = 360
|
||||
define gui.name_xpos = 0.82
|
||||
define gui.name_ypos = 0
|
||||
|
||||
## The horizontal alignment of the character's name. This can be 0.0 for left-
|
||||
## aligned, 0.5 for centered, and 1.0 for right-aligned.
|
||||
define gui.name_xalign = 0.0
|
||||
define gui.name_xalign = 1.0
|
||||
|
||||
## The width, height, and borders of the box containing the character's name, or
|
||||
## None to automatically size it.
|
||||
@@ -132,7 +132,7 @@ define gui.namebox_tile = False
|
||||
## The placement of dialogue relative to the textbox. These can be a whole
|
||||
## number of pixels relative to the left or top side of the textbox, or 0.5 to
|
||||
## center.
|
||||
define gui.dialogue_xpos = 402
|
||||
define gui.dialogue_xpos = 0.75
|
||||
define gui.dialogue_ypos = 75
|
||||
|
||||
## The maximum width of dialogue text, in pixels.
|
||||
@@ -140,7 +140,7 @@ define gui.dialogue_width = 1116
|
||||
|
||||
## The horizontal alignment of the dialogue text. This can be 0.0 for left-
|
||||
## aligned, 0.5 for centered, and 1.0 for right-aligned.
|
||||
define gui.dialogue_text_xalign = 0.0
|
||||
define gui.dialogue_text_xalign = 1.0
|
||||
|
||||
|
||||
## Buttons #####################################################################
|
||||
@@ -173,7 +173,7 @@ define gui.button_text_insensitive_color = gui.insensitive_color
|
||||
|
||||
## The horizontal alignment of the button text. (0.0 is left, 0.5 is center, 1.0
|
||||
## is right).
|
||||
define gui.button_text_xalign = 0.0
|
||||
define gui.button_text_xalign = 1.0
|
||||
|
||||
|
||||
## These variables override settings for different kinds of buttons. Please see
|
||||
@@ -250,7 +250,7 @@ define gui.file_slot_rows = 2
|
||||
|
||||
## The position of the left side of the navigation buttons, relative to the left
|
||||
## side of the screen.
|
||||
define gui.navigation_xpos = 60
|
||||
define gui.navigation_xpos = 200
|
||||
|
||||
## The vertical position of the skip indicator.
|
||||
define gui.skip_ypos = 15
|
||||
@@ -389,17 +389,17 @@ define gui.nvl_name_width = 225
|
||||
define gui.nvl_name_xalign = 1.0
|
||||
|
||||
## The position, width, and alignment of the dialogue text.
|
||||
define gui.nvl_text_xpos = 675
|
||||
define gui.nvl_text_ypos = 12
|
||||
define gui.nvl_text_width = 885
|
||||
define gui.nvl_text_xalign = 0.0
|
||||
define gui.nvl_text_xpos = 1400
|
||||
define gui.nvl_text_ypos = 40
|
||||
define gui.nvl_text_width = 1000
|
||||
define gui.nvl_text_xalign = 1.0
|
||||
|
||||
## The position, width, and alignment of nvl_thought text (the text said by the
|
||||
## nvl_narrator character.)
|
||||
define gui.nvl_thought_xpos = 360
|
||||
define gui.nvl_thought_ypos = 0
|
||||
define gui.nvl_thought_width = 1170
|
||||
define gui.nvl_thought_xalign = 0.0
|
||||
define gui.nvl_thought_xalign = 1.0
|
||||
|
||||
## The position of nvl menu_buttons.
|
||||
define gui.nvl_button_xpos = 675
|
||||
|
||||
BIN
game/gui.rpyc
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 904 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 1.0 MiB |
BIN
game/gui/nvl.png
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 50 KiB |
BIN
game/images/akai angry.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
game/images/akai excited.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
game/images/akai focus.png
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
game/images/akai happy stress.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
BIN
game/images/akai happy.png
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
game/images/akai happyclosed.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
game/images/akai laugh.png
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
game/images/akai serious stress.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
game/images/akai serious.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
game/images/akai stress.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
game/images/akai surprised.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
game/images/akai think.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
game/images/akai.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
game/images/aoi angry.png
Normal file
|
After Width: | Height: | Size: 134 KiB |
BIN
game/images/aoi embarrased.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
BIN
game/images/aoi excited.png
Normal file
|
After Width: | Height: | Size: 134 KiB |
BIN
game/images/aoi happy.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
game/images/aoi laugh.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
game/images/aoi sad.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
game/images/aoi smug.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
game/images/aoi surprised.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
game/images/aoi think.png
Normal file
|
After Width: | Height: | Size: 134 KiB |
BIN
game/images/aoi worry.png
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
game/images/aoi.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
game/images/aoi2024.png
Normal file
|
After Width: | Height: | Size: 668 KiB |
BIN
game/images/bg_amaidol_crowd.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
game/images/bg_amaidol_stage.png
Normal file
|
After Width: | Height: | Size: 620 KiB |
BIN
game/images/bg_cafeteria.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
game/images/bg_con_booth_1.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
game/images/bg_con_booths.png
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
game/images/bg_con_entrance.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
game/images/bg_con_info.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
game/images/bg_con_stairs.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
game/images/bg_contest_crowd.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
game/images/bg_contest_outside.png
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
game/images/bg_contest_stage.png
Normal file
|
After Width: | Height: | Size: 780 KiB |
BIN
game/images/bg_contest_stage_front.png
Normal file
|
After Width: | Height: | Size: 322 KiB |
BIN
game/images/bg_cosplay_fix.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 834 KiB |
BIN
game/images/bg_inside_train_2.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
game/images/bg_lecture.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
game/images/bg_staff_hallway.png
Normal file
|
After Width: | Height: | Size: 884 KiB |
BIN
game/images/bg_staff_room.png
Normal file
|
After Width: | Height: | Size: 631 KiB |
BIN
game/images/bg_stage_back.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
game/images/bg_stage_empty.png
Normal file
|
After Width: | Height: | Size: 507 KiB |