procon_bypass_man 0.1.21 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +9 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +7 -0
  5. data/Gemfile.lock +1 -1
  6. data/README.md +4 -1
  7. data/docs/getting_started.md +68 -4
  8. data/docs/setting/left-analogstick-cap.md +1 -1
  9. data/docs/setting/splatoon2_macro_dasei_cancel.md +4 -0
  10. data/docs/setting/splatoon2_macro_sokuwari_bubble.md +4 -0
  11. data/docs/setting/splatoon2_shake_tansan.md +47 -0
  12. data/lib/procon_bypass_man/background/jobs/post_completed_remote_macro_job.rb +17 -0
  13. data/lib/procon_bypass_man/background.rb +1 -0
  14. data/lib/procon_bypass_man/buttons_setting_configuration/layer.rb +142 -80
  15. data/lib/procon_bypass_man/buttons_setting_configuration/loader.rb +2 -0
  16. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/button.rb +28 -0
  17. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/button_list.rb +31 -0
  18. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/disable_macro_if_pressed.rb +28 -0
  19. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/flip_if_pressed.rb +31 -0
  20. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/force_neutral.rb +28 -0
  21. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/if_pressed.rb +26 -0
  22. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/if_pressed_allows_nil.rb +28 -0
  23. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/open_macro_steps.rb +26 -0
  24. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer.rb +17 -0
  25. data/lib/procon_bypass_man/buttons_setting_configuration.rb +5 -4
  26. data/lib/procon_bypass_man/bypass/usb_hid_logger.rb +4 -0
  27. data/lib/procon_bypass_man/configuration.rb +8 -1
  28. data/lib/procon_bypass_man/device_connector.rb +1 -4
  29. data/lib/procon_bypass_man/device_procon_finder.rb +0 -2
  30. data/lib/procon_bypass_man/domains/analog_stick_position.rb +18 -0
  31. data/lib/procon_bypass_man/domains/binary/processing_procon_binary.rb +6 -1
  32. data/lib/procon_bypass_man/domains.rb +1 -0
  33. data/lib/procon_bypass_man/plugin/splatoon2/macro/charge_tansan_bomb.rb +21 -0
  34. data/lib/procon_bypass_man/plugin/splatoon2/version.rb +1 -1
  35. data/lib/procon_bypass_man/plugins.rb +1 -0
  36. data/lib/procon_bypass_man/procon/analog_stick_cap.rb +4 -23
  37. data/lib/procon_bypass_man/procon/analog_stick_manipulator.rb +36 -0
  38. data/lib/procon_bypass_man/procon/layer_changer.rb +4 -1
  39. data/lib/procon_bypass_man/procon/macro.rb +5 -2
  40. data/lib/procon_bypass_man/procon/macro_builder.rb +15 -17
  41. data/lib/procon_bypass_man/procon/macro_plugin_map.rb +23 -0
  42. data/lib/procon_bypass_man/procon/macro_registry.rb +21 -10
  43. data/lib/procon_bypass_man/procon/user_operation.rb +29 -15
  44. data/lib/procon_bypass_man/procon.rb +19 -5
  45. data/lib/procon_bypass_man/remote_macro/queue_over_process.rb +62 -0
  46. data/lib/procon_bypass_man/remote_macro/remote_macro_object.rb +30 -0
  47. data/lib/procon_bypass_man/remote_macro/remote_macro_receiver.rb +37 -0
  48. data/lib/procon_bypass_man/remote_macro/remote_macro_sender.rb +8 -0
  49. data/lib/procon_bypass_man/remote_macro/task.rb +6 -0
  50. data/lib/procon_bypass_man/remote_macro/task_queue.rb +13 -0
  51. data/lib/procon_bypass_man/remote_macro.rb +14 -0
  52. data/lib/procon_bypass_man/remote_pbm_action/value_objects/remote_pbm_action_object.rb +1 -1
  53. data/lib/procon_bypass_man/remote_pbm_action.rb +1 -0
  54. data/lib/procon_bypass_man/runner.rb +5 -1
  55. data/lib/procon_bypass_man/support/remote_macro_http_client.rb +9 -0
  56. data/lib/procon_bypass_man/usb_device_controller.rb +0 -2
  57. data/lib/procon_bypass_man/version.rb +1 -1
  58. data/lib/procon_bypass_man/websocket/{pbm_job_client.rb → client.rb} +31 -6
  59. data/lib/procon_bypass_man.rb +11 -2
  60. data/procon_bypass_man.gemspec +1 -1
  61. data/project_template/app.rb +1 -1
  62. metadata +27 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 44670b11efa75a8b57df0580f3c796d65419ec87914d8458ab0fc426527fb58b
4
- data.tar.gz: 883add3b8224f5490ba62ab2caabbb42b251a86197080bb7f8d3f219c89d465c
3
+ metadata.gz: f213faf13081ece91f62fb64af88e63672d035d29740b9c98c832f89921d8f9d
4
+ data.tar.gz: 3ec15d612dfaa91b085fef0a9e8810625b79b3a2a0781c57a56a39cc0b2d6be4
5
5
  SHA512:
6
- metadata.gz: f9cf91dc93c58559217332670431f901a7eae8923476b26e63aca0908f52e3bdea1122df4fe00f533e80e556f91caa173c52dc27661c9ced4049fd7cbbc8f712
7
- data.tar.gz: 17cf3cdaa06556ca4debb6ab7697a6946b6de69d197b8f9f217c1bd0786aa525c2fd8fb673ad81df089c08689bc8b238d1d8fbdea1b9c41a55684b32bca970db
6
+ metadata.gz: 3570d9025f546e14e13b441a60568d58ec2ae728805061f7152c34e544e142a5c75ac37e893af96cafa5c956a8063eff41ddf6585b044c87e003e1ea4ba1902d
7
+ data.tar.gz: 4a1dceca2806e28ac8cb9ca859f82adc5dc09ce9071c743df0ee7d4e2a4f761386a43057660f930d4d105c3898ba48496658c6a7eb3e86fc2d60e86f0df5cd8d
data/.circleci/config.yml CHANGED
@@ -34,6 +34,14 @@ commands: &commands
34
34
  - vendor/bundle
35
35
 
36
36
  jobs:
37
+ check_pbm_version:
38
+ executor:
39
+ name: ruby
40
+ tag: 3.0.1
41
+ steps:
42
+ - checkout
43
+ - run: GEM_VERSION=$(grep -o -E '[0-9.]+' lib/procon_bypass_man/version.rb) && GEM_VERSION_IN_BUNDER=$(grep procon_bypass_man project_template/app.rb | grep -o -E '[0-9.]+') && test "$GEM_VERSION" = "$GEM_VERSION_IN_BUNDER"
44
+
37
45
  syntax_check:
38
46
  parameters:
39
47
  ruby-version:
@@ -92,6 +100,7 @@ jobs:
92
100
  - run: bundle exec rspec
93
101
 
94
102
  build_jobs: &build_jobs
103
+ - check_pbm_version
95
104
  - syntax_check:
96
105
  matrix:
97
106
  parameters:
data/.gitignore CHANGED
@@ -13,3 +13,4 @@ todo.local.md
13
13
  pbm_pid
14
14
  setting.yml
15
15
  device_id
16
+ /procon
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [0.1.22] - 2022-04-09
2
+ * スティックを左右に入れるマクロが使えるようになりました
3
+ * スプラトゥーン2でのタンサンボムのチャージに使えます
4
+ * 例: `open_macro :shake, steps: [:shake_left_stick_and_toggle_b_for_0_1sec], if_pressed: [:b, :r], force_neutral: [:b]`
5
+ * pbm-cloudからmacroを発火させる機能に対応しました
6
+ * 設定ファイルで不備があったときに警告が表示されるようになりました
7
+
1
8
  ## [0.1.21] - 2022-03-03
2
9
  - install_macro_pluginしていないマクロをlayer内で使うとクラッシュしていた問題を修正しました
3
10
  - 数十時間起動しっぱなしだとpbm-cloudとのwebsocketの接続が切断される問題を修正しました
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- procon_bypass_man (0.1.21)
4
+ procon_bypass_man (0.1.22)
5
5
  action_cable_client
6
6
  pbmenv (>= 0.1.9)
7
7
  sorted_set
data/README.md CHANGED
@@ -9,10 +9,13 @@
9
9
  * ドキュメントは [getting_started.md](docs/getting_started.md) にまとめています
10
10
  * https://pbm-cloud.herokuapp.com を使うと、webだけで運用が可能です
11
11
 
12
- ![image](https://user-images.githubusercontent.com/1664497/123414210-942f6980-d5ee-11eb-8192-955bd9e37e0b.png)
12
+
13
+ <img width="880" alt="スクリーンショット 2022-04-02 9 10 38" src="https://user-images.githubusercontent.com/1664497/161356057-71e4bc2a-0217-4434-9bf1-0002b9fb261a.png">
14
+
13
15
 
14
16
 
15
17
  <!--
18
+ ![image](https://user-images.githubusercontent.com/1664497/123414210-942f6980-d5ee-11eb-8192-955bd9e37e0b.png)
16
19
  ```
17
20
  @startuml
18
21
  ProController \-\-> (PBM): ZR押しっぱなし
@@ -9,9 +9,9 @@
9
9
  * [pbmenvを使う方法](#pbmenvを使う方法)
10
10
  * [pbmenvを使わない方法](#pbmenvを使わない方法)
11
11
  * [普段使いをするためのセットアップ](#普段使いをするためのセットアップ)
12
- * レイヤー
12
+ * [レイヤー](#レイヤー)
13
13
  * モード
14
- * マクロ
14
+ * [マクロ](#マクロ)
15
15
  * [左スティックの感度調整](#左スティックの感度調整)
16
16
  * 設定ファイルの書き方
17
17
  * プラグインの書き方
@@ -87,13 +87,77 @@ pbmenvを使っていない場合は、 https://github.com/splaplapla/procon_byp
87
87
  ゲームをやめたくなったらSwitchはそのままスリープに入って問題ないです。このときにRaspberry Piも一緒に電源が切れてしまいますが故障することはありません。
88
88
 
89
89
  ## レイヤー
90
- * 後で書きます
90
+ あらかじめレイヤーごとにキーの配置を設定しておき、用途に応じてレイヤーを切り替えることで違うキーが入力できるという機能です。
91
+ レイヤーは、up, down, left, rightの4つあります。 設定ファイルの書いている `prefix_keys_for_changing_layer` を押しながら、十字キーのup, down, left, rightのどれかを押すと、レイヤーを変更することができます。
92
+
93
+ レイヤー毎の定義方法は、 `layer` ブロックで囲って定義します。
94
+ 以下の例は、upレイヤーとleftレイヤーだけに設定が書かれています。ゲーム進行状況によってレイヤーを切り替えてください。
95
+ 初期レイヤーは、 up です。
96
+
97
+ ```ruby
98
+ layer :up do
99
+ flip :a, if_pressed: [:a]
100
+ end
101
+
102
+ layer :right do
103
+ end
104
+
105
+ layer :left do
106
+ flip :zr, if_pressed: :zr, force_neutral: :zl
107
+ end
108
+
109
+ layer :down do
110
+ end
111
+ ```
91
112
 
92
113
  ## モード
93
114
  * 後で書きます
94
115
 
95
116
  ## マクロ
96
- * 後で書きます
117
+
118
+ 決まった入力を繰り返し実行できる機能を「マクロ」と呼んでいます。
119
+ スプラトゥーンであれば、バブル即割の操作や、試合中の味方へのスーパージャンプもマクロ経由で入力できます。
120
+
121
+ マクロの実態はただの文字列で`toggle_r_for_0_2sec` や `toggle_r_for_1sec`といった時間指定もできますし、`[:x, :down, :a, :a]` のような1文字のずつの入力も可能です。
122
+ マクロを設定ファイルに定義するには、「プラグイン」か設定ファイルへ直接を記述する「open_macro」のどちらかで行えます。
123
+
124
+ 「プラグイン」を使用する場合は、マクロの詳細を記述する必要がなく、PBMのバージョンアップとともに改善が入る可能性があります。
125
+ open_macroは、マクロの詳細を設定ファイルに直書きするため、設定ファイルが複雑になる可能性がある反面、柔軟なマクロを定義することができます。
126
+ プラグインで提供されているマクロがあれば、それを使うことをお勧めします。
127
+ プラグインの詳細な設定方法については、 [バブル即割マクロの設定方法](/docs/setting/splatoon2_macro_sokuwari_bubble.md) を参考にしてください。
128
+
129
+ 次はマクロの入力に使えるコマンド(ステップ)の紹介をします。
130
+ マクロに使えるボタンは以下の通りです。
131
+
132
+ ```
133
+ y, x, b, a, sl, sr, r, zr, minus, plus, thumbr, thumbl, home, cap, down, up, right, left, l, zl
134
+ ```
135
+
136
+ マクロの形式には、1ボタンずつ入力する「バージョン1」と時間指定のできる「バージョン2」があります。
137
+ バージョン1は、 `[:x, :y, :up]` と記述すると、x, y, 十字キーの上ボタンを順番に入力します。バージョン1では実行時間を指定することはできません。
138
+
139
+ バージョン2では、 複数のボタンを同時に、時間を指定して「連打」「押しっぱなし」「無操作」ができます。
140
+ 連打はtoggleで、押しっぱなしはpressing, 無操作は、waitというキーワードを使います。
141
+ 複数のボタンを同時押しの場合は、andで繋ぎます。Xボタンを押しっぱなしにして、ZRボタンを連打する場合は `pressing_x_and_toggle_zr` と記述します。
142
+ これに時間を指定をする場合は、forで繋ぎます。 `pressing_x_and_toggle_zr_for_1sec` となります。
143
+ 時間指定には1秒未満も設定することができ、`wait_for_0_65sec` と記述すると、0.65秒間無操作となります。次はいくつか実例を紹介します。
144
+
145
+ * toggle_r_for_0_2sec
146
+ * 0.2秒間Rボタンを連打
147
+ * wait_for_0_65sec
148
+ * 0.65秒間無操作
149
+ * pressing_x_and_pressing_zr_for_0_2sec
150
+ * XボタンとZRボタンを0.2秒間押しっぱなし
151
+ * toggle_x_and_toggle_zr_for_0_2sec
152
+ * XボタンとZRボタンを0.2秒間連打
153
+
154
+ 上述したマクロ(ステップ)は、open_macroで記述できます。次は実際の記述例です。
155
+
156
+ ```
157
+ open_macro :sokuwari, steps: [:toggle_r_for_0_2sec, :toggle_thumbr_for_0_14sec, :toggle_thumbr_and_toggle_zr_for_0_34sec, :toggle_r_for_1sec], if_pressed: [:zl, :right]
158
+ ```
159
+
160
+ わからないことがあればdiscordで何でも質問してください。
97
161
 
98
162
  ## 左スティックの感度調整
99
163
  [左スティックの感度調整](/docs/setting/left-analogstick-cap.md)
@@ -38,7 +38,7 @@ https://user-images.githubusercontent.com/1664497/150636857-f3d40900-2713-41b8-8
38
38
  * setting.ymlのシンタックスが正しければ、switchとの接続が継続したままsetting.ymlの内容を読み込んでいるはずです
39
39
 
40
40
  ```shell
41
- sudo kill -USR2 `cat ./pbm_pid`
41
+ sudo kill -USR2 `cat ./pbm_pid`
42
42
  ```
43
43
 
44
44
  ## まとめ
@@ -44,6 +44,10 @@ end
44
44
  * 書き換えたsetting.ymlを、起動中のprocon_bypass_manプロセスへ即時反映するには、procon_bypass_manプロセスを動かしたまま、別のshellから 以下をを実行してください
45
45
  * setting.ymlのシンタックスが正しければ、switchとの接続が継続したままsetting.ymlの内容を読み込んでいるはずです
46
46
 
47
+ ```shell
48
+ sudo kill -USR2 `cat ./pbm_pid`
49
+ ```
50
+
47
51
  ## 設定例1
48
52
  ```yaml
49
53
  version: 1.0
@@ -20,6 +20,10 @@ https://user-images.githubusercontent.com/1664497/152633205-ab44896b-9fa4-402c-b
20
20
  * 書き換えたsetting.ymlを、起動中のprocon_bypass_manプロセスへ即時反映するには、procon_bypass_manプロセスを動かしたまま、別のshellから 以下をを実行してください
21
21
  * setting.ymlのシンタックスが正しければ、switchとの接続が継続したままsetting.ymlの内容を読み込んでいるはずです
22
22
 
23
+ ```shell
24
+ sudo kill -USR2 `cat ./pbm_pid`
25
+ ```
26
+
23
27
  ## まとめ
24
28
  * 次の2行の追加が必要です。
25
29
  * `install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::SokuwariForSplashBomb`
@@ -0,0 +1,47 @@
1
+ # スプラトゥーン2: タンサンボムを貯めるマクロの設定方法
2
+
3
+ https://user-images.githubusercontent.com/1664497/160649435-52b084ed-05b0-4c58-88ba-667b5f256405.mp4
4
+
5
+ * procon_bypass_man: 0.1.22以上が必要です
6
+ * このマクロは、スティックの左右に入れつつ、Bボタンを連打します
7
+ * タンサンボムを貯めるのに使います
8
+
9
+ ## 1. layer内にopen_macroを記述します
10
+ * `setting.yml` のlayer内に`open_macro :shake, steps: [:shake_left_stick_and_toggle_b_for_0_1sec], if_pressed: [:b, :r], force_neutral: [:b]` と書きます
11
+ * タンサンボムは、スティックの動きとBボタンでもチャージすることができるので、RボタンとBボタンを同時押ししたときに、発動するようにしています。
12
+
13
+ ## 2. 設定を反映させる
14
+ * 上記の記述を加えたsetting.ymlを起動中のprocon_bypass_manプロセスで読み込むには、プロセスにその旨を伝える必要があります
15
+ * ラズベリーパイを再起動して、プロセスを立ち上げ直す、でも目的は達成できますが、もっと簡単にsetting.ymlを再読み込みする必要があります
16
+ * 書き換えたsetting.ymlを、起動中のprocon_bypass_manプロセスへ即時反映するには、procon_bypass_manプロセスを動かしたまま、別のshellから 以下をを実行してください
17
+ * setting.ymlのシンタックスが正しければ、switchとの接続が継続したままsetting.ymlの内容を読み込んでいるはずです
18
+
19
+ ```shell
20
+ sudo kill -USR2 `cat ./pbm_pid`
21
+ ```
22
+
23
+ ## 設定例1
24
+ ```yaml
25
+ version: 1.0
26
+ setting: |-
27
+ prefix_keys_for_changing_layer [:zr, :zl, :l]
28
+
29
+ layer :up do
30
+ open_macro :shake, steps: [:shake_left_stick_and_toggle_b_for_0_1sec], if_pressed: [:b, :r], force_neutral: [:b]
31
+ end
32
+ ```
33
+
34
+ ## 設定例2
35
+ pluginとして登録してあるので、 `macro` を使っても同じことができます。
36
+
37
+ ```yaml
38
+ version: 1.0
39
+ setting: |-
40
+ prefix_keys_for_changing_layer [:zr, :zl, :l]
41
+
42
+ install_macro_plugin(ProconBypassMan::Plugin::Splatoon2::Macro::ChargeTansanBomb)
43
+
44
+ layer :up do
45
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::ChargeTansanBomb, if_pressed: [:b, :r], force_neutral: [:b]
46
+ end
47
+ ```
@@ -0,0 +1,17 @@
1
+ class ProconBypassMan::PostCompletedRemoteMacroJob < ProconBypassMan::BaseJob
2
+ extend ProconBypassMan::HasExternalApiSetting
3
+
4
+ # @param [Symbol] status
5
+ def self.perform(job_id)
6
+ ProconBypassMan::RemoteMacroHttpClient.new(
7
+ path: path,
8
+ server_pool: server_pool,
9
+ ).post(job_id: job_id)
10
+ end
11
+
12
+ def self.path
13
+ device_id = ProconBypassMan.device_id
14
+ "/api/devices/#{ProconBypassMan.device_id}/completed_pbm_remote_macro_jobs"
15
+ end
16
+ end
17
+
@@ -14,3 +14,4 @@ require "procon_bypass_man/background/jobs/report_error_job"
14
14
  require "procon_bypass_man/background/jobs/report_pressed_buttons_job"
15
15
  require "procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job"
16
16
  require "procon_bypass_man/background/jobs/sync_device_stats_job"
17
+ require "procon_bypass_man/background/jobs/post_completed_remote_macro_job"
@@ -15,31 +15,29 @@ module ProconBypassMan
15
15
 
16
16
  # @param [Symbol] button
17
17
  def flip(button, if_pressed: false, force_neutral: nil, flip_interval: nil)
18
- case if_pressed
19
- when TrueClass
20
- if_pressed = [button]
21
- when Symbol, String
22
- if_pressed = [if_pressed]
23
- when Array
24
- # if_pressed = if_pressed
25
- when FalseClass, NilClass
26
- # no-op
27
- else
28
- raise "not support class"
18
+ begin
19
+ button = ParamNormalizer::Button.new(button).to_value!
20
+ rescue ParamNormalizer::UnSupportValueError
21
+ Kernel.warn "設定ファイルに記述ミスがあります. flipの第一引数にはボタンを渡してください."
22
+ return
23
+ end
24
+
25
+ begin
26
+ if_pressed = ParamNormalizer::FlipIfPressed.new(if_pressed, button: button).to_value!
27
+ rescue ParamNormalizer::UnSupportValueError
28
+ Kernel.warn "設定ファイルに記述ミスがあります. flipのif_pressedにはボタンを渡してください."
29
+ return
29
30
  end
30
31
 
31
32
  hash = { if_pressed: if_pressed }
32
- case force_neutral
33
- when TrueClass
34
- raise "ボタンを渡してください"
35
- when Symbol, String
36
- hash[:force_neutral] = [force_neutral]
37
- when Array
38
- hash[:force_neutral] = force_neutral
39
- when FalseClass, NilClass
40
- # no-op
41
- else
42
- raise "not support value"
33
+
34
+ begin
35
+ if(force_neutral = ParamNormalizer::ForceNeutral.new(force_neutral).to_value!)
36
+ hash[:force_neutral] = force_neutral
37
+ end
38
+ rescue ParamNormalizer::UnSupportValueError
39
+ Kernel.warn "設定ファイルに記述ミスがあります. flipのforce_neutralにはボタンを渡してください."
40
+ return
43
41
  end
44
42
 
45
43
  if flip_interval
@@ -55,10 +53,37 @@ module ProconBypassMan
55
53
  end
56
54
 
57
55
  # @param [String, Class] プラグインのclass
58
- def macro(name, if_pressed: , if_tilted_left_stick: nil)
56
+ def macro(name, if_pressed: nil, if_tilted_left_stick: nil, force_neutral: nil)
57
+ case if_tilted_left_stick
58
+ when Integer, String, Symbol, Array
59
+ warn "macro #{name}のif_tilted_left_stickで想定外の値です"
60
+ if_tilted_left_stick = nil
61
+ when TrueClass, NilClass, FalseClass
62
+ # OK
63
+ else
64
+ Kernel.warn "設定ファイルに記述ミスがあります. 未対応の値を受け取りました."
65
+ return
66
+ end
67
+
68
+ begin
69
+ if(fn = ParamNormalizer::ForceNeutral.new(force_neutral).to_value!)
70
+ force_neutral = fn
71
+ end
72
+ rescue ParamNormalizer::UnSupportValueError
73
+ Kernel.warn "設定ファイルに記述ミスがあります. macroのforce_neutralにはボタンを渡してください."
74
+ return
75
+ end
76
+
77
+ begin
78
+ if_pressed = ParamNormalizer::IfPressed.new(if_pressed).to_value!
79
+ rescue ParamNormalizer::UnSupportValueError
80
+ Kernel.warn "設定ファイルに記述ミスがあります. macroのif_pressedにはボタンを渡してください."
81
+ return
82
+ end
83
+
59
84
  macro_name = name.to_s.to_sym
60
85
  if ProconBypassMan::ButtonsSettingConfiguration.instance.macro_plugins[macro_name]
61
- self.macros[macro_name] = { if_pressed: if_pressed, if_tilted_left_stick: if_tilted_left_stick }.compact
86
+ self.macros[macro_name] = { if_pressed: if_pressed, if_tilted_left_stick: if_tilted_left_stick, force_neutral: force_neutral }.compact
62
87
  else
63
88
  warn "#{macro_name}マクロがinstallされていません"
64
89
  end
@@ -67,89 +92,126 @@ module ProconBypassMan
67
92
  # 設定ファイルに直接マクロを打ち込める
68
93
  # @param [String, Class] macroの識別子
69
94
  # @paramh[Array<Symbol>] macroの本体. ボタンの配列
70
- def open_macro(name, steps: , if_pressed: , if_tilted_left_stick: nil)
95
+ def open_macro(name, steps: [], if_pressed: nil, if_tilted_left_stick: nil, force_neutral: nil)
96
+ if name.nil?
97
+ Kernel.warn "設定ファイルに記述ミスがあります. open_macroのnameには一意になる名前を渡してください."
98
+ return
99
+ end
100
+
101
+ begin
102
+ steps = ParamNormalizer::OpenMacroSteps.new(steps).to_value!
103
+ rescue ParamNormalizer::UnSupportValueError
104
+ Kernel.warn "設定ファイルに記述ミスがあります. open_macroのstepsには文字列の配列を渡してください."
105
+ return
106
+ end
107
+
108
+ case if_tilted_left_stick
109
+ when Integer, String, Symbol, Array
110
+ warn "open_macro #{name}のif_tilted_left_stickで想定外の値です"
111
+ if_tilted_left_stick = nil
112
+ when TrueClass, NilClass, FalseClass, Hash
113
+ # OK
114
+ else
115
+ Kernel.warn "設定ファイルに記述ミスがあります. 未対応の値を受け取りました."
116
+ return
117
+ end
118
+
119
+ begin
120
+ force_neutral = ParamNormalizer::ForceNeutral.new(force_neutral).to_value!
121
+ rescue ParamNormalizer::UnSupportValueError
122
+ Kernel.warn "設定ファイルに記述ミスがあります. open_macroのforce_neutralにはボタンを渡してください."
123
+ return
124
+ end
125
+
126
+ begin
127
+ if_pressed = ParamNormalizer::IfPressed.new(if_pressed).to_value!
128
+ rescue ParamNormalizer::UnSupportValueError
129
+ Kernel.warn "設定ファイルに記述ミスがあります. open_macroのif_pressedにはボタンを渡してください."
130
+ return
131
+ end
132
+
71
133
  macro_name = name || "OpenMacro-#{steps.join}".to_sym
72
134
  ProconBypassMan::Procon::MacroRegistry.install_plugin(macro_name, steps: steps)
73
- self.macros[macro_name] = { if_pressed: if_pressed, if_tilted_left_stick: if_tilted_left_stick }.compact
135
+ self.macros[macro_name] = { if_pressed: if_pressed, if_tilted_left_stick: if_tilted_left_stick, force_neutral: force_neutral }.compact
74
136
  end
75
137
 
76
138
  def disable_macro(name, if_pressed: nil)
139
+ if name.nil?
140
+ Kernel.warn "設定ファイルに記述ミスがあります. disable_macroのnameにはmacro nameかクラス名の名前を渡してください."
141
+ return
142
+ end
143
+
77
144
  hash = { name: name.to_s.to_sym, if_pressed: [] }
78
- case if_pressed
79
- when TrueClass, FalseClass
80
- return # booleanはよくわからないのでreturn
81
- when Symbol, String
82
- hash[:if_pressed] = [if_pressed]
83
- when Array
84
- hash[:if_pressed] = if_pressed
85
- when NilClass # 常に対象のmacroをdisableにする
86
- hash[:if_pressed] = [true]
87
- else
88
- raise "not support value"
145
+ begin
146
+ if(if_pressed = ParamNormalizer::DisableMacroIfPressed.new(if_pressed).to_value!)
147
+ hash[:if_pressed] = if_pressed
148
+ end
149
+ rescue ParamNormalizer::UnSupportValueError
150
+ Kernel.warn "設定ファイルに記述ミスがあります. disable_macroのif_pressedにはボタンを渡してください."
151
+ return
89
152
  end
90
153
 
91
154
  disable_macros << hash
92
155
  end
93
156
 
94
157
  def remap(button, to: )
95
- case to
96
- when TrueClass, FalseClass, NilClass
97
- raise "ボタンを渡してください"
98
- when Symbol, String
99
- self.remaps[button] = { to: [to] }
100
- when Array
101
- raise "ボタンを渡してください" if to.size.zero?
102
- self.remaps[button] = { to: to }
158
+ begin
159
+ button = ParamNormalizer::Button.new(button).to_value!
160
+ rescue ParamNormalizer::UnSupportValueError
161
+ Kernel.warn "設定ファイルに記述ミスがあります. remapにはボタンを渡してください."
162
+ return
103
163
  end
104
- end
105
164
 
106
- def left_analog_stick_cap(cap: , if_pressed: nil, force_neutral: nil)
107
- hash = { cap: cap }
165
+ begin
166
+ self.remaps[button] = { to: ParamNormalizer::ButtonList.new(to).to_value! }
167
+ rescue ParamNormalizer::UnSupportValueError
168
+ Kernel.warn "設定ファイルに記述ミスがあります. remapのtoにはボタンを渡してください."
169
+ return
170
+ end
171
+ end
108
172
 
109
- case if_pressed
110
- when TrueClass, FalseClass
111
- raise "ボタンを渡してください"
112
- when Symbol, String
113
- if_pressed = [if_pressed]
114
- when Array, NilClass
115
- # no-op
173
+ def left_analog_stick_cap(cap: nil, if_pressed: nil, force_neutral: nil)
174
+ case cap
175
+ when Integer
176
+ # OK
177
+ when Float
178
+ cap = cap.to_i
116
179
  else
117
- raise "not support value"
180
+ Kernel.warn "設定ファイルに記述ミスがあります. left_analog_stick_capのcapで未対応の値を受け取りました."
181
+ return
118
182
  end
119
183
 
120
- if if_pressed
121
- hash[:if_pressed] = if_pressed
184
+ hash = { cap: cap }
185
+
186
+ begin
187
+ if(if_pressed = ParamNormalizer::IfPressedAllowsFalsy.new(if_pressed).to_value!)
188
+ hash[:if_pressed] = if_pressed
189
+ end
190
+ rescue ParamNormalizer::UnSupportValueError
191
+ Kernel.warn "設定ファイルに記述ミスがあります. left_analog_stick_capのif_pressedにはボタンを渡してください."
192
+ return
122
193
  end
123
194
 
124
- case force_neutral
125
- when TrueClass
126
- raise "ボタンを渡してください"
127
- when Symbol, String
128
- hash[:force_neutral] = [force_neutral]
129
- when Array
130
- hash[:force_neutral] = force_neutral
131
- when FalseClass, NilClass
132
- # no-op
133
- else
134
- raise "not support value"
195
+ begin
196
+ if(force_neutral = ParamNormalizer::ForceNeutral.new(force_neutral).to_value!)
197
+ hash[:force_neutral] = force_neutral
198
+ end
199
+ rescue ParamNormalizer::UnSupportValueError
200
+ Kernel.warn "設定ファイルに記述ミスがあります. left_analog_stick_capのforce_neutralにはボタンを渡してください."
201
+ return
135
202
  end
136
203
 
137
204
  left_analog_stick_caps << hash
138
205
  end
139
206
 
140
207
  def disable(button)
141
- case button
142
- when TrueClass, FalseClass, NilClass
143
- raise "not support class"
144
- when Symbol
145
- disables << button
146
- when String
147
- disables << button.to_sym
148
- when Array
149
- button.each { |b| disables << b }
150
- else
151
- raise "not support value"
208
+ ParamNormalizer::ButtonList.new(button).to_value!.each do |disable|
209
+ disables << disable
152
210
  end
211
+ disables.uniq!
212
+ rescue ParamNormalizer::UnSupportValueError
213
+ Kernel.warn "設定ファイルに記述ミスがあります. disableにはボタンを渡してください."
214
+ return
153
215
  end
154
216
 
155
217
  # @return [Array]
@@ -1,3 +1,5 @@
1
+ require "procon_bypass_man/buttons_setting_configuration/param_normalizer"
2
+
1
3
  module ProconBypassMan
2
4
  class ButtonsSettingConfiguration
3
5
  module Loader
@@ -0,0 +1,28 @@
1
+ module ProconBypassMan
2
+ class ButtonsSettingConfiguration
3
+ module ParamNormalizer
4
+ class Button
5
+ attr_reader :button
6
+
7
+ def initialize(button)
8
+ @button = button
9
+ end
10
+
11
+ def to_value!
12
+ case button
13
+ when TrueClass, FalseClass, NilClass, Array, Integer
14
+ raise UnSupportValueError
15
+ when Symbol, String
16
+ unless !!ProconBypassMan::Procon::ButtonCollection::BUTTONS_MAP[button.to_sym]
17
+ raise UnexpectedValueError
18
+ end
19
+
20
+ return button.to_sym
21
+ else
22
+ raise UnexpectedValueError
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,31 @@
1
+ module ProconBypassMan
2
+ class ButtonsSettingConfiguration
3
+ module ParamNormalizer
4
+ class ButtonList
5
+ attr_reader :button
6
+
7
+ def initialize(button)
8
+ @button = button
9
+ end
10
+
11
+ # @return [Array]
12
+ # @raise [UnSupportValueError]
13
+ # @raise [UnexpectedValueError]
14
+ def to_value!
15
+ case button
16
+ when Integer, TrueClass, FalseClass, NilClass
17
+ raise UnSupportValueError
18
+ when Symbol
19
+ return [button]
20
+ when String
21
+ return [button.to_sym]
22
+ when Array
23
+ return button.map(&:to_sym).uniq
24
+ else
25
+ raise UnexpectedValueError
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ module ProconBypassMan
2
+ class ButtonsSettingConfiguration
3
+ module ParamNormalizer
4
+ class DisableMacroIfPressed
5
+ attr_reader :value
6
+
7
+ def initialize(value)
8
+ @value = value
9
+ end
10
+
11
+ def to_value!
12
+ case value
13
+ when FalseClass, Integer, TrueClass
14
+ raise UnSupportValueError
15
+ when Symbol, String
16
+ return [value.to_sym]
17
+ when Array
18
+ return value.map(&:to_sym).uniq
19
+ when NilClass # 常に対象のmacroをdisableにする
20
+ return [true]
21
+ else
22
+ raise UnexpectedValueError
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end