From 58e6efc8f6496f15a400438ea13cb7a2d51f5609 Mon Sep 17 00:00:00 2001 From: progre Date: Fri, 17 Nov 2023 06:58:11 +0900 Subject: [PATCH] v0.7.0 --- .github/workflows/main.yml | 81 +++++++++++++------- Cargo.lock | 24 +++--- Cargo.toml | 2 +- README.ja.md | 110 +++++++++++++++++++++++++++ README.md | 148 ++++++++++++++++++++++--------------- 5 files changed, 266 insertions(+), 99 deletions(-) create mode 100644 README.ja.md diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f27fa3f..59a25b4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,12 +22,14 @@ jobs: with: path: target key: cargo-build-target-${{ hashFiles('**/Cargo.lock') }} - - shell: bash + - name: Init Rust + shell: bash run: | rustup default nightly rustup target add i686-pc-windows-msvc cargo install cargo-bundle-licenses - - shell: bash + - name: Build + shell: bash run: | cargo build --locked --release --workspace cargo bundle-licenses --format yaml --output THIRDPARTY.yml @@ -44,7 +46,29 @@ jobs: with: name: artifact-windows path: ./artifact - build-linux: + release-windows: + needs: build-windows + if: startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + env: + FILENAME: ${{ github.event.repository.name }}_${{ github.ref_name }}.zip + RELEASE_NAME: Ju.N.Owen + steps: + - uses: actions/download-artifact@v3 + with: + name: artifact-windows + path: ./artifact + - name: Zip + run: | + cd artifact + zip ../${{ env.FILENAME }} d3d9.dll modules/th19_junowen.dll LICENSE README.md THIRDPARTY.yml + - name: Release + uses: softprops/action-gh-release@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + name: ${{ env.RELEASE_NAME }} ${{ github.ref_name }} + files: ${{ env.FILENAME }} + build-server: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -60,7 +84,7 @@ jobs: with: path: target key: cargo-build-target-${{ hashFiles('**/Cargo.lock') }} - - shell: bash + - name: Init Rust env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} @@ -75,34 +99,37 @@ jobs: aws_secret_access_key = $AWS_SECRET_ACCESS_KEY region = ap-northeast-1 EOF - - shell: bash + - name: Build & Deploy dev run: | cargo lambda build --locked --package junowen-server --release cargo lambda deploy --binary-name junowen-server junowen-server-dev - release-windows: - needs: build-windows + - uses: actions/upload-artifact@v3 + with: + name: artifact-server + path: ./target/lambda + release-server: + needs: build-server if: startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-latest - env: - RELEASE_NAME: Ju.N.Owen steps: - - uses: actions/download-artifact@v2 - name: artifact-windows - - run: | - cd artifact - zip ../out d3d9.dll modules/th19_junowen.dll LICENSE README.md THIRDPARTY.yml - - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/checkout@v3 + - uses: actions/download-artifact@v3 with: - tag_name: ${{ github.ref }} - release_name: ${{ env.RELEASE_NAME }} ${{ github.ref }} - - uses: actions/upload-release-asset@v1 + name: artifact-server + path: ./target/lambda + - name: Init Rust env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./out.zip - asset_name: ${{ github.event.repository.name }}_${{ github.ref_name }}.zip - asset_content_type: application/zip + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + run: | + pip3 install cargo-lambda + mkdir ~/.aws + cat < ~/.aws/config + [default] + aws_access_key_id = $AWS_ACCESS_KEY_ID + aws_secret_access_key = $AWS_SECRET_ACCESS_KEY + region = ap-northeast-1 + EOF + - name: Deploy + run: | + cargo lambda deploy --binary-name junowen-server junowen-server diff --git a/Cargo.lock b/Cargo.lock index 02c1909..5cef804 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1618,7 +1618,7 @@ dependencies = [ [[package]] name = "junowen" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "async-trait", @@ -1644,7 +1644,7 @@ dependencies = [ [[package]] name = "junowen-lib" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "async-trait", @@ -1674,7 +1674,7 @@ dependencies = [ [[package]] name = "junowen-server" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "async-trait", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "th19loader" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "junowen-lib", @@ -3007,7 +3007,7 @@ dependencies = [ [[package]] name = "th19netdelayemulate" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "bytes", @@ -3018,7 +3018,7 @@ dependencies = [ [[package]] name = "th19onlinevsfix" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "junowen-lib", @@ -3027,7 +3027,7 @@ dependencies = [ [[package]] name = "th19padlight" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "junowen-lib", @@ -3036,7 +3036,7 @@ dependencies = [ [[package]] name = "th19replayplayer" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "bytes", @@ -3048,7 +3048,7 @@ dependencies = [ [[package]] name = "th19replayplayer-lib" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "bytes", @@ -3059,7 +3059,7 @@ dependencies = [ [[package]] name = "th19replayrecorder" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "bytes", @@ -3071,7 +3071,7 @@ dependencies = [ [[package]] name = "th19savesettingsseparately" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "junowen-lib", @@ -3080,7 +3080,7 @@ dependencies = [ [[package]] name = "th19seed" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "junowen-lib", diff --git a/Cargo.toml b/Cargo.toml index fcb7bd7..a58e15e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ default-members = ["junowen"] resolver = "2" [workspace.package] -version = "0.6.0" +version = "0.7.0" authors = ["Progre"] license = "GPL-3.0" diff --git a/README.ja.md b/README.ja.md new file mode 100644 index 0000000..788fd61 --- /dev/null +++ b/README.ja.md @@ -0,0 +1,110 @@ +# Ju.N.Owen + +東方獣王園の非公式オンライン対戦ツールです。 + +非公式のツールです。**自己責任で使用してください。** + +公式のオンライン対戦のマッチングや同期機構とは異なる、独自の仕組みでオンライン対戦を実現します。 +adonis や th075caster と同じような仕組みで動作します。 + + +## 特徴 + +* 公式のオンライン対戦よりもずれにくい +* ゲーム中にディレイを変更できる +* サーバーなしでも接続できる +* 観戦ができる + + +## インストール方法 + +1. zip ファイルを展開し、d3d9.dll と、modules フォルダーの中に th19_junowen.dll があることを確認します。 +2. 獣王園のインストールフォルダーを開きます。 +3. 獣王園のインストールフォルダーに d3d9.dll と modules フォルダーを移動します。 +4. 獣王園を起動します。 +5. うまくいけば獣王園のタイトル画面の項目に「Ju.N.Owen」が追加されます。 + + +## 使い方 + +現在2つの接続方法をサポートしています。 + +### Shared Room (共用ルーム) + +設定したルーム名と一致するユーザーと接続する方式です。 + +1. 「Online VS Mode」でルーム名を設定します。 +2. 「Ju.N.Owen」→「Shared Room」を選択します。 +3. 「Enter」の状態でショットボタンを押すと、接続の待ち受けが開始されます。 + * 「Leave」の状態でショットボタンを押すと、接続待ちが中断されます。 + * キャンセルボタンを押すと接続待ちのまま他の機能を使用できます。 + +### Pure P2P (サーバーを介さない接続) + +接続サーバーを使わず、チャットなどで対戦相手と接続情報を交換する方式です。 + +1. 「Ju.N.Owen」→「Pure P2P」を選択します。 +2. ホストとして接続を待ち受ける場合は「Connect as Host」を、 + ゲストとして接続する場合は「Connect as Guset」を選択します。 + * ホスト + 1. `********` という長い文字列が表示され、自動的にクリップボードにコピーされるので、 + この文字列を Discord 等を使って対戦相手に送信してください。 + 「Copy your code」を選択すると再度クリップボードにコピーされます。 + 2. 対戦相手から `********` という文字列を受け取り、 + クリップボードにコピーしてください。 + 3. 「Paste guest's code」を選択してください。 + 4. うまくいけば難易度選択に遷移し、対戦が開始されます。 + * ゲスト + 1. 対戦相手から `********` という文字列を受け取り、クリップボードにコピーしてください。 + 2. ショットボタンを押すと、クリップボードの内容が入力されます。 + 3. `********` という長い文字列が表示され、自動的にクリップボードにコピーされるので、 + この文字列を Discord 等を使って対戦相手に送信してください。 + ショットボタンを押すと再度クリップボードにコピーされます。 + 4. うまくいけば難易度選択に遷移し、対戦が開始されます。 + +### 接続後 + +* 接続中はお互いの名前が画面上部に表示されます。切断されると表示が消えます。 +* ホストはゲーム中に数字キーの0-9でディレイ値を変更できます。 + +### 観戦機能 + +現在は Pure P2P でのみ観戦が可能です。 + +* 観戦者 + 1. 「Ju.N.Owen」→「Pure P2P」→「Connect as Spectator」を選択します。 + 2. `********` という長い文字列が表示され、自動的にクリップボードにコピーされるので、 + この文字列を Discord 等を使ってプレイヤーのどちらかに送信してください。 + 「Copy your code」を選択すると再度クリップボードにコピーされます。 + 3. プレイヤーから `********` という文字列を受け取り、 + クリップボードにコピーしてください。 + 4. 「Paste guest's code」を選択してください。 + 5. うまくいけば観戦が開始されます。 + 6. ポーズボタンを押すと観戦を中止します。 +* プレイヤー + 1. Ju.N.Owen の対戦機能で対戦相手と接続し、難易度選択で待機します。 + 2. 観戦者から `********` という文字列を受け取り、クリップボードにコピーしてください。 + 3. F1 キーを押すと、クリップボードの内容が入力されます。 + 4. `********` という長い文字列が表示され、自動的にクリップボードにコピーされるので、 + この文字列を Discord 等を使って対戦相手に送信してください。 + 5. うまくいけば観戦が開始されます。 + + +## 補足 + +* ポート開放は必要ありません。開放してあってもそのポートを指定することはできません。 + + +## 現在の制約 + +* 「Online VS Mode」が解放されていないと正しく動作しません。 +* 観戦者の追加はプレイヤーの接続直後のみ可能です。 +* 観戦者の受け入れはプレイヤー一人につき1人のみです。 +* 通信が遅延したり良くないことが起きるとゲームがフレーズすることがあります。 + + +## 作者と配布元 + +[ぷろぐれ](https://bsky.app/profile/progre.me) + +https://github.com/progre/junowen diff --git a/README.md b/README.md index 65931cc..0032a3c 100644 --- a/README.md +++ b/README.md @@ -1,82 +1,112 @@ -# Ju. N. Owen +[日本語のドキュメントはこちら](./README.ja.md) -東方獣王園の非公式オンライン対戦ツールです。 +# Ju.N.Owen -非公式のツールです。**自己責任で使用してください。** +This is an unofficial online battle tool for Touhou Juuouen ~ Unfinished Dream of All Living Ghost (Touhou 19 UDoALG). -公式のオンライン対戦のマッチングや同期機構とは異なる、独自の仕組みでオンライン対戦を実現します。 -adonis や th075caster と同じような仕組みで動作します。 +It is an unofficial tool. **Use at your own risk**. +This tool realizes online battles with its own mechanism, which is different from the matching and synchronization mechanism of official online battles. +It works in the same way as adonis and th075caster. -## 特徴 -- 公式のオンライン対戦よりもずれにくい -- ゲーム中にディレイを変更できる -- サーバーなしで接続できる -- 観戦ができる +## Features +* Less likely to be out of alignment than official online battles +* Delay can be changed during the game +* Can be connected without a server +* Can spectate the game -## 使用方法 -現在マッチングサーバーは未実装なので、チャットなどで対戦相手と接続情報を交換する必要があります。 +## How to install -1. zip ファイルを展開し、d3d9.dll と、modules フォルダーの中に th19_junowen.dll があることを確認します。 -2. 獣王園のフォルダーに d3d9.dll と modules フォルダーを移動します。 -3. 獣王園を起動します。 -4. 上手くいくと獣王園のタイトル画面の項目に「Ju.N.Owen」が追加されるので、それを選択します。 -5. ホストとして接続を待ち受ける場合は「Connect as Host」を、 - ゲストとして接続する場合は「Connect as Guset」を選択します。 - - ホスト - 1. `********` という長い文字列が表示され、自動的にクリップボードにコピーされるので、 - この文字列を Discord 等を使って対戦相手に送信してください。 - 「Copy your code」を選択すると再度クリップボードにコピーされます。 - 2. 対戦相手から `********` という文字列を受け取り、 - クリップボードにコピーしてください。 - 3. 「Paste guest's code」を選択してください。 - 4. うまくいけば難易度選択に遷移し、対戦が開始されます。 - - ゲスト - 1. 対戦相手から `********` という文字列を受け取り、クリップボードにコピーしてください。 - 2. 決定ボタンを押すと、クリップボードの内容が入力されます。 - 3. `********` という長い文字列が表示され、自動的にクリップボードにコピーされるので、 - この文字列を Discord 等を使って対戦相手に送信してください。 - 決定ボタンを押すと再度クリップボードにコピーされます。 - 4. うまくいけば難易度選択に遷移し、対戦が開始されます。 -4 ホストはゲーム中に数字キーの0-9でディレイを変更できます。 +1. Extract the zip file and make sure you have d3d9.dll and th19_junowen.dll in the modules folder. +2. Open the Touhou 19 installation folder. +3. Move d3d9.dll and the modules folder into Touhou 19 folder. +4. Start Touhou 19. +5. If all goes well, "Ju.N.Owen" will be added as an item on the title screen of Touhou 19. -### 観戦 +## How to use -- 観戦者 - 1. 「Connect as Spectator」を選択します。 - 2. `********` という長い文字列が表示され、自動的にクリップボードにコピーされるので、 - この文字列を Discord 等を使ってプレイヤーのどちらかに送信してください。 - 「Copy your code」を選択すると再度クリップボードにコピーされます。 - 3. プレイヤーから `********` という文字列を受け取り、 - クリップボードにコピーしてください。 - 4. 「Paste guest's code」を選択してください。 - 5. うまくいけば観戦が開始されます。 - 6. ポーズボタンを押すと観戦を中止します。 -- プレイヤー - 1. Ju.N.Owen の対戦機能で対戦相手と接続し、難易度選択で待機します。 - 2. 観戦者から `********` という文字列を受け取り、クリップボードにコピーしてください。 - 3. F1 キーを押すと、クリップボードの内容が入力されます。 - 4. `********` という長い文字列が表示され、自動的にクリップボードにコピーされるので、 - この文字列を Discord 等を使って対戦相手に送信してください。 - 5. うまくいけば観戦が開始されます。 +Two connection methods are currently supported. +### Shared Room -### 補足 +This method connects with users whose room names match. -- ポート開放は必要ありません。開放してあってもそのポートを指定することはできません。 +1. Set the room name in "Online VS Mode". +2. Select "Ju.N.Owen" -> "Shared Room". +3. Press the shot button with "Enter" to start waiting for connection. + * Pressing the shot button while in the "Leave" state interrupts the connection waiting. + * Press the Cancel button to use other functions while waiting for connection. +### Pure P2P -## 現在の制約 +This method does not use a connection server, but exchanges connection information with opponents via chat or other means. -- 観戦者の追加はプレイヤーの接続直後のみ可能です。 -- 観戦者の受け入れはプレイヤー一人につき1人のみです。 -- 通信が遅延したり良くないことが起きるとゲームがフレーズすることがあります。 +1. Select "Ju.N.Owen" -> "Pure P2P”. +2. Select "Connect as Host" if you want to wait for a connection as a host, + Select "Connect as Guset" to connect as a guest. + * Host + 1. A long string `********` will be displayed and automatically copied to the clipboard, + Send this string to your opponent using Discord or other means. + Select "Copy your code" to copy it to the clipboard again. + 2. Receive the string `********` from your opponent, + Copy it to the clipboard. + 3. Select "Paste guest's code". + 4. If all goes well, you will be redirected to the difficulty selection and the game will begin. + * Guest + 1. Receive the string `********` from your opponent and copy it to the clipboard. + 2. Press the shot button to enter the clipboard contents. + 3. Take the long string `********` and automatically copy it to the clipboard, + Send this string to your opponent via Discord or other means. + Press the shot button to copy the string to the clipboard again. + 4. If all goes well, you will be redirected to the difficulty selection screen and the game will begin. +### After connection -## 配布元 +* During the connection, the names of both parties are displayed at the top of the screen. When disconnected, the display will disappear. +* The host can change the delay value with the number keys 0-9 during the game. + +### Spectate + +Currently, the game can only be watched via Pure P2P. + +* Spectator + 1. Select “Ju.N.Owen" -> "Pure P2P” -> "Connect as Spectator" + 2. A long string `********` will be displayed and automatically copied to the clipboard, + Send this string to one of the players via Discord or other means. + Select "Copy your code" to copy it to the clipboard again. + 3. Receive the string `********` from the player, + copy it to the clipboard. + 4. Select "Paste guest's code" + 5. If all goes well, the game will start. + 6. Press the pause button to stop the spectating. +* Player + 1. Connect to the opponent via Ju.N.Owen's match function and wait for the difficulty level selection. + 2. receive the string `********` from the spectator and copy it to the clipboard + 3. Press the F1 key to enter the clipboard contents. + 4. Take the long string `********` and automatically copy it to the clipboard, + Send this string to your opponent via Discord or other means. + 5. If all goes well, you can let them spectate the game. + + +## Supplement + +* No ports need to be open. Even if a port is open, that port cannot be specified. + + +## Current constraints + +* "Online VS Mode" must be released for the game to work properly. +* Spectators can only be added immediately after a player connects. +* Only one spectator can be accepted per player. +* The game may be freeze if communication is delayed or something not good happens. + + +## Author and distributor + +[Progre](https://bsky.app/profile/progre.me) https://github.com/progre/junowen