├── README.md
├── css
└── main.css
├── deck
└── Dices
│ ├── css
│ └── dices.css
│ ├── dices.html
│ └── js
│ └── dices.js
├── index.html
├── js
├── deck.js
├── gamepad.js
├── main.js
└── utility.js
└── skins
├── ArcadeController
├── Active.png
├── Base.png
├── Button_0.png
├── Button_1.png
├── Button_10.png
├── Button_11.png
├── Button_12.png
├── Button_13.png
├── Button_14.png
├── Button_15.png
├── Button_16.png
├── Button_2.png
├── Button_3.png
├── Button_4.png
├── Button_5.png
├── Button_6.png
├── Button_7.png
├── Button_8.png
├── Button_9.png
├── Controller_0.png
├── Controller_1.png
├── Controller_2.png
├── Controller_3.png
├── Stick_1.png
├── Stick_2.png
├── Stick_3.png
├── Stick_4.png
├── Stick_6.png
├── Stick_7.png
├── Stick_8.png
└── Stick_9.png
├── ButtonBox
├── Active.png
├── Base.png
├── Button_0.png
├── Button_1.png
├── Button_10.png
├── Button_11.png
├── Button_12.png
├── Button_13.png
├── Button_14.png
├── Button_15.png
├── Button_16.png
├── Button_2.png
├── Button_3.png
├── Button_4.png
├── Button_5.png
├── Button_6.png
├── Button_7.png
├── Button_8.png
├── Button_9.png
├── Controller_0.png
├── Controller_1.png
├── Controller_2.png
└── Controller_3.png
├── DualBox
├── Active.png
├── Base.png
├── Button_0.png
├── Button_1.png
├── Button_10.png
├── Button_11.png
├── Button_12.png
├── Button_13.png
├── Button_14.png
├── Button_15.png
├── Button_16.png
├── Button_2.png
├── Button_3.png
├── Button_4.png
├── Button_5.png
├── Button_6.png
├── Button_7.png
├── Button_8.png
├── Button_9.png
├── Controller_0.png
├── Controller_1.png
├── Controller_2.png
├── Controller_3.png
├── Stick_1.png
├── Stick_2.png
├── Stick_3.png
├── Stick_4.png
├── Stick_6.png
├── Stick_7.png
├── Stick_8.png
└── Stick_9.png
├── DualPad
├── Active.png
├── Base.png
├── Button_0.png
├── Button_1.png
├── Button_10.png
├── Button_11.png
├── Button_12.png
├── Button_13.png
├── Button_14.png
├── Button_15.png
├── Button_16.png
├── Button_17.png
├── Button_2.png
├── Button_3.png
├── Button_4.png
├── Button_5.png
├── Button_6.png
├── Button_7.png
├── Button_8.png
├── Button_9.png
├── StickL_Down.png
├── StickL_Left.png
├── StickL_Right.png
├── StickL_Up.png
├── StickR_Down.png
├── StickR_Left.png
├── StickR_Right.png
└── StickR_Up.png
├── FlashOverlays
└── Button_0.png
├── Front6Pad
├── Active.png
├── Base.png
├── Button_0.png
├── Button_1.png
├── Button_10.png
├── Button_11.png
├── Button_12.png
├── Button_13.png
├── Button_14.png
├── Button_15.png
├── Button_2.png
├── Button_3.png
├── Button_4.png
├── Button_5.png
├── Button_6.png
├── Button_7.png
├── Button_8.png
├── Button_9.png
├── Controller_0.png
├── Controller_1.png
├── Controller_2.png
└── Controller_3.png
├── Front6ProPad
├── Active.png
├── Base.png
├── Button_0.png
├── Button_1.png
├── Button_10.png
├── Button_11.png
├── Button_12.png
├── Button_13.png
├── Button_14.png
├── Button_15.png
├── Button_16.png
├── Button_2.png
├── Button_3.png
├── Button_4.png
├── Button_5.png
├── Button_6.png
├── Button_7.png
├── Button_8.png
├── Button_9.png
├── Controller_0.png
├── Controller_1.png
├── Controller_2.png
├── Controller_3.png
├── StickL_1.png
├── StickL_2.png
├── StickL_3.png
├── StickL_4.png
├── StickL_5.png
├── StickL_6.png
├── StickL_7.png
├── StickL_8.png
└── StickL_9.png
├── Overlays
└── Button_0.png
├── PopPad
├── Active.png
├── Base.png
├── Button_0.png
├── Button_1.png
├── Button_10.png
├── Button_11.png
├── Button_12.png
├── Button_13.png
├── Button_14.png
├── Button_15.png
├── Button_16.png
├── Button_17.png
├── Button_2.png
├── Button_3.png
├── Button_4.png
├── Button_5.png
├── Button_6.png
├── Button_7.png
├── Button_8.png
├── Button_9.png
├── Controller_0.png
├── Controller_1.png
├── Controller_2.png
├── Controller_3.png
├── PopPad.css
├── PopPad.svg
├── StickL_1.png
├── StickL_2.png
├── StickL_3.png
├── StickL_4.png
├── StickL_6.png
├── StickL_7.png
├── StickL_8.png
├── StickL_9.png
├── StickR_1.png
├── StickR_2.png
├── StickR_3.png
├── StickR_4.png
├── StickR_6.png
├── StickR_7.png
├── StickR_8.png
└── StickR_9.png
├── ProPad
├── Active.png
├── Base.png
├── Button_0.png
├── Button_1.png
├── Button_10.png
├── Button_11.png
├── Button_12.png
├── Button_13.png
├── Button_14.png
├── Button_15.png
├── Button_16.png
├── Button_17.png
├── Button_2.png
├── Button_3.png
├── Button_4.png
├── Button_5.png
├── Button_6.png
├── Button_7.png
├── Button_8.png
├── Button_9.png
├── Controller_0.png
├── Controller_1.png
├── Controller_2.png
├── Controller_3.png
├── StickL_1.png
├── StickL_2.png
├── StickL_3.png
├── StickL_4.png
├── StickL_6.png
├── StickL_7.png
├── StickL_8.png
├── StickL_9.png
├── StickR_1.png
├── StickR_2.png
├── StickR_3.png
├── StickR_4.png
├── StickR_6.png
├── StickR_7.png
├── StickR_8.png
└── StickR_9.png
└── StreetFighter6
├── StreetFighter6.css
└── StreetFighter6.png
/deck/Dices/css/dices.css:
--------------------------------------------------------------------------------
1 | @import url("http://fonts.googleapis.com/css?family=Kosugi+Maru");
2 |
3 | *, *::before, *::after {
4 | box-sizing: border-box;
5 | }
6 |
7 | html, body {
8 | width: 100%;
9 | height: 100%;
10 | background: transparent;
11 | overflow: hidden;
12 | }
13 |
14 | form {
15 | margin: 50px 0 0 0;
16 | width: 100%;
17 | font-size: 36px;
18 | text-align: center;
19 | }
20 |
21 | input {
22 | font-size: 36px;
23 | text-align: center;
24 | } input:focus {
25 | background-color: rgba(255, 255, 255, 1);
26 | color: rgba(0, 0, 0, 1);
27 | filter: drop-shadow(0 0 .75rem rgba(0, 0, 0, 1));
28 | } #MAIN:not([data-stop="true"]) input:focus {
29 | animation: flash 1000ms ease-in-out infinite alternate;
30 | } @keyframes flash {
31 | 0%{
32 | background-color: rgba(255, 0, 0, 1);
33 | }
34 | 100% {
35 | background-color: rgba(255, 255, 255, 1);
36 | }
37 | }
38 |
39 | label {
40 | margin: 0 2% 0 10px;
41 | }
42 |
43 | ul, li {
44 | list-style: none;
45 | margin: 0;
46 | padding: 0;
47 | line-height: 1;
48 | }
49 |
50 | .textBorder {
51 | text-shadow :
52 | 2px 2px 1px rgba(255, 255, 255, 1),
53 | -2px 2px 1px rgba(255, 255, 255, 1),
54 | 2px -2px 1px rgba(255, 255, 255, 1),
55 | -2px -2px 1px rgba(255, 255, 255, 1),
56 | 2px 0px 1px rgba(255, 255, 255, 1),
57 | 0px 2px 1px rgba(255, 255, 255, 1),
58 | -2px 0px 1px rgba(255, 255, 255, 1),
59 | 0px -2px 1px rgba(255, 255, 255, 1);
60 | }
61 |
62 | #CONTAINER {
63 | position: relative;
64 | top: 0;
65 | left: 0;
66 | width: 100%;
67 | height: 100%;
68 | font-family: 'Kosugi Maru', sans-serif;
69 | } #CONTAINER::before {
70 | content: "";
71 | display: block;
72 | position: absolute;
73 | top: 10%;
74 | left: 10%;
75 | width: 80%;
76 | height: 80%;
77 | background: rgba(255, 255, 255, .8);
78 | filter: blur(12px);
79 | }
80 |
81 | #MAIN {
82 | display: flex;
83 | align-content: center;
84 | align-items: center;
85 | flex-direction: column;
86 | justify-content: center;
87 | position: absolute;
88 | top: 10%;
89 | left: 10%;
90 | padding: 2%;
91 | width: 80%;
92 | height: 80%;
93 | } #MAIN:not([data-ready="true"]) {
94 | display: none;
95 | }
96 |
97 | .dices {
98 | display: flex;
99 | align-items: center;
100 | flex-direction: row;
101 | flex-wrap: nowrap;
102 | justify-content: center;
103 | width: 100%;
104 | text-align: center;
105 | white-space: nowrap;
106 | }
107 | .dices > * {
108 | display: inline-block;
109 | position: relative;
110 | top: 0;
111 | left: 0;
112 | margin: 1%;
113 | width: 100px;
114 | height: 100px;
115 | line-height: 100px;
116 | font-size: 48px;
117 | text-align: center;
118 | text-indent: -9999px;
119 | vertical-align: middle;
120 | } .dices > *::before,
121 | .dices > *::after {
122 | content: "";
123 | display: inline-block;
124 | position: absolute;
125 | top: 0;
126 | left: 0;
127 | width: 100%;
128 | height: 100%;
129 | overflow: hidden;
130 | } .dices > *::before {
131 | background-color: rgba(255, 255, 255, 1);
132 | border: rgba(0, 0, 0, 1) 5px solid;
133 | border-radius: 20%;
134 | } .dices > *::after {
135 | content: attr(data-label);
136 | text-indent: 0;
137 | } #MAIN:not([data-stop="true"]) .dices > *::after {
138 | filter: blur(12px);
139 | } #MAIN[data-total="false"] .dices > * {
140 | width: 130px;
141 | height: 130px;
142 | line-height: 130px;
143 | font-size: 56px;
144 | }
145 |
146 | .total {
147 | margin: 2% 0 1% 0;
148 | font-size: 192px;
149 | font-weight: 900;
150 | } #MAIN[data-total="false"] .total {
151 | display: none;
152 | } #MAIN:not([data-stop="true"]) .total {
153 | filter: blur(24px);
154 | }
155 |
156 | #face {
157 | width: 60px;
158 | }
159 |
160 | #quantity {
161 | width: 50px;
162 | }
163 |
164 | #button {
165 | padding: 8px 16px;
166 | width: 180px;
167 | cursor: pointer;
168 | border: rgba(0, 0, 0, 1) 3px solid;
169 | border-radius: 20px;
170 | }
171 |
172 | .howTo {
173 | margin: 5% 0 0 0;
174 | } #MAIN[data-frame="false"] .howTo,
175 | .howTo > * {
176 | display: none;
177 | } #MAIN[data-current-focus="face"] .howTo > [data-focus="face quantity"],
178 | #MAIN[data-current-focus="quantity"] .howTo > [data-focus="face quantity"],
179 | #MAIN[data-current-focus="button"] .howTo > [data-focus="button"] {
180 | display: block;
181 | }
182 |
--------------------------------------------------------------------------------
/deck/Dices/dices.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Dices
8 |
9 |
10 |
11 |
12 |
15 |
{{ dice.total() }}
16 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/deck/Dices/js/dices.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Key: Button
3 | *
4 | * @type {string}
5 | */
6 | const KEY_BUTTON = 'button';
7 |
8 | /**
9 | * Key: Face
10 | *
11 | * @type {string}
12 | */
13 | const KEY_FACE = 'face';
14 |
15 | /**
16 | * Key: labels
17 | *
18 | * @type {string}
19 | */
20 | const KEY_LABELS = 'labels';
21 |
22 | /**
23 | * Key: Quantity
24 | *
25 | * @type {string}
26 | */
27 | const KEY_QUANTITY = 'quantity';
28 |
29 | /**
30 | * Dice
31 | *
32 | * @class
33 | */
34 | class Dice {
35 |
36 | /**
37 | * Default: Face
38 | *
39 | * @type {number}
40 | */
41 | static DEFAULT_FACE = 6;
42 |
43 | /**
44 | * Default: Quantity
45 | *
46 | * @type {number}
47 | */
48 | static DEFAULT_QUANTITY = 1;
49 |
50 | /**
51 | * @param {number} [face]
52 | * @param {number} [quantity]
53 | */
54 | constructor(face = Dice.DEFAULT_FACE, quantity = Dice.DEFAULT_QUANTITY) {
55 |
56 | let total = -1;
57 |
58 | /** @type {array} */
59 | this._labels = (() => {
60 | let labels = (new URL(window.location.href)).searchParams.get(KEY_LABELS);
61 | if (Utility.notEmpty(labels) && (2 <= (labels = decodeURIComponent(labels).split(',')).length)) {
62 | face = labels.length;
63 | } else {
64 | labels = [];
65 | total = 0;
66 | for (let i = 0; i < 99; i++) {
67 | labels.push(i + 1);
68 | }
69 | }
70 | return labels;
71 | })();
72 |
73 | /** @type {number} */
74 | this._total = total;
75 |
76 | this.update(face, quantity);
77 | }
78 |
79 | /**
80 | * Face
81 | *
82 | * @param {number} [add]
83 | * @param {number} [min]
84 | * @param {number} [max]
85 | * @returns {number}
86 | */
87 | face(add, min = 2, max = 99) {
88 | return (this._face = this._update(this._face, add, min, max));
89 | }
90 |
91 | /**
92 | * Labels
93 | *
94 | * @returns {array}
95 | */
96 | labels() {
97 | return this._labels;
98 | }
99 |
100 | /**
101 | * Quantity
102 | *
103 | * @param {number} [add]
104 | * @param {number} [min]
105 | * @param {number} [max]
106 | * @returns {number}
107 | */
108 | quantity(add, min = 1, max = 9) {
109 | return (this._quantity = this._update(this._quantity, add, min, max));
110 | }
111 |
112 | /**
113 | * Results
114 | *
115 | * @returns {array}
116 | */
117 | results() {
118 | return this._results;
119 | }
120 |
121 | /**
122 | * Total
123 | *
124 | * @param {number} [total]
125 | * @returns {number}
126 | */
127 | total(total) {
128 | if (0 <= total) {
129 | return (this._total = total);
130 | }
131 | return this._total;
132 | }
133 |
134 | /**
135 | * Update
136 | *
137 | * @param {number} [face]
138 | * @param {number} [quantity]
139 | * @returns {Dice}
140 | */
141 | update(face = Dice.DEFAULT_FACE, quantity = Dice.DEFAULT_QUANTITY) {
142 |
143 | let results = (() => {
144 | let results = [];
145 | let labels = this.labels();
146 | for (let i = 0; i < quantity; i++) {
147 | results.push(labels[Math.floor(Math.random() * (face))]);
148 | }
149 | return results;
150 | })();
151 |
152 | if (-1 !== this.total()) {
153 | this.total((() => {
154 | let total = 0;
155 | results.forEach(result => {
156 | total += result;
157 | });
158 | return total;
159 | })());
160 | }
161 |
162 | /** @type {number} */
163 | this._face = face;
164 |
165 | /** @type {number} */
166 | this._quantity = quantity;
167 |
168 | /** @type {array} */
169 | this._results = results;
170 |
171 | return this;
172 | }
173 |
174 | /**
175 | * Update at face or quantity
176 | *
177 | * @param {number} value
178 | * @param {number} [add]
179 | * @param {number} [max]
180 | * @returns
181 | */
182 | _update(value, add, min = 1, max = 99) {
183 | if (Number.isInteger(add)) {
184 | value += add;
185 | if (min > value) {
186 | value = min;
187 | } else if (max < value) {
188 | value = max;
189 | }
190 | }
191 | return value;
192 | }
193 | }
194 |
195 | let dice = new Dice();
196 |
197 | const dices = {
198 | data() {
199 | return {
200 | currentFocus: KEY_BUTTON,
201 | deck: false,
202 | dice: dice,
203 | face: dice.face(),
204 | frame: (window != parent),
205 | quantity: dice.quantity(),
206 | ready: true,
207 | stop: false
208 | }
209 | },
210 | mounted() {
211 | this.$refs[this.currentFocus].focus();
212 | this.loop();
213 | },
214 | methods: {
215 | button: function(event) {
216 | this.stop = !this.stop;
217 | if (!this.stop) {
218 | this.loop();
219 | }
220 | },
221 | change: function(event) {
222 | dice.update(this.face, this.quantity);
223 | },
224 | focus: function(event) {
225 | this.currentFocus = event.target.name;
226 | },
227 | loop: function() {
228 | const _callback = () => {
229 | this.updateDices();
230 | if (!this.stop) {
231 | Utility.requestAnimationFrame(_callback);
232 | }
233 | }
234 | _callback();
235 | },
236 | updateDices: function() {
237 | this.dice.update(dice.face(), dice.quantity());
238 | }
239 | }
240 | };
241 | let app = Vue.createApp(dices);
242 | let vm = app.mount('#CONTAINER');
243 |
244 | // GameInputDisplay(Deckモード)との通信
245 | window.addEventListener('message', function (event) {
246 | switch (event.data.action) {
247 | case Deck.NAME_MESSAGE: // GameInputDisplay(Deckモード)からのメッセージの場合
248 | if (DeckItem.STATE_PLAY == event.data.message.state) { // GameInputDisplay(Deckモード)で表示中の場合
249 | let axes = event.data.message.axes; // 十字キーボタン・左スティック・右スティック
250 | let values = [...axes.commands, ...axes.leftAxis, ...axes.rightAxis]; // 方向入力値配列
251 | vm.deck = true;
252 | switch (vm.currentFocus) {
253 | case KEY_FACE: // 面入力欄にフォーカスがある場合
254 | if (values.includes(Axis.VALUE_RIGHT)) { // 右入力の場合
255 | vm.$refs.quantity.focus();
256 | } else if (values.includes(Axis.VALUE_UP)) { // 上入力の場合
257 | vm.face = vm.dice.face(1);
258 | } else if (values.includes(Axis.VALUE_DOWN)) { // 下入力の場合
259 | vm.face = vm.dice.face(-1);
260 | }
261 | break;
262 | case KEY_QUANTITY: // 個数入力欄にフォーカスがある場合
263 | if (values.includes(Axis.VALUE_RIGHT)) { // 右入力の場合
264 | vm.$refs.button.focus();
265 | } else if (values.includes(Axis.VALUE_LEFT)) { // 左入力の場合
266 | vm.$refs.face.focus();
267 | } else if (values.includes(Axis.VALUE_UP)) { // 上入力の場合
268 | vm.quantity = vm.dice.quantity(1);
269 | } else if (values.includes(Axis.VALUE_DOWN)) { // 下入力の場合
270 | vm.quantity = vm.dice.quantity(-1);
271 | }
272 | break;
273 | case KEY_BUTTON: // ボタンにフォーカスがある場合
274 | if (values.includes(Axis.VALUE_LEFT)) { // 左入力の場合
275 | vm.$refs.quantity.focus();
276 | } else if (values.includes(Axis.VALUE_DOWN)) { // 下入力の場合
277 | vm.button();
278 | }
279 | break;
280 | default:
281 | break;
282 | }
283 | break;
284 | }
285 | default:
286 | break;
287 | }
288 | });
289 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | Game Input Display
10 |
11 |
12 |
249 |
250 |
251 |
252 |
255 |
256 |
257 |
--------------------------------------------------------------------------------
/js/deck.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Deck container abstract
3 | *
4 | * @class
5 | */
6 | class DeckContainer_Abstract {
7 |
8 | /**
9 | * Type: Audio
10 | *
11 | * @type {string}
12 | */
13 | static TYPE_AUDIO = "Audio";
14 |
15 | /**
16 | * Type: HTML
17 | *
18 | * @type {string}
19 | */
20 | static TYPE_HTML = "HTML";
21 |
22 | /**
23 | * Type: Image
24 | *
25 | * @type {string}
26 | */
27 | static TYPE_IMAGE = "Image";
28 |
29 | /**
30 | * Type: Media
31 | *
32 | * @type {string}
33 | */
34 | static TYPE_MEDIA = "Media";
35 |
36 | /**
37 | * Type: Other
38 | *
39 | * @type {string}
40 | */
41 | static TYPE_OTHER = "Other";
42 |
43 | /**
44 | * Type: Video
45 | *
46 | * @type {string}
47 | */
48 | static TYPE_VIDEO = "Video";
49 |
50 | /**
51 | * Factory
52 | *
53 | * @param {DeckItem} item
54 | * @returns {DeckContainer_Abstract}
55 | */
56 | static factory = (item) => {
57 | let res;
58 | switch (item.type()) {
59 | case DeckContainer_Abstract.TYPE_AUDIO:
60 | res = new DeckContainer_Audio(item);
61 | break;
62 | case DeckContainer_Abstract.TYPE_HTML:
63 | case DeckContainer_Abstract.TYPE_OTHER:
64 | res = new DeckContainer_Html(item);
65 | break;
66 | case DeckContainer_Abstract.TYPE_IMAGE:
67 | res = new DeckContainer_Image(item);
68 | break;
69 | case DeckContainer_Abstract.TYPE_VIDEO:
70 | res = new DeckContainer_Video(item);
71 | default:
72 | break;
73 | }
74 | return res;
75 | }
76 |
77 | /**
78 | * @param {DeckItem} item
79 | * @param {string} [type]
80 | */
81 | constructor(item, type) {
82 |
83 | /** @type {HTMLElement} */
84 | this._element;
85 |
86 | /** @type {DeckItem} */
87 | this._item = item;
88 |
89 | /** @type {string} */
90 | this._state;
91 |
92 | /** @type {number} */
93 | this._volume = 0.5;
94 |
95 | // /** @type {string} */
96 | // this._type = type;
97 | }
98 |
99 | /**
100 | * Clear
101 | *
102 | * @returns {void}
103 | */
104 | clear() {
105 | this.state(DeckItem.STATE_CLEAR);
106 | }
107 |
108 | /**
109 | * Get
110 | *
111 | * @returns {HTMLElement}
112 | */
113 | get() {
114 | if (!this._element) {
115 | return (this._element = this._createHtmlElement());
116 | }
117 | return this._element;
118 | }
119 |
120 | /**
121 | * Item
122 | *
123 | * @returns {DeckItem}
124 | */
125 | item() {
126 | return this._item;
127 | }
128 |
129 | /**
130 | * Pause
131 | *
132 | * @returns {void}
133 | */
134 | pause() {
135 | this.state(DeckItem.STATE_PAUSE);
136 | }
137 |
138 | /**
139 | * Play
140 | *
141 | * @param {callback} callback
142 | * @param {number} [volume]
143 | * @returns {void}
144 | */
145 | play(callback, volume) {
146 | if (this.playing()) {
147 | this.pause();
148 | } else {
149 | if (typeof callback === "function") {
150 | callback();
151 | } else if (Number(callback)) {
152 | }
153 | this.state(DeckItem.STATE_PLAY);
154 | }
155 | }
156 |
157 | /**
158 | * Playing
159 | *
160 | * @returns {boolean}
161 | */
162 | playing() {
163 | return DeckItem.STATE_PLAY == this.state();
164 | }
165 |
166 | /**
167 | * Skip
168 | *
169 | * @param {number} second
170 | * @returns {number}
171 | */
172 | skip(second) {
173 | return -1;
174 | }
175 |
176 | /**
177 | * State
178 | *
179 | * @param {string} [state]
180 | * @returns {string}
181 | */
182 | state(state) {
183 | if (state) {
184 | this.get().parentElement.dataset.state = state;
185 | return (this._state = state);
186 | }
187 | return this._state;
188 | }
189 |
190 | /**
191 | * Volume
192 | *
193 | * @param {number} [volume]
194 | * @returns {number}
195 | */
196 | volume(volume) {
197 | if ((0 === volume) || Number(volume)) {
198 | if (0 > volume) {
199 | volume = 0;
200 | } else if (1 < volume) {
201 | volume = 1;
202 | }
203 | return (this._volume = volume);
204 | }
205 | return this._volume;
206 | }
207 |
208 | /**
209 | * Create the HTML element
210 | *
211 | * @returns {HTMLElement}
212 | */
213 | _createHtmlElement() {
214 | return null;
215 | }
216 | }
217 |
218 | /**
219 | * Deck container: HTML
220 | *
221 | * @class
222 | */
223 | class DeckContainer_Html extends DeckContainer_Abstract {
224 |
225 | /**
226 | * @param {DeckItem} item
227 | */
228 | constructor(item) {
229 | super(item, DeckContainer_Abstract.TYPE_HTML);
230 | }
231 |
232 | /**
233 | * Create the HTML element
234 | *
235 | * @returns {HTMLElement}
236 | */
237 | _createHtmlElement() {
238 | let element = document.createElement("iframe");
239 | element.src = this.item().value();
240 | return element;
241 | }
242 | }
243 |
244 | /**
245 | * Deck container: Image
246 | *
247 | * @class
248 | */
249 | class DeckContainer_Image extends DeckContainer_Abstract {
250 |
251 | /**
252 | * @param {DeckItem} item
253 | */
254 | constructor(item) {
255 | super(item, DeckContainer_Abstract.TYPE_IMAGE);
256 | }
257 |
258 | /**
259 | * Create the HTML element
260 | *
261 | * @returns {HTMLElement}
262 | */
263 | _createHtmlElement() {
264 | let element = document.createElement("img");
265 | element.src = this.item().value();
266 | return element;
267 | }
268 | }
269 |
270 | /**
271 | * Deck container: Media
272 | *
273 | * @class
274 | */
275 | class DeckContainer_Media extends DeckContainer_Abstract {
276 |
277 | /**
278 | * @param {DeckItem} item
279 | */
280 | constructor(item) {
281 | super(item, DeckContainer_Abstract.TYPE_MEDIA);
282 | }
283 |
284 | /**
285 | * Pause
286 | *
287 | * @returns {void}
288 | */
289 | pause() {
290 | super.pause();
291 | this.get().pause();
292 | }
293 |
294 | /**
295 | * Play
296 | *
297 | * @returns {void}
298 | */
299 | play() {
300 | super.play(() => {
301 | this.get().play();
302 | });
303 | }
304 |
305 | /**
306 | * Skip
307 | *
308 | * @param {number} second
309 | * @returns {number}
310 | */
311 | skip(second) {
312 | let currentTime = this._currentTime();
313 | if (Number(second)) {
314 | return this._currentTime(currentTime + second);
315 | }
316 | return currentTime;
317 | }
318 |
319 | /**
320 | * Stop
321 | *
322 | * @returns {void}
323 | */
324 | clear() {
325 | this.pause();
326 | super.clear();
327 | this._currentTime(0);
328 | }
329 |
330 | /**
331 | * Volume
332 | *
333 | * @param {number} [volume]
334 | * @returns {number}
335 | */
336 | volume(volume) {
337 | volume = super.volume(volume);
338 | if (volume != this.get().volume) {
339 | this.get().volume = volume;
340 | }
341 | return volume;
342 | }
343 |
344 | /**
345 | * Create the HTML element
346 | *
347 | * @returns {HTMLElement}
348 | */
349 | _createHtmlElement() {
350 | let setting = this._getHtmlElementSetting();
351 | let element = document.createElement(setting.tag);
352 | let source = document.createElement("source");
353 | element.autoplay = true;
354 | element.loop = true;
355 | element.volume = 1;
356 | source.src = this.item().value();
357 | source.type = setting.type;
358 | element.append(source);
359 | return element;
360 | }
361 |
362 | /**
363 | * Current time
364 | *
365 | * @param {number} second
366 | * @return {number}
367 | */
368 | _currentTime(second) {
369 | let media = this.get();
370 | let currentTime = media.currentTime;
371 | if ((0 === second) || Number(second)) {
372 | if (0 > second) {
373 | second = 0;
374 | } else if (second > media.duration) {
375 | second = media.duration;
376 | }
377 | if (currentTime != second) {
378 | return (media.currentTime = second);
379 | }
380 | }
381 | return currentTime;
382 | }
383 |
384 | /**
385 | * Get the HTML element setting
386 | *
387 | * @return {object}
388 | */
389 | _getHtmlElementSetting() {
390 | let res = {
391 | tag: "",
392 | type: ""
393 | };
394 | let filePath = this.item().value();
395 | switch (this.item().type()) {
396 | case DeckContainer_Abstract.TYPE_AUDIO:
397 | res.tag = "audio";
398 | if (/\.mp3$/.test(filePath)) {
399 | res.type = "audio/mpeg"
400 | } else if (/\.ogg$/.test(filePath)) {
401 | res.type = "audio/ogg"
402 | } else if (/\.wav$/.test(filePath)) {
403 | res.type = "audio/wav"
404 | } else if (/\.aac$/.test(filePath)) {
405 | res.type = "audio/aac"
406 | } else if (/\.flac$/.test(filePath)) {
407 | res.type = "audio/flac"
408 | }
409 | break;
410 | case DeckContainer_Abstract.TYPE_VIDEO:
411 | res.tag = "video";
412 | if (/\.mp4$/.test(filePath)) {
413 | res.type = "video/mp4"
414 | } else if (/\.webm$/.test(filePath)) {
415 | res.type = "video/webm"
416 | }
417 | break;
418 | default:
419 | break;
420 | }
421 | return res;
422 | }
423 | }
424 |
425 | /**
426 | * Deck container: Audio
427 | *
428 | * @class
429 | */
430 | class DeckContainer_Audio extends DeckContainer_Media {
431 |
432 | /**
433 | * @param {DeckItem} item
434 | */
435 | constructor(item) {
436 | super(item, DeckContainer_Abstract.TYPE_AUDIO);
437 | }
438 | }
439 |
440 | /**
441 | * Deck container: Video
442 | *
443 | * @class
444 | */
445 | class DeckContainer_Video extends DeckContainer_Media {
446 |
447 | /**
448 | * @param {DeckItem} item
449 | */
450 | constructor(item) {
451 | super(item, DeckContainer_Abstract.TYPE_VIDEO);
452 | }
453 | }
454 |
455 | /**
456 | * Deck item
457 | *
458 | * @class
459 | */
460 | class DeckItem {
461 |
462 | /**
463 | * State: Clear
464 | *
465 | * @type {string}
466 | */
467 | static STATE_CLEAR = "Clear";
468 |
469 | /**
470 | * State: Pause
471 | *
472 | * @type {string}
473 | */
474 | static STATE_PAUSE = "Pause";
475 |
476 | /**
477 | * State: Play
478 | *
479 | * @type {string}
480 | */
481 | static STATE_PLAY = "Play";
482 |
483 | /**
484 | * Get the type
485 | *
486 | * @param {string} value
487 | * @returns {string}
488 | */
489 | static getType = (value) => {
490 | let type = DeckContainer_Abstract.TYPE_OTHER;
491 | if (/^.+(\.html|\.htm)$/.test(value)) {
492 | type = DeckContainer_Abstract.TYPE_HTML;
493 | } else if (/^.+(\.png|\.jpeg|\.jpg|\.gif|\.bmp)$/.test(value)) {
494 | type = DeckContainer_Abstract.TYPE_IMAGE;
495 | } else if (/^.+(\.wav|\.wave|\.mp3|\.ogg|\.aac|\.flac)$/.test(value)) {
496 | type = DeckContainer_Abstract.TYPE_AUDIO;
497 | } else if (/^.+(\.mp4|\.webm)$/.test(value)) {
498 | type = DeckContainer_Abstract.TYPE_VIDEO;
499 | }
500 | return type;
501 | }
502 |
503 | /**
504 | * @param {number[]} indexes
505 | * @param {string} value
506 | */
507 | constructor(indexes, value) {
508 |
509 | /** @type {DeckContainer_Abstract} */
510 | this._container;
511 |
512 | this._indexes = indexes;
513 |
514 | this._value = value;
515 | }
516 |
517 | /**
518 | * @callback IsContainerCallback
519 | * @param {DeckContainer_Abstract} container
520 | * @returns {void}
521 | */
522 |
523 | /**
524 | * Container
525 | *
526 | * @param {IsContainerCallback} [isCallback]
527 | * @param {boolean} [create]
528 | * @returns {DeckContainer_Abstract}
529 | */
530 | container(isCallback, create = false) {
531 | let container;
532 | if ((true === isCallback) || (false == isCallback)) {
533 | return this.container(null, isCallback);
534 | } else {
535 | container = this._container;
536 | if (!container && create) {
537 | this._container = (container = DeckContainer_Abstract.factory(this));
538 | }
539 | if (container && (typeof isCallback === "function")) {
540 | isCallback(container);
541 | }
542 | }
543 | return container;
544 | }
545 |
546 | /**
547 | * Indexes
548 | *
549 | * @returns {number[]}
550 | */
551 | indexes() {
552 | return this._indexes;
553 | }
554 |
555 | /**
556 | * Play
557 | *
558 | * @param {number} [volume]
559 | * @returns {void}
560 | */
561 | play(volume) {
562 | this.container(container => {
563 | container.play(volume);
564 | });
565 | }
566 |
567 | /**
568 | * Reset
569 | *
570 | * @returns {void}
571 | */
572 | reset() {
573 | this._container = null;
574 | }
575 |
576 | /**
577 | * Type
578 | *
579 | * @returns {string}
580 | */
581 | type() {
582 | if (!this._type) {
583 | return (this._type = DeckItem.getType(this.value()));
584 | }
585 | return this._type;
586 | }
587 |
588 | /**
589 | * Update the order
590 | *
591 | * @param {number} order
592 | * @returns {void}
593 | */
594 | updateOrder(order) {
595 | this.container(container => {
596 | container.get().parentElement.style.zIndex = order;
597 | });
598 | }
599 |
600 | /**
601 | * Value
602 | *
603 | * @returns {string}
604 | */
605 | value() {
606 | return this._value;
607 | }
608 | }
609 |
610 | /**
611 | * Deck
612 | *
613 | * @class
614 | */
615 | class Deck {
616 |
617 | /**
618 | * Name: Message
619 | *
620 | * @type {string}
621 | */
622 | static NAME_MESSAGE = "GameInputDisplay";
623 |
624 | /**
625 | * @param {number[]} [clearIndexes]
626 | * @param {number[]} [resetIndexes]
627 | */
628 | constructor(clearIndexes = [0], resetIndexes = [11]) {
629 |
630 | /** @type {number[]} */
631 | this._clearIndexes = clearIndexes;
632 |
633 | /** @type {number} */
634 | this._count = 0;
635 |
636 | /** @type {DeckItem[]} */
637 | this._items = [];
638 |
639 | /** @type {number[]} */
640 | this._resetIndexes = resetIndexes;
641 |
642 | /** @type {number} */
643 | this._volume = 0.5;
644 | }
645 |
646 | /**
647 | * Add
648 | *
649 | * @param {DeckItem} deck
650 | * @returns {void}
651 | */
652 | add(deck) {
653 | this._items.push(deck);
654 | }
655 |
656 | /**
657 | * Find
658 | *
659 | * @param {number} index
660 | * @returns {DeckItem[]}
661 | */
662 | find(index) {
663 | let res = [];
664 | this.getAll().forEach(deck => {
665 | if (deck.indexes().includes(index)) {
666 | res.push(deck);
667 | }
668 | });
669 | return res;
670 | }
671 |
672 | /**
673 | * Get the all
674 | *
675 | * @returns {DeckItem[]}
676 | */
677 | getAll() {
678 | return this._items;
679 | }
680 |
681 | /**
682 | * Skip
683 | *
684 | * @param {number} second
685 | * @returns {void}
686 | */
687 | skip(second) {
688 | this.getAll().forEach(item => {
689 | item.container(container => {
690 | if (container.playing()) {
691 | container.skip(second);
692 | }
693 | });
694 | });
695 | }
696 |
697 | /**
698 | * Clear all
699 | *
700 | * @returns {void}
701 | */
702 | clearAll() {
703 | this.getAll().forEach(item => {
704 | item.container(container => {
705 | container.clear();
706 | });
707 | });
708 | }
709 |
710 | /**
711 | * Clear indexes
712 | *
713 | * @param {number[]} [indexes]
714 | * @returns {number[]}
715 | */
716 | clearIndexes(indexes) {
717 | if (indexes) {
718 | return (this._clearIndexes = indexes);
719 | }
720 | return this._clearIndexes;
721 | }
722 |
723 | /**
724 | * Reset all
725 | *
726 | * @returns {void}
727 | */
728 | resetAll() {
729 | this.getAll().forEach(item => {
730 | item.reset();
731 | });
732 | mediaViewerContainer.innerHTML = "";
733 | }
734 |
735 | /**
736 | * Reset indexes
737 | *
738 | * @param {number[]} [indexes]
739 | * @returns {number[]}
740 | */
741 | resetIndexes(indexes) {
742 | if (indexes) {
743 | return (this._resetIndexes = indexes);
744 | }
745 | return this._resetIndexes;
746 | }
747 |
748 | /**
749 | * Update
750 | *
751 | * @param {Gamepad} gamepad
752 | * @returns {void}
753 | */
754 | update(gamepad) {
755 | let flag = false;
756 | let count = this._count++;
757 | let buttons = gamepad.buttons();
758 | for (const index of this.resetIndexes()) {
759 | if (0 < buttons.find(index).length) {
760 | flag = true;
761 | this.resetAll();
762 | break;
763 | }
764 | }
765 | if (!flag) {
766 | for (const index of this.clearIndexes()) {
767 | if (0 < buttons.find(index).length) {
768 | flag = true;
769 | this.clearAll();
770 | break;
771 | }
772 | }
773 | }
774 | if (!flag) {
775 | if (gamepad.commands().yAxis().includes(Axis.VALUE_DOWN)
776 | || gamepad.leftAxis().yAxis().includes(Axis.VALUE_DOWN)) {
777 | this.volume(-0.1);
778 | } else if (gamepad.commands().yAxis().includes(Axis.VALUE_UP)
779 | || gamepad.leftAxis().yAxis().includes(Axis.VALUE_UP)) {
780 | this.volume(0.1);
781 | } else if (gamepad.commands().xAxis().includes(Axis.VALUE_LEFT)
782 | || gamepad.leftAxis().xAxis().includes(Axis.VALUE_LEFT)) {
783 | this.skip(-5);
784 | } else if (gamepad.commands().xAxis().includes(Axis.VALUE_RIGHT)
785 | || gamepad.leftAxis().xAxis().includes(Axis.VALUE_RIGHT)) {
786 | this.skip(5);
787 | } else {
788 | for (const button of buttons.getAll()) {
789 | if (!button.hold()) {
790 | this.find(button.index()).forEach(item => {
791 | let container = item.container(true);
792 | if (container) {
793 | let itemValueHash = encodeURIComponent(item.value());
794 | if (!mediaViewerContainer.querySelector(`[data-value="${itemValueHash}"][data-index*="ButtonIndex_${button.index()}"]`)) {
795 | let rapper = document.createElement("div");
796 | let indexes = [];
797 | item.indexes().forEach(index => {
798 | indexes.push(`ButtonIndex_${index}`);
799 | });
800 | rapper.dataset.type = item.type();
801 | rapper.dataset.index = indexes.join(" ");
802 | rapper.dataset.value = itemValueHash;
803 | rapper.append(container.get());
804 | mediaViewerContainer.append(rapper);
805 | }
806 | item.play(this.volume());
807 | item.updateOrder(count);
808 | }
809 | });
810 | }
811 | }
812 | }
813 | }
814 | this.getAll().forEach(item => {
815 | if ([DeckContainer_Abstract.TYPE_HTML, DeckContainer_Abstract.TYPE_OTHER].includes(item.type())) {
816 | item.container(container => {
817 | container.get().contentWindow.postMessage({
818 | action: Deck.NAME_MESSAGE,
819 | message: {
820 | axes: {
821 | commands: gamepad.commands().hold() ? [] : gamepad.commands().values(),
822 | leftAxis: gamepad.leftAxis().hold() ? [] : gamepad.leftAxis().values(),
823 | rightAxis: gamepad.rightAxis().hold() ? [] : gamepad.rightAxis().values(),
824 | hold: {
825 | commands: !gamepad.commands().hold() ? [] : gamepad.commands().values(),
826 | leftAxis: !gamepad.leftAxis().hold() ? [] : gamepad.leftAxis().values(),
827 | rightAxis: !gamepad.rightAxis().hold() ? [] : gamepad.rightAxis().values()
828 | }
829 | },
830 | state: container.state(),
831 | type: item.type(),
832 | url: window.location.href,
833 | volume: this.volume()
834 | }
835 | }, "*");
836 | });
837 | }
838 | });
839 |
840 | }
841 |
842 | /**
843 | * Volume
844 | *
845 | * @param {number} add
846 | * @returns {number}
847 | */
848 | volume(add) {
849 | let volume = this._volume * 100;
850 | if ((0 > add) || (0 < add)) {
851 | volume = volume + (add * 100);
852 | if (0 > volume) {
853 | volume = 0;
854 | } else if (100 < volume) {
855 | volume = 100;
856 | }
857 | volume = volume / 100;
858 | this._volume = volume;
859 | } else {
860 | volume = volume / 100;
861 | }
862 | this.getAll().forEach(item => {
863 | item.container(container => {
864 | container.volume(volume);
865 | });
866 | });
867 | return volume;
868 | }
869 | }
870 |
871 | let mediaViewerContainer = document.getElementById("GIDDeck");
872 |
--------------------------------------------------------------------------------
/js/gamepad.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Axis Class
3 | *
4 | * @class
5 | */
6 | class Axis {
7 |
8 | /** @type {number} */
9 | static DEFAULT_THRESHOLD = 0.45;
10 |
11 | /** @type {string} */
12 | static VALUE_LEFT = "Left";
13 |
14 | /** @type {string} */
15 | static VALUE_RIGHT = "Right";
16 |
17 | /** @type {string} */
18 | static VALUE_UP = "Up";
19 |
20 | /** @type {string} */
21 | static VALUE_DOWN = "Down";
22 |
23 | /** @type {string} */
24 | static POSITION_BUTTON = "B";
25 |
26 | /** @type {string} */
27 | static POSITION_COMMAND = "C";
28 |
29 | /** @type {string} */
30 | static POSITION_LEFT = "L";
31 |
32 | /** @type {string} */
33 | static POSITION_RIGHT = "R";
34 |
35 | /**
36 | * Factory by axes(X-axis and Y-axis)
37 | *
38 | * @param {string} position
39 | * @param {number} xAxis
40 | * @param {number} yAxis
41 | * @param {number} [threshold]
42 | * @returns {Axis}
43 | */
44 | static factoryByAxes = (position, xAxis, yAxis, threshold = Axis.DEFAULT_THRESHOLD) => {
45 | const getValue = (axis, valueA, valueB) => {
46 | let res = [];
47 | if ((threshold * -1) > axis) {
48 | res.push(valueA);
49 | } else if (threshold < axis) {
50 | res.push(valueB);
51 | }
52 | return res;
53 | }
54 | return new Axis(position, getValue(xAxis, Axis.VALUE_LEFT, Axis.VALUE_RIGHT), getValue(yAxis, Axis.VALUE_UP, Axis.VALUE_DOWN));
55 | }
56 |
57 | /**
58 | * @param {string} position
59 | * @param {string[]} [xAxis]
60 | * @param {string[]} [yAxis]
61 | * @param {boolead} [hold]
62 | */
63 | constructor(position, xAxis = [], yAxis = [], hold = false) {
64 |
65 | /** @type {string} */
66 | this._position = position;
67 |
68 | /** @type {string[]} */
69 | this._xAxis = xAxis;
70 |
71 | /** @type {string[]} */
72 | this._yAxis = yAxis;
73 |
74 | /** @type {boolean} */
75 | this._hold = hold;
76 | }
77 |
78 | /**
79 | * Hold
80 | *
81 | * @param {boolean} [hold]
82 | * @returns {boolean}
83 | */
84 | hold = (hold) => {
85 | if ((true === hold) || (false === hold)) {
86 | return (this._hold = hold);
87 | }
88 | return this._hold;
89 | }
90 |
91 | /**
92 | * Not entered
93 | *
94 | * @returns {boolean}
95 | */
96 | notEntered = () => {
97 | return !this._xAxis.length && !this._yAxis.length;
98 | }
99 |
100 | /**
101 | * Position
102 | *
103 | * @returns {string}
104 | */
105 | position = () => {
106 | return this._position;
107 | }
108 |
109 | /**
110 | * Values
111 | *
112 | * @returns {string[]}
113 | */
114 | values = () => {
115 | return [...this.xAxis(), ...this.yAxis()];
116 | }
117 |
118 | /**
119 | * X-Axis
120 | *
121 | * @param {string[]} [axis]
122 | * @returns {string[]}
123 | */
124 | xAxis = (axis) => {
125 | if (axis) {
126 | return (this._xAxis = axis);
127 | }
128 | return this._xAxis;
129 | }
130 |
131 | /**
132 | * Y-Axis
133 | *
134 | * @param {string[]} [axis]
135 | * @returns {string[]}
136 | */
137 | yAxis = (axis) => {
138 | if (axis) {
139 | return (this._yAxis = axis);
140 | }
141 | return this._yAxis;
142 | }
143 | }
144 |
145 | /**
146 | * Button Class
147 | *
148 | * @class
149 | */
150 | class Button {
151 |
152 | /**
153 | * Constructor
154 | *
155 | * @param {array} button
156 | * @param {number} index
157 | * @param {boolean} [hold]
158 | */
159 | constructor(button, index, hold = false) {
160 |
161 | /** @type {number} */
162 | this._index = index;
163 |
164 | /** @type {boolean} */
165 | this._button = button;
166 |
167 | /** @type {boolean} */
168 | this._hold = hold;
169 | }
170 |
171 | /**
172 | * Hold
173 | *
174 | * @param {boolean} [hold]
175 | * @returns {boolean}
176 | */
177 | hold = (hold) => {
178 | if ((true === hold) || (false === hold)) {
179 | return (this._hold = hold);
180 | }
181 | return this._hold;
182 | }
183 |
184 | /**
185 | * Index
186 | *
187 | * @returns {number}
188 | */
189 | index = () => {
190 | return this._index;
191 | }
192 |
193 | /**
194 | * Pressed
195 | *
196 | * @returns {boolean}
197 | */
198 | pressed = () => {
199 | return this._rawButton().pressed;
200 | }
201 |
202 | /**
203 | * Touched
204 | *
205 | * @returns {boolean}
206 | */
207 | touched = () => {
208 | return this._rawButton().touched;
209 | }
210 |
211 | /**
212 | * Value
213 | *
214 | * @returns {number}
215 | */
216 | value = () => {
217 | return this._rawButton().value;
218 | }
219 |
220 | /**
221 | * Raw button
222 | *
223 | * @returns {object}
224 | */
225 | _rawButton = () => {
226 | if (!this._button) {
227 | return {
228 | pressed: false,
229 | touched: false,
230 | value: 0
231 | }
232 | }
233 | return this._button;
234 | }
235 |
236 | }
237 |
238 |
239 | /**
240 | * Buttons Class
241 | *
242 | * @class
243 | */
244 | class Buttons {
245 |
246 | /**
247 | * @param {array} buttons
248 | * @returns {Buttons}
249 | */
250 | static factory = (buttons) => {
251 | let buttonArray = [];
252 | let buttonIndexes = [];
253 | let directional = new Axis(Axis.POSITION_BUTTON);
254 | for (let i = 0; i < buttons.length; i++) {
255 | if (!parameterSetting.excludeButtons().includes(String(i)) && buttons[i].pressed) {
256 | let buttonIndexConverts = parameterSetting.buttonIndexConverts();
257 | buttonIndexes = [];
258 | if (buttonIndexConverts.has(i)) {
259 | buttonIndexes = buttonIndexConverts.get(i);
260 | } else {
261 | buttonIndexes = [i];
262 | }
263 | buttonIndexes.forEach(buttonIndex => {
264 | let directionalButtons = parameterSetting.directionalButtons();
265 | buttonArray.push(new Button(buttons[i], buttonIndex));
266 | if (directionalButtons.up.includes(buttonIndex)) {
267 | directional.yAxis().push(Axis.VALUE_UP);
268 | }
269 | if (directionalButtons.down.includes(buttonIndex)) {
270 | directional.yAxis().push(Axis.VALUE_DOWN);
271 | }
272 | if (directionalButtons.left.includes(buttonIndex)) {
273 | directional.xAxis().push(Axis.VALUE_LEFT);
274 | }
275 | if (directionalButtons.right.includes(buttonIndex)) {
276 | directional.xAxis().push(Axis.VALUE_RIGHT);
277 | }
278 | });
279 | }
280 | }
281 | return new Buttons(buttonArray, directional);
282 | }
283 |
284 | /**
285 | * @param {Button[]} [buttons]
286 | * @param {Axis} [directional]
287 | */
288 | constructor(buttons, directional) {
289 |
290 | /** @type {Button[]} */
291 | this._buttons = buttons;
292 |
293 | /** @type {Axis} */
294 | this._directional = directional;
295 | }
296 |
297 | /**
298 | * Count
299 | *
300 | * @returns {number}
301 | */
302 | count = () => {
303 | return this.getAll().length;
304 | }
305 |
306 | /**
307 | * Directional
308 | *
309 | * @param {Axis} [directional]
310 | * @returns {Axis}
311 | */
312 | directional = (directional) => {
313 | if (directional) {
314 | return (this._directional = directional);
315 | }
316 | return this._directional;
317 | }
318 |
319 | /**
320 | * Find by button index
321 | *
322 | * @param {number} index
323 | * @returns {Button[]}
324 | */
325 | find = (index = -1) => {
326 | let res = [];
327 | if (0 <= index) {
328 | this.getAll().forEach(button => {
329 | if (index === button.index()) {
330 | res.push(button);
331 | }
332 | });
333 | }
334 | return res;
335 | }
336 |
337 | /**
338 | * Get the all
339 | *
340 | * @returns {Button[]}
341 | */
342 | getAll = () => {
343 | return this._buttons;
344 | }
345 |
346 | /**
347 | * Not entered
348 | *
349 | * @returns {boolean}
350 | */
351 | notEntered = () => {
352 | for (const button of this.getAll()) {
353 | if (button.pressed()) {
354 | return false;
355 | }
356 | }
357 | return true;
358 | }
359 |
360 | }
361 |
362 | /**
363 | * Axis: 10: Up and Left
364 | *
365 | * @type {number}
366 | */
367 | const AXIS_10_UP_LEFT = 1;
368 |
369 | /**
370 | * Axis: 10: Left
371 | *
372 | * @type {number}
373 | */
374 | const AXIS_10_LEFT = 0.7142857313156128;
375 |
376 | /**
377 | * Axis: 10: Down and Left
378 | *
379 | * @type {number}
380 | */
381 | const AXIS_10_DOWN_LEFT = 0.4285714626312256;
382 |
383 | /**
384 | * Axis: 10: Down
385 | *
386 | * @type {number}
387 | */
388 | const AXIS_10_DOWN = 0.14285719394683838;
389 |
390 | /**
391 | * Axis: 10: Down and Right
392 | *
393 | * @type {number}
394 | */
395 | const AXIS_10_DOWN_RIGHT = -0.1428571343421936;
396 |
397 | /**
398 | * Axis: 10: Right
399 | *
400 | * @type {number}
401 | */
402 | const AXIS_10_RIGHT = -0.4285714030265808;
403 |
404 | /**
405 | * Axis: 10: Up and Right
406 | *
407 | * @type {number}
408 | */
409 | const AXIS_10_UP_RIGHT = -0.7142857313156128;
410 |
411 | /**
412 | * Axis: 10: Up
413 | *
414 | * @type {number}
415 | */
416 | const AXIS_10_UP = -1;
417 |
418 | /**
419 | * Gamepad Class
420 | *
421 | * @class
422 | */
423 | class Gamepad {
424 |
425 | /**
426 | * Get the Game Pads
427 | *
428 | * @returns {array}
429 | */
430 | static getGamePads = () => {
431 | return navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);
432 | }
433 |
434 | /**
435 | * @param {array} gamepad
436 | * @param {number} index Controller Index
437 | * @param {Gamepad} [beforeGamepad]
438 | * @returns {Gamepad}
439 | */
440 | static factory = (gamepad, index, beforeGamepad) => {
441 |
442 | /**
443 | * @param {Gamepad} gamepad
444 | * @returns {Axis} Merged Axis
445 | */
446 | const mergeAxis = (gamepad) => {
447 | let mergeAxis = new Axis(Axis.POSITION_COMMAND);
448 | [gamepad.buttons().directional(), gamepad.leftAxis()].forEach(command => {
449 | command.xAxis().forEach(val => {
450 | if (!mergeAxis.xAxis().includes(val)) {
451 | mergeAxis.xAxis().push(val);
452 | }
453 | });
454 | command.yAxis().forEach(val => {
455 | if (!mergeAxis.yAxis().includes(val)) {
456 | mergeAxis.yAxis().push(val);
457 | }
458 | });
459 | });
460 | return mergeAxis;
461 | }
462 |
463 | /** @type {Gamepad} */
464 | let newGamepad;
465 |
466 | /** @type {Buttons} */
467 | let buttons;
468 |
469 | /** @type {Axis} */
470 | let leftAxis;
471 |
472 | /** @type {Axis} */
473 | let rightAxis;
474 |
475 | /** @type {Axis} */
476 | let newCommandAxis;
477 |
478 | /** @type {Axis} */
479 | let directional;
480 |
481 | if (gamepad && gamepad.connected) {
482 | buttons = Buttons.factory(gamepad.buttons);
483 | if (gamepad.axes) {
484 | switch (gamepad.axes.length) {
485 | case 4:
486 | leftAxis = Axis.factoryByAxes(Axis.POSITION_LEFT, gamepad.axes[0], gamepad.axes[1]);
487 | rightAxis = Axis.factoryByAxes(Axis.POSITION_RIGHT, gamepad.axes[2], gamepad.axes[3]);
488 | break;
489 | case 10:
490 | let directional = buttons.directional();
491 | switch (gamepad.axes[9]) {
492 | case AXIS_10_UP:
493 | directional.yAxis().push(Axis.VALUE_UP);
494 | break;
495 | case AXIS_10_UP_LEFT:
496 | directional.yAxis().push(Axis.VALUE_UP);
497 | directional.xAxis().push(Axis.VALUE_LEFT);
498 | break;
499 | case AXIS_10_UP_RIGHT:
500 | directional.yAxis().push(Axis.VALUE_UP);
501 | directional.xAxis().push(Axis.VALUE_RIGHT);
502 | break;
503 | case AXIS_10_DOWN:
504 | directional.yAxis().push(Axis.VALUE_DOWN);
505 | break;
506 | case AXIS_10_DOWN_LEFT:
507 | directional.yAxis().push(Axis.VALUE_DOWN);
508 | directional.xAxis().push(Axis.VALUE_LEFT);
509 | break;
510 | case AXIS_10_DOWN_RIGHT:
511 | directional.yAxis().push(Axis.VALUE_DOWN);
512 | directional.xAxis().push(Axis.VALUE_RIGHT);
513 | break;
514 | case AXIS_10_LEFT:
515 | directional.xAxis().push(Axis.VALUE_LEFT);
516 | break;
517 | case AXIS_10_RIGHT:
518 | directional.xAxis().push(Axis.VALUE_RIGHT);
519 | break;
520 | }
521 | case 9:
522 | leftAxis = Axis.factoryByAxes(Axis.POSITION_LEFT, gamepad.axes[0], gamepad.axes[1]);
523 | rightAxis = Axis.factoryByAxes(Axis.POSITION_RIGHT, gamepad.axes[2], gamepad.axes[5]);
524 | default:
525 | break;
526 | }
527 | } else {
528 | leftAxis = new Axis();
529 | rightAxis = new Axis();
530 | }
531 | } else {
532 | buttons = new Buttons();
533 | leftAxis = new Axis();
534 | rightAxis = new Axis();
535 | }
536 | newGamepad = new Gamepad(buttons, leftAxis, rightAxis, index, gamepad.timestamp);
537 | newCommandAxis = mergeAxis(newGamepad);
538 | newGamepad.commands(newCommandAxis);
539 | if (beforeGamepad && (index == beforeGamepad.index())) {
540 | /**
541 | * @param {Axis} newAxis
542 | * @param {Axis} beforeAxis
543 | * @param {boolean} hold
544 | * @returns {void}
545 | */
546 | const updateAxisHold = (newAxis, beforeAxis, hold) => {
547 | if ((newAxis.xAxis().length || newAxis.yAxis().length)
548 | && (newAxis.xAxis().join("-") == beforeAxis.xAxis().join("-"))
549 | && (newAxis.yAxis().join("-") == beforeAxis.yAxis().join("-"))) {
550 | hold = (hold || beforeAxis.hold());
551 | // hold = true;
552 | } else {
553 | hold = false;
554 | }
555 | newAxis.hold(hold);
556 | }
557 | let hold = 1 < newGamepad.timestamp() - beforeGamepad.timestamp(); // TODO Hold Check
558 | if (beforeGamepad.commands()) {
559 | updateAxisHold(newCommandAxis, beforeGamepad.commands(), hold);
560 | newGamepad.buttons().directional().hold(newCommandAxis.hold());
561 | newGamepad.leftAxis().hold(newCommandAxis.hold());
562 | }
563 | // updateAxisHold(newGamepad.leftAxis(), beforeGamepad.leftAxis(), hold);
564 | updateAxisHold(newGamepad.rightAxis(), beforeGamepad.rightAxis(), hold);
565 | newGamepad.buttons().getAll().forEach(button => {
566 | if (button.pressed()) {
567 | beforeGamepad.buttons().getAll().forEach(btn => {
568 | if ((button.index() == btn.index()) && btn.pressed()) {
569 | button.hold(hold || btn.hold());
570 | }
571 | });
572 | }
573 | });
574 | }
575 | return newGamepad;
576 | }
577 |
578 | /**
579 | * @param {Buttons} buttons
580 | * @param {Axis} leftAxis
581 | * @param {Axis} rightAxis
582 | * @param {number} [index]
583 | * @param {number} [timestamp]
584 | */
585 | constructor(buttons, leftAxis, rightAxis, index, timestamp) {
586 |
587 | /** @type {Buttons} */
588 | this._buttons = buttons;
589 |
590 | /** @type {Axis} */
591 | this._commands;
592 |
593 | /** @type {Axis} */
594 | this._leftAxis = leftAxis;
595 |
596 | /** @type {Axis} */
597 | this._rightAxis = rightAxis;
598 |
599 | /** @type {number} */
600 | this._index = index;
601 |
602 | /** @type {number} */
603 | this._timestamp = timestamp;
604 | }
605 |
606 | /**
607 | * Buttons
608 | *
609 | * @returns {Buttons}
610 | */
611 | buttons = () => {
612 | return this._buttons;
613 | }
614 |
615 | /**
616 | * Commands
617 | *
618 | * @param {Axis} [commands]
619 | * @returns {Axis}
620 | */
621 | commands = (commands) => {
622 | if (commands) {
623 | return (this._commands = commands);
624 | }
625 | return this._commands;
626 | }
627 |
628 | /**
629 | * Index
630 | *
631 | * @returns {number}
632 | */
633 | index = () => {
634 | return this._index;
635 | }
636 |
637 | /**
638 | * Left Axis
639 | *
640 | * @returns {Axis}
641 | */
642 | leftAxis = () => {
643 | return this._leftAxis;
644 | }
645 |
646 | /**
647 | * Not entered
648 | *
649 | * @returns {boolean}
650 | */
651 | notEntered = () => {
652 | return this.buttons().notEntered()
653 | && this.buttons().directional().notEntered()
654 | && this.leftAxis().notEntered()
655 | && this.rightAxis().notEntered();
656 | }
657 |
658 | /**
659 | * Right Axis
660 | *
661 | * @returns {Axis}
662 | */
663 | rightAxis = () => {
664 | return this._rightAxis;
665 | }
666 |
667 | /**
668 | * Timestamp
669 | *
670 | * @returns {number}
671 | */
672 | timestamp = () => {
673 | return this._timestamp;
674 | }
675 | }
676 |
--------------------------------------------------------------------------------
/js/main.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Modes: Controller
3 | *
4 | * @type {string}
5 | */
6 | const MODES_CONTROLLER = "Controller";
7 |
8 | /**
9 | * Modes: Debug
10 | *
11 | * @type {string}
12 | */
13 | const MODES_DEBUG = "Debug";
14 |
15 | /**
16 | * Modes: Key log
17 | *
18 | * @type {string}
19 | */
20 | const MODES_KEYLOG = "KeyLog";
21 |
22 | /**
23 | * Modes: Deck
24 | *
25 | * @type {string}
26 | */
27 | const MODES_DECK = "Deck";
28 |
29 | /** @type {string} */
30 | const ID_CONTAINER = "GameInputDisplay";
31 |
32 | /** @type {string} */
33 | const ID_DEBUG = "GIDDebug";
34 |
35 | /** @type {string} */
36 | const ID_GAMECONTROLLER = "GIDGameController";
37 |
38 | /** @type {string} */
39 | const ID_KEYLOG = "GIDKeyLog";
40 |
41 | /** @type {string} */
42 | const ID_Settings = "GIDSettings";
43 |
44 | /**
45 | * Directional buttons hash
46 | *
47 | * @typeof {DirectionalButtonsHash}
48 | * @type {object}
49 | * @property {number[]} up
50 | * @property {number[]} down
51 | * @property {number[]} left
52 | * @property {number[]} right
53 | */
54 |
55 | /**
56 | * Parameter setting class
57 | *
58 | * @class
59 | */
60 | class ParameterSetting {
61 |
62 | /**
63 | * Default: COntroller index
64 | *
65 | * @type {number}
66 | */
67 | static DEFAULT_CONTROLLER_INDEX = 0;
68 |
69 | /**
70 | * Default: Delay (Millisecond)
71 | *
72 | * @type {number}
73 | */
74 | static DEFAULT_DELAY = 8;
75 |
76 | /**
77 | * Default: Directional buttons
78 | *
79 | * @type {DirectionalButtonsHash}
80 | */
81 | static DEFAULT_DIRECTIONAL_BUTTONS = {
82 | up: [12],
83 | down: [13],
84 | left: [14],
85 | right: [15]
86 | };
87 |
88 | /**
89 | * Default: Items
90 | *
91 | * @type {number}
92 | */
93 | static DEFAULT_KEY_LOG_ITEMS = 40;
94 |
95 | /**
96 | * Default: Log limit
97 | *
98 | * @type {number}
99 | */
100 | static DEFAULT_LOG_LIMIT = 30;
101 |
102 | /**
103 | * Default: Modes
104 | *
105 | * @type {string[]}
106 | */
107 | static DEFAULT_MODES = `${MODES_CONTROLLER},${MODES_KEYLOG}`;
108 |
109 | /**
110 | * Default: Styles
111 | *
112 | * @type {string}
113 | */
114 | static DEFAULT_STYLES = "ProPad,KeyLog_ButtonSymbol_PS_DualShock";
115 |
116 | /**
117 | * Get parameter key: Button index converts
118 | *
119 | * @type {string}
120 | */
121 | static KEY_BUTTON_INDEX_CONVERTS = "converts";
122 |
123 | /**
124 | * Get parameter key: Controller index
125 | *
126 | * @type {string}
127 | */
128 | static KEY_CONTROLLER_INDEX = "controller";
129 |
130 | /**
131 | * Get parameter key: Deck
132 | *
133 | * @type {string}
134 | */
135 | static KEY_DECK = "deck";
136 |
137 | /**
138 | * Get parameter key: Directional button indexes
139 | *
140 | * @type {string}
141 | */
142 | static KEY_DIRECTIONAL_BUTTON_INDEXES = "directionals";
143 |
144 | /**
145 | * Get parameter key: Exclude button indexs
146 | *
147 | * @type {string}
148 | * @description Comma Separated Value
149 | * @example index.html?excludes=8,9
150 | */
151 | static KEY_EXCLUDE_BUTTONS = "excludes";
152 |
153 | /**
154 | * Get parameter key: Input delay
155 | *
156 | * @type {string}
157 | * @description Millisecond
158 | * @example index.html?delay=4
159 | */
160 | static KEY_INPUT_DELAY = "delay";
161 |
162 | /**
163 | * Get parameter key: Items
164 | *
165 | * @type {string}
166 | */
167 | static KEY_KEY_LOG_ITEMS = "items";
168 |
169 | /**
170 | * Get parameter key: Log limit
171 | *
172 | * @type {string}
173 | * @description Log limit is Key log lines
174 | * @example index.html?log=15
175 | */
176 | static KEY_LOG_LIMIT = "log";
177 |
178 | /**
179 | * Get parameter key: Models
180 | *
181 | * @type {string}
182 | * @example index.html?modes=Debug
183 | */
184 | static KEY_MODES = "modes";
185 |
186 | /**
187 | * Get parameter key: Styles
188 | *
189 | * @type {string}
190 | * @description Comma Separated Value
191 | * @example index.html?styles=SkinSakura,SkinChoco,Skin7
192 | */
193 | static KEY_STYLES = "styles";
194 |
195 | /**
196 | * Get parameter value: Deck: Clear
197 | *
198 | * @type {string}
199 | */
200 | static VALUE_DECK_CLEAR = "Clear";
201 |
202 | /**
203 | * Get parameter value: Deck: Reset
204 | *
205 | * @type {string}
206 | */
207 | static VALUE_DECK_RESET = "Reset";
208 |
209 | /**
210 | * @returns {ParameterSetting}
211 | */
212 | static factory = () => {
213 | return new ParameterSetting();
214 | }
215 |
216 | constructor() {
217 |
218 | /** @type {URLSearchParams} */
219 | this._searchParams = (new URL(window.location.href)).searchParams;
220 |
221 | this.updateParams();
222 | }
223 |
224 | /**
225 | * Button index converts
226 | *
227 | * @returns {Map}
228 | */
229 | buttonIndexConverts = () => {
230 | return this._buttonIndexConverts;
231 | }
232 |
233 | /**
234 | * Check the modes
235 | *
236 | * @param {(string|string[])} modes
237 | * @returns {boolean}
238 | */
239 | checkModes = (modes) => {
240 | let res = false;
241 | if (!Array.isArray(modes)) {
242 | return this.checkModes([modes]);
243 | } else {
244 | let ms = this.modes();
245 | for (let mode of modes) {
246 | if (!res && ms.includes(mode)) {
247 | res = true;
248 | break;
249 | }
250 | }
251 | }
252 | return res;
253 | }
254 |
255 | /**
256 | * Controller index
257 | *
258 | * @returns {number}
259 | */
260 | controllerIndex = () => {
261 | return this._controllerIndex;
262 | }
263 |
264 | /**
265 | * Deck
266 | *
267 | * @returns {Deck}
268 | */
269 | deck = () => {
270 | return this._deck;
271 | }
272 |
273 | /**
274 | * Delay
275 | *
276 | * @returns {number}
277 | */
278 | delay = () => {
279 | return this._delay;
280 | }
281 |
282 | /**
283 | * Directional buttons
284 | *
285 | * @param {DirectionalButtonsHash} [directionalButtons]
286 | * @returns {DirectionalButtonsHash}
287 | */
288 | directionalButtons = (directionalButtons) => {
289 | if (directionalButtons) {
290 | return (this._directionalButtons = directionalButtons);
291 | }
292 | return this._directionalButtons;
293 | }
294 |
295 | /**
296 | * Exclude buttons
297 | *
298 | * @returns {number[]}
299 | */
300 | excludeButtons = () => {
301 | return this._excludeButtons;
302 | }
303 |
304 | /**
305 | * Find
306 | *
307 | * @param {string} key
308 | * @param {string} [defaultValue = ""]
309 | * @returns {string}
310 | */
311 | find = (key, defaultValue = "") => {
312 | let res = this.searchParams().get(key);
313 | if ((undefined === res) || (null === res)) {
314 | return defaultValue;
315 | }
316 | return res;
317 | }
318 |
319 | /**
320 | * Key log items
321 | *
322 | * @returns {number}
323 | */
324 | keyLogItems = () => {
325 | return this._keyLogItems;
326 | }
327 |
328 | /**
329 | * Log limit
330 | *
331 | * @returns {number}
332 | */
333 | logLimit = () => {
334 | return this._logLimit;
335 | }
336 |
337 | /**
338 | * Modes
339 | *
340 | * @returns {string[]}
341 | */
342 | modes = () => {
343 | return this._modes;
344 | }
345 |
346 | /**
347 | * Search params
348 | *
349 | * @returns {URLSearchParams}
350 | */
351 | searchParams = () => {
352 | return this._searchParams;
353 | }
354 |
355 | /**
356 | * Styles
357 | *
358 | * @returns {string}
359 | */
360 | styles = () => {
361 | return this._styles;
362 | }
363 |
364 | /**
365 | * Update the parameters
366 | *
367 | * @returns {void}
368 | */
369 | updateParams = () => {
370 |
371 | let buttonIndexConverts = new Map();
372 | let directionalButtons = ParameterSetting.DEFAULT_DIRECTIONAL_BUTTONS;
373 | let biConverts = this.find(ParameterSetting.KEY_BUTTON_INDEX_CONVERTS);
374 | let dButtons = this.find(ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES);
375 |
376 | if ("" != biConverts) {
377 | let convert = [];
378 | let convertFrom;
379 | let convertTo;
380 | let regexp = /\d+/igu;
381 | biConverts.split(",").forEach(cnvt => {
382 | convert = cnvt.match(regexp);
383 | if (2 == convert.length) {
384 | convertFrom = parseInt(convert[0]);
385 | convertTo = parseInt(convert[1]);
386 | if (!buttonIndexConverts.has(convertFrom)) {
387 | buttonIndexConverts.set(convertFrom, [convertTo]);
388 | } else {
389 | buttonIndexConverts.get(convertFrom).push(convertTo);
390 | }
391 | }
392 | });
393 | }
394 |
395 | if (dButtons && (4 == dButtons.split("-").length)) {
396 | let dpi = [];
397 | dButtons.split("-").forEach((dpIndexes, index) => {
398 | dpi[index] = [];
399 | dpIndexes.split(",").forEach(dpIndex => {
400 | dpi[index].push(Number.parseInt(dpIndex));
401 | });
402 | });
403 | directionalButtons = {
404 | up: dpi[0],
405 | down: dpi[1],
406 | left: dpi[2],
407 | right: dpi[3]
408 | }
409 | }
410 |
411 | let deck = new Deck();
412 | let deckSetting = this.find(ParameterSetting.KEY_DECK);
413 | if ("" != deckSetting) {
414 | let setting = {};
415 | let index;
416 | let value;
417 | deckSetting.split(",").forEach(item => {
418 | index = Number(item.replace(/\-.+$/i, ""));
419 | value = decodeURIComponent(item.replace(/^\d+\-/i, ""));
420 | if (0 <= index) {
421 | if (!setting[value]) {
422 | setting[value] = [index];
423 | } else {
424 | setting[value].push(index);
425 | }
426 | }
427 | });
428 | for (const key in setting) {
429 | switch (key) {
430 | case ParameterSetting.VALUE_DECK_CLEAR:
431 | deck.clearIndexes(setting[key]);
432 | break;
433 | case ParameterSetting.VALUE_DECK_RESET:
434 | deck.resetIndexes(setting[key]);
435 | break;
436 | default:
437 | // if (DeckContainer_Abstract.TYPE_OTHER != DeckItem.getType(key)) {
438 | deck.add(new DeckItem(setting[key], key));
439 | // }
440 | break;
441 | }
442 | }
443 | }
444 |
445 | /**
446 | * Button index converts
447 | *
448 | * @type {Map}
449 | */
450 | this._buttonIndexConverts = buttonIndexConverts;
451 |
452 | /**
453 | * Controller index
454 | *
455 | * @type {number}
456 | */
457 | this._controllerIndex = this.find(ParameterSetting.KEY_CONTROLLER_INDEX, ParameterSetting.DEFAULT_CONTROLLER_INDEX);
458 |
459 | /**
460 | * Deck
461 | *
462 | * @type {Deck}
463 | */
464 | this._deck = deck;
465 |
466 | /**
467 | * Delay
468 | *
469 | * @type {number}
470 | */
471 | this._delay = this.find(ParameterSetting.KEY_INPUT_DELAY, ParameterSetting.DEFAULT_DELAY);
472 |
473 | /**
474 | * Directiona buttons
475 | *
476 | * @type {DirectionalButtonsHash}
477 | */
478 | this._directionalButtons = directionalButtons;
479 |
480 | /**
481 | * Exclude buttons
482 | *
483 | * @types {number[]}
484 | */
485 | this._excludeButtons = this.find(ParameterSetting.KEY_EXCLUDE_BUTTONS).split(",");
486 |
487 | /**
488 | * Key log items
489 | *
490 | * @type {number}
491 | */
492 | this._keyLogItems = this.find(ParameterSetting.KEY_KEY_LOG_ITEMS, ParameterSetting.DEFAULT_KEY_LOG_ITEMS);
493 |
494 | /**
495 | * Log limit
496 | *
497 | * @type {number}
498 | */
499 | this._logLimit = this.find(ParameterSetting.KEY_LOG_LIMIT, ParameterSetting.DEFAULT_LOG_LIMIT);
500 |
501 | /**
502 | * Modes
503 | *
504 | * @type {string[]}
505 | */
506 | this._modes = this.find(ParameterSetting.KEY_MODES, ParameterSetting.DEFAULT_MODES).split(",");
507 |
508 | /**
509 | * Styles
510 | *
511 | * @type {string}
512 | */
513 | this._styles = this.find(ParameterSetting.KEY_STYLES, ParameterSetting.DEFAULT_STYLES).split(",").join(" ");
514 | }
515 | }
516 |
517 | /** @type {HTMLElement} */
518 | let controllerContainer = document.getElementById(ID_GAMECONTROLLER);
519 |
520 | /** @type {HTMLElement} */
521 | let debugContainer = document.querySelectorAll(`#${ID_DEBUG} > .controllers > dl`);
522 |
523 | /** @type {HTMLElement} */
524 | let keyLogContainer = document.getElementById(ID_KEYLOG);
525 |
526 | /** @type {HTMLElement} */
527 | let keyLogTemplate = document.createElement("ul");
528 |
529 | /**
530 | * Latest gamepad
531 | *
532 | * @type {Gamepad}
533 | */
534 | let latestGamepad;
535 |
536 | /** @type {string} */
537 | let latestLog;
538 |
539 | /** @type {string[]} */
540 | let logs = [];
541 |
542 | /** @type {number} */
543 | let timestamp = Date.now();
544 |
545 | /**
546 | * Parameter settings
547 | *
548 | * @type {ParameterSetting}
549 | */
550 | let parameterSetting = ParameterSetting.factory();
551 |
552 | // /**
553 | // * Deck
554 | // *
555 | // * @type {Deck}
556 | // */
557 | // let deck = new Deck();
558 |
559 | /**
560 | * Format the Button Input CSS Class
561 | *
562 | * @param {Button} button
563 | * @returns {string[]}
564 | */
565 | const formatButtonInputClassName = (button) => {
566 | return [`Button_${button.index()}`,
567 | `Button_${button.hold() ? "Hold" : "Press"}_${button.index()}`,
568 | `Button_Value_${Math.floor(button.value() * 10) * 10}_${button.index()}`];
569 | }
570 |
571 | /**
572 | * Format the Axis Input CSS Class
573 | *
574 | * @param {Axis} axis
575 | * @returns {string[]}
576 | */
577 | const formatAxisInputClassNames = (axis) => {
578 | const format = (position, value, hold) => {
579 | return [`Stick${position}_${value}`, `Stick${position}_${hold ? "Hold" : "Press"}_${value}`];
580 | }
581 | let classNames = [];
582 | if (!axis.notEntered()) {
583 | axis.xAxis().forEach(axisVal => {
584 | classNames = classNames.concat(format(axis.position(), axisVal, axis.hold()));
585 | });
586 | axis.yAxis().forEach(axisVal => {
587 | classNames = classNames.concat(format(axis.position(), axisVal, axis.hold()));
588 | });
589 | }
590 | return classNames;
591 | }
592 |
593 | /**
594 | * Update the debug
595 | *
596 | * @param {array} gamepads by GamepadAPI
597 | * @returns {void}
598 | */
599 | const updateDebug = (gamepads) => {
600 | if (parameterSetting.checkModes(MODES_DEBUG)) {
601 | let gamepad;
602 | let bodyContainers;
603 | let liContainer;
604 | let olElement = document.createElement("ol");
605 | let liElement = document.createElement("li");
606 | let axesContainer = olElement.cloneNode(false);
607 | let buttonsContainer = olElement.cloneNode(false);
608 | let button;
609 | let newTimestamp = Date.now();
610 | document.getElementById(ID_DEBUG).dataset.lag = (newTimestamp - timestamp);
611 | timestamp = newTimestamp;
612 | for (let i = 0; (i < 4) && i < gamepads.length; i++) {
613 | gamepad = gamepads[i];
614 | bodyContainers = debugContainer.item(i);
615 | if (gamepad) {
616 | axesContainer.innerHTML = "";
617 | buttonsContainer.innerHTML = "";
618 | for (let j = 0; j < gamepad.axes.length; j++) {
619 | liContainer = liElement.cloneNode(false);
620 | liContainer.innerText = gamepad.axes[j];
621 | axesContainer.appendChild(liContainer);
622 | }
623 | for (let j = 0; j < gamepad.buttons.length; j++) {
624 | liContainer = liElement.cloneNode(false);
625 | button = gamepad.buttons[j];
626 | liContainer.dataset.pressed = button.pressed;
627 | liContainer.dataset.touched = button.touched;
628 | liContainer.dataset.value = button.value;
629 | liContainer.innerText = button.value;
630 | buttonsContainer.appendChild(liContainer);
631 | }
632 | bodyContainers.dataset.connected = gamepad.connected;
633 | [{key: "dd.id", value: gamepad.id},
634 | {key: "dd.index", value: gamepad.index},
635 | {key: "dd.connected", value: (gamepad.connected ? "Yes" : "No")},
636 | {key: "dd.mapping", value: gamepad.mapping},
637 | {key: "dd.timestamp", value: gamepad.timestamp}].forEach(mapping => {
638 | [bodyContainers.querySelector(mapping.key)].forEach(ele => {
639 | if (ele.innerText !== mapping.value) {
640 | ele.innerText = mapping.value;
641 | }
642 | });
643 | });
644 | bodyContainers.querySelector("dd.axes ol").innerHTML = axesContainer.innerHTML;
645 | bodyContainers.querySelector("dd.buttons ol").innerHTML = buttonsContainer.innerHTML;
646 | } else {
647 | // 接続を解除するとnullになる機種もあれば最後の状態を取得できる機種(DualShock4)もある
648 | bodyContainers.querySelector("dd.connected").innerText = "";
649 | }
650 | }
651 | }
652 | }
653 |
654 | /**
655 | * Update the key log
656 | *
657 | * @returns {void}
658 | */
659 | const updateKeyLog = () => {
660 | if (parameterSetting.checkModes([MODES_KEYLOG, MODES_DEBUG])) {
661 | keyLogTemplate.className = logs[0];
662 | keyLogContainer.prepend(keyLogTemplate.cloneNode(true));
663 | }
664 | }
665 |
666 | /**
667 | * Update the game controller
668 | *
669 | * @param {string} [className]
670 | * @returns {void}
671 | */
672 | const updateGameController = (className = "") => {
673 | if (parameterSetting.checkModes([MODES_CONTROLLER, MODES_DEBUG])) {
674 | controllerContainer.className = className;
675 | }
676 | }
677 |
678 | /**
679 | * Add the Log
680 | *
681 | * @param {string[]} [log]
682 | * @returns {boolean}
683 | */
684 | const addLog = (log = []) => {
685 | let className = log.join(" ");
686 | if (className != latestLog) {
687 | latestLog = className;
688 | if ("" != latestLog) {
689 | logs.unshift(latestLog = className);
690 | if (parameterSetting.logLimit() < logs.length) {
691 | logs.pop();
692 | if (keyLogContainer.lastChild) {
693 | keyLogContainer.removeChild(keyLogContainer.lastChild);
694 | }
695 | }
696 | updateKeyLog();
697 | updateDeck(log);
698 | } else { // ニュートラル時の表示対応(スト6対応)
699 | logs.unshift("");
700 | updateKeyLog();
701 | }
702 | return true;
703 | }
704 | return false;
705 | }
706 |
707 | /**
708 | * Update the directional buttons
709 | *
710 | * @param {array} gamepad GamepadAPI.getGamepads()[index]
711 | * @returns {object}
712 | */
713 | const updateDirectionalButtons = (gamepad) => {
714 | let res;
715 | let directionalButtons = parameterSetting.directionalButtons();
716 | if (directionalButtons) {
717 | res = directionalButtons;
718 | } else if (gamepad && gamepad.axes && (10 == gamepad.axes.length)) {
719 | res = (parameterSetting.directionalButtons({
720 | up: [],
721 | down: [],
722 | left: [],
723 | right: []
724 | }));
725 | } else {
726 | res = parameterSetting.directionalButtons(ParameterSetting.DEFAULT_DIRECTIONAL_BUTTONS);
727 | }
728 | return res;
729 | }
730 |
731 | /**
732 | * Scan the game controllers
733 | *
734 | * @returns {void}
735 | */
736 | const scanGameControllers = () => {
737 | let gamepadList = Gamepad.getGamePads();
738 | let controllerIndex = parameterSetting.controllerIndex();
739 | let gamepad = gamepadList[controllerIndex];
740 | updateDebug(gamepadList);
741 | if (gamepad && (!latestGamepad || (latestGamepad.timestamp() != gamepad.timestamp))) {
742 | updateDirectionalButtons(gamepad);
743 | latestGamepad = Gamepad.factory(gamepad, controllerIndex, latestGamepad);
744 | if (latestGamepad.notEntered()) {
745 | addLog([]);
746 | updateGameController();
747 | } else {
748 | let classNames = [];
749 | classNames = classNames.concat(formatAxisInputClassNames(latestGamepad.leftAxis()));
750 | classNames = classNames.concat(formatAxisInputClassNames(latestGamepad.rightAxis()));
751 | classNames = classNames.concat(formatAxisInputClassNames(latestGamepad.buttons().directional()));
752 | latestGamepad.buttons().getAll().forEach(button => {
753 | if (button.pressed()) {
754 | classNames = classNames.concat(formatButtonInputClassName(button));
755 | }
756 | });
757 | if (addLog(classNames)) {
758 | updateGameController(logs[0]);
759 | }
760 | }
761 | }
762 | }
763 |
764 | /**
765 | * Initialize the HTML
766 | *
767 | * @returns {void}
768 | */
769 | const initHtml = () => {
770 | let baseContainer = document.getElementById(ID_CONTAINER);
771 | let keyLogTemplateSub = document.createElement("li");
772 | for (let i = 0; i < parameterSetting.keyLogItems(); i++) {
773 | keyLogTemplate.appendChild(keyLogTemplateSub.cloneNode(false));
774 | }
775 | baseContainer.dataset.modes = parameterSetting.modes().join(" ");
776 | baseContainer.dataset.styles = parameterSetting.styles();
777 | baseContainer.dataset.controller = parameterSetting.controllerIndex();
778 | baseContainer.dataset.log = parameterSetting.logLimit();
779 | baseContainer.dataset.excludeButtons = parameterSetting.excludeButtons().join(" ");
780 | updateSettingsContainer();
781 | window.setTimeout((() => {
782 | baseContainer.dataset.standby = "false";
783 | }), 3000);
784 | updateParameterSettingGenerator();
785 | }
786 |
787 | /**
788 | * Parameter setting generator
789 | *
790 | * @class
791 | */
792 | class ParameterSettingGenerator {
793 |
794 | /**
795 | * @returns {HTMLElement}
796 | */
797 | static crateDeckItemContainerTemplate = () => {
798 | let inputElement = (() => {
799 | let ele = document.createElement("input");
800 | return ele;
801 | })();
802 | let indexElement = ((ele) => {
803 | ele.name = "deckIndex";
804 | ele.type = "number";
805 | ele.min = 0;
806 | ele.maxlength = "3";
807 | ele.placeholder = "";
808 | ele.title = "ボタン番号";
809 | return ele;
810 | })(inputElement.cloneNode(false));
811 | let valueElement = ((ele) => {
812 | ele.name = "deckValue";
813 | ele.type = "text";
814 | ele.placeholder = "";
815 | ele.title = "ファイルパス";
816 | return ele;
817 | })(inputElement.cloneNode(false));
818 | let deckItemContainer = (() => {
819 | let container = document.createElement("li");
820 | [indexElement, valueElement].forEach(ele => {
821 | container.append(ele);
822 | });
823 | return container;
824 | })();
825 | return deckItemContainer;
826 | }
827 |
828 | constructor() {
829 |
830 | /** @type {HTMLElement} */
831 | this._deckItemContainerTemplate = ParameterSettingGenerator.crateDeckItemContainerTemplate();
832 |
833 | this._container = document.querySelector("#GIDGenerator");
834 | this._container.querySelector("#deckAdd").addEventListener("click", () => {
835 | this.addDeckItemContainer();
836 | });
837 | this._container.querySelector("#generate").addEventListener("click", () => {
838 | let settings = [];
839 | let directional = {};
840 | let deck = [];
841 | let modes;
842 | let controllerIndex;
843 | let elements = document.forms.GIDGenerator.elements;
844 | const addSetting = (key, value) => {
845 | if ((undefined !== value) && (null !== value)) {
846 | settings.push(`${key}=${value}`);
847 | }
848 | }
849 | [ParameterSetting.KEY_INPUT_DELAY,
850 | ParameterSetting.KEY_EXCLUDE_BUTTONS,
851 | ParameterSetting.KEY_BUTTON_INDEX_CONVERTS,
852 | `${ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES}Up`,
853 | `${ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES}Down`,
854 | `${ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES}Left`,
855 | `${ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES}Right`,
856 | ParameterSetting.KEY_LOG_LIMIT,
857 | ParameterSetting.KEY_KEY_LOG_ITEMS,
858 | ParameterSetting.KEY_STYLES,
859 | ParameterSetting.KEY_MODES,
860 | ParameterSetting.KEY_CONTROLLER_INDEX].forEach(key => {
861 | let value = elements[key].value;
862 | if (value) {
863 | switch (key) {
864 | case `${ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES}Up`:
865 | case `${ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES}Down`:
866 | case `${ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES}Left`:
867 | case `${ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES}Right`:
868 | directional[key] = value;
869 | break;
870 | case ParameterSetting.KEY_MODES:
871 | modes = value;
872 | break;
873 | case ParameterSetting.KEY_CONTROLLER_INDEX:
874 | controllerIndex = value;
875 | break;
876 | default:
877 | addSetting(key, value);
878 | break;
879 | }
880 | }
881 | });
882 | addSetting(ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES, (() => {
883 | let res = [];
884 | [`${ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES}Up`,
885 | `${ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES}Down`,
886 | `${ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES}Left`,
887 | `${ParameterSetting.KEY_DIRECTIONAL_BUTTON_INDEXES}Right`].forEach(key => {
888 | res.push(directional[key]);
889 | });
890 | if ("---" != res.join("-")) {
891 | return res.join("-");
892 | }
893 | return null;
894 | })());
895 | elements.deckValue.forEach((ele, index) => {
896 | let deckIndex = (() => {
897 | if (elements.deckIndex[index].value) {
898 | return Number(elements.deckIndex[index].value);
899 | }
900 | return -1;
901 | })();
902 | if (ele.value && (0 <= deckIndex)) {
903 | deck.push(`${deckIndex}-${encodeURIComponent(encodeURIComponent(ele.value))}`);
904 | }
905 | });
906 | if (0 < deck.length) {
907 | addSetting(ParameterSetting.KEY_DECK, deck.join(","))
908 | }
909 | addSetting(ParameterSetting.KEY_MODES, modes);
910 | addSetting(ParameterSetting.KEY_CONTROLLER_INDEX, controllerIndex);
911 | elements.result.value = (() => {
912 | if (0 < settings.length) {
913 | // return `${location.origin}${location.pathname}?${settings.join("&")}`;
914 | return `?${settings.join("&")}`;
915 | }
916 | return "?";
917 | })();
918 | elements.result.select();
919 | document.execCommand("copy");
920 | });
921 | }
922 |
923 | /**
924 | * Container
925 | *
926 | * @returns {HTMLElement}
927 | */
928 | container() {
929 | return this._container;
930 | }
931 |
932 | /**
933 | * Add the deck item container
934 | *
935 | * @param {number} [index]
936 | * @param {string} [value]
937 | * @returns {void}
938 | */
939 | addDeckItemContainer(index = "", value = "") {
940 | this.container().querySelector("#GIDGenerator .deck ul").append(((ele) => {
941 | ele.querySelectorAll("input").forEach(input => {
942 | switch (input.name) {
943 | case "deckIndex":
944 | input.placeholder = index;
945 | break;
946 | case "deckValue":
947 | input.placeholder = value;
948 | break;
949 | default:
950 | break;
951 | }
952 | });
953 | return ele;
954 | })(this._deckItemContainerTemplate.cloneNode(true)));
955 | }
956 | }
957 |
958 | /**
959 | * Update the parameter setting generator
960 | *
961 | * @returns {void}
962 | */
963 | const updateParameterSettingGenerator = () => {
964 | let generator = new ParameterSettingGenerator();
965 | generator.addDeckItemContainer(0, "Clear");
966 | generator.addDeckItemContainer(11, "Reset");
967 | generator.addDeckItemContainer(1, "./deck/Dices/dices.html");
968 | for (let i = 2; i < 12; i++) {
969 | if (11 !== i) {
970 | generator.addDeckItemContainer(i, `C:\\Videos\\Sample_${i}.mp4`);
971 | }
972 | }
973 | }
974 |
975 | /**
976 | * Update the settings container
977 | *
978 | * @returns {void}
979 | */
980 | const updateSettingsContainer = () => {
981 | let settingsContainer = document.querySelector(`#${ID_DEBUG} > .settings > dl`);
982 | settingsContainer.querySelector("dd.controllerIndex").innerText = parameterSetting.controllerIndex();
983 | [settingsContainer.querySelector("dd.excludes")].forEach(ele => {
984 | let excludeButtons = parameterSetting.excludeButtons().join(" ");
985 | ele.innerText = excludeButtons;
986 | ele.setAttribute("title", excludeButtons);
987 | });
988 | [settingsContainer.querySelector("dd.converts")].forEach(ele => {
989 | let buttonIndexConverts = parameterSetting.find(ParameterSetting.KEY_BUTTON_INDEX_CONVERTS);
990 | ele.innerText = buttonIndexConverts;
991 | ele.setAttribute("title", buttonIndexConverts);
992 | });
993 | settingsContainer.querySelector("dd.logLimit").innerText = parameterSetting.logLimit();
994 | settingsContainer.querySelector("dd.inputDelay").innerText = `${parameterSetting.delay()}ms`;
995 | settingsContainer.querySelector("dd.modes").innerText = parameterSetting.modes().join(",");
996 | [settingsContainer.querySelector("dd.styles")].forEach(ele => {
997 | let styles = parameterSetting.styles();
998 | ele.innerText = styles;
999 | ele.setAttribute("title", styles);
1000 | });
1001 | settingsContainer.querySelector("dd.items").innerText = parameterSetting.keyLogItems();
1002 | let directionalContainers = settingsContainer.querySelectorAll("dd.directionals dd");
1003 | let directionalButtons = parameterSetting.directionalButtons();
1004 | if (directionalButtons) {
1005 | [directionalButtons.up, directionalButtons.down, directionalButtons.left, directionalButtons.right].forEach((vals, index) => {
1006 | directionalContainers.item(index).append(vals.join(","));
1007 | });
1008 | }
1009 | }
1010 |
1011 | /**
1012 | * Update the deck
1013 | *
1014 | * @param {string[]} log
1015 | * @returns {void}
1016 | */
1017 | const updateDeck = (log) => {
1018 | if (parameterSetting.checkModes([MODES_DECK])) {
1019 | parameterSetting.deck().update(latestGamepad);
1020 | }
1021 | }
1022 |
1023 | /**
1024 | * Initialize
1025 | *
1026 | * @returns {void}
1027 | */
1028 | const init = () => {
1029 | initHtml();
1030 | if (!('ongamepadconnected' in window)) {
1031 | // const looper = window.requestAnimationFrame
1032 | // || window.webkitRequestAnimationFrame
1033 | // || window.mozRequestAnimationFrame
1034 | // || window.msRequestAnimationFrame
1035 | // || window.oRequestAnimationFrame
1036 | // || ((callback) => {
1037 | // window.setTimeout(callback, delay);
1038 | // });
1039 | const looper = (callback) => {
1040 | window.setTimeout(callback, parameterSetting.delay());
1041 | };
1042 | const main = () => {
1043 | scanGameControllers();
1044 | looper(main);
1045 | }
1046 | main();
1047 | }
1048 | }
1049 |
--------------------------------------------------------------------------------
/js/utility.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Utility
3 | *
4 | * @class
5 | */
6 | class Utility {
7 |
8 | /**
9 | * requestAnimationFrame
10 | *
11 | * @param {number} [delay]
12 | * @returns {callback}
13 | */
14 | static requestAnimationFrame = (callback, delay = 16) => {
15 | (window.requestAnimationFrame
16 | || window.webkitRequestAnimationFrame
17 | || window.mozRequestAnimationFrame
18 | || window.msRequestAnimationFrame
19 | || window.oRequestAnimationFrame
20 | || ((callback) => {
21 | window.setTimeout(callback, 16);
22 | }))(callback);
23 | };
24 |
25 | /**
26 | * Is empty
27 | *
28 | * @param {any} val
29 | * @returns {boolean}
30 | */
31 | static isEmpty(val) {
32 | return (undefined === val) || (null === val) || ('' === val);
33 | }
34 |
35 | /**
36 | * Not empty
37 | *
38 | * @param {any} val
39 | * @returns {boolean}
40 | */
41 | static notEmpty(val) {
42 | return !Utility.isEmpty(val);
43 | }
44 |
45 | /**
46 | * Zero padding
47 | *
48 | * @param {string|number} val
49 | * @param {number} targetLength
50 | * @param {string} [padString]
51 | * @returns {string}
52 | */
53 | static zeroPadding(val, targetLength, padString) {
54 | if (Utility.notEmpty(targetLength)) {
55 | return ("" + val).padStart(targetLength, padString);
56 | }
57 | return val;
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/skins/ArcadeController/Active.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Active.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Base.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Base.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_0.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_1.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_10.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_11.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_12.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_13.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_14.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_15.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_16.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_2.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_3.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_4.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_5.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_6.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_7.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_8.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Button_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Button_9.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Controller_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Controller_0.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Controller_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Controller_1.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Controller_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Controller_2.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Controller_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Controller_3.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Stick_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Stick_1.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Stick_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Stick_2.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Stick_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Stick_3.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Stick_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Stick_4.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Stick_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Stick_6.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Stick_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Stick_7.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Stick_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Stick_8.png
--------------------------------------------------------------------------------
/skins/ArcadeController/Stick_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ArcadeController/Stick_9.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Active.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Active.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Base.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Base.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_0.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_1.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_10.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_11.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_12.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_13.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_14.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_15.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_16.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_2.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_3.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_4.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_5.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_6.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_7.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_8.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Button_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Button_9.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Controller_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Controller_0.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Controller_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Controller_1.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Controller_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Controller_2.png
--------------------------------------------------------------------------------
/skins/ButtonBox/Controller_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ButtonBox/Controller_3.png
--------------------------------------------------------------------------------
/skins/DualBox/Active.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Active.png
--------------------------------------------------------------------------------
/skins/DualBox/Base.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Base.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_0.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_1.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_10.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_11.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_12.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_13.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_14.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_15.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_16.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_2.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_3.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_4.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_5.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_6.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_7.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_8.png
--------------------------------------------------------------------------------
/skins/DualBox/Button_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Button_9.png
--------------------------------------------------------------------------------
/skins/DualBox/Controller_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Controller_0.png
--------------------------------------------------------------------------------
/skins/DualBox/Controller_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Controller_1.png
--------------------------------------------------------------------------------
/skins/DualBox/Controller_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Controller_2.png
--------------------------------------------------------------------------------
/skins/DualBox/Controller_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Controller_3.png
--------------------------------------------------------------------------------
/skins/DualBox/Stick_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Stick_1.png
--------------------------------------------------------------------------------
/skins/DualBox/Stick_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Stick_2.png
--------------------------------------------------------------------------------
/skins/DualBox/Stick_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Stick_3.png
--------------------------------------------------------------------------------
/skins/DualBox/Stick_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Stick_4.png
--------------------------------------------------------------------------------
/skins/DualBox/Stick_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Stick_6.png
--------------------------------------------------------------------------------
/skins/DualBox/Stick_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Stick_7.png
--------------------------------------------------------------------------------
/skins/DualBox/Stick_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Stick_8.png
--------------------------------------------------------------------------------
/skins/DualBox/Stick_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualBox/Stick_9.png
--------------------------------------------------------------------------------
/skins/DualPad/Active.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Active.png
--------------------------------------------------------------------------------
/skins/DualPad/Base.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Base.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_0.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_1.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_10.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_11.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_12.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_13.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_14.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_15.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_16.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_17.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_2.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_3.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_4.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_5.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_6.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_7.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_8.png
--------------------------------------------------------------------------------
/skins/DualPad/Button_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/Button_9.png
--------------------------------------------------------------------------------
/skins/DualPad/StickL_Down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/StickL_Down.png
--------------------------------------------------------------------------------
/skins/DualPad/StickL_Left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/StickL_Left.png
--------------------------------------------------------------------------------
/skins/DualPad/StickL_Right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/StickL_Right.png
--------------------------------------------------------------------------------
/skins/DualPad/StickL_Up.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/StickL_Up.png
--------------------------------------------------------------------------------
/skins/DualPad/StickR_Down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/StickR_Down.png
--------------------------------------------------------------------------------
/skins/DualPad/StickR_Left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/StickR_Left.png
--------------------------------------------------------------------------------
/skins/DualPad/StickR_Right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/StickR_Right.png
--------------------------------------------------------------------------------
/skins/DualPad/StickR_Up.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/DualPad/StickR_Up.png
--------------------------------------------------------------------------------
/skins/FlashOverlays/Button_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/FlashOverlays/Button_0.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Active.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Active.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Base.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Base.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_0.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_1.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_10.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_11.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_12.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_13.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_14.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_15.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_2.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_3.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_4.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_5.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_6.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_7.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_8.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Button_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Button_9.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Controller_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Controller_0.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Controller_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Controller_1.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Controller_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Controller_2.png
--------------------------------------------------------------------------------
/skins/Front6Pad/Controller_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6Pad/Controller_3.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Active.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Active.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Base.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Base.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_0.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_1.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_10.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_11.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_12.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_13.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_14.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_15.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_16.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_2.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_3.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_4.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_5.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_6.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_7.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_8.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Button_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Button_9.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Controller_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Controller_0.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Controller_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Controller_1.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Controller_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Controller_2.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/Controller_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/Controller_3.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/StickL_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/StickL_1.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/StickL_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/StickL_2.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/StickL_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/StickL_3.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/StickL_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/StickL_4.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/StickL_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/StickL_5.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/StickL_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/StickL_6.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/StickL_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/StickL_7.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/StickL_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/StickL_8.png
--------------------------------------------------------------------------------
/skins/Front6ProPad/StickL_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Front6ProPad/StickL_9.png
--------------------------------------------------------------------------------
/skins/Overlays/Button_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/Overlays/Button_0.png
--------------------------------------------------------------------------------
/skins/PopPad/Active.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Active.png
--------------------------------------------------------------------------------
/skins/PopPad/Base.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Base.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_0.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_1.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_10.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_11.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_12.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_13.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_14.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_15.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_16.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_17.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_2.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_3.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_4.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_5.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_6.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_7.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_8.png
--------------------------------------------------------------------------------
/skins/PopPad/Button_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Button_9.png
--------------------------------------------------------------------------------
/skins/PopPad/Controller_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Controller_0.png
--------------------------------------------------------------------------------
/skins/PopPad/Controller_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Controller_1.png
--------------------------------------------------------------------------------
/skins/PopPad/Controller_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Controller_2.png
--------------------------------------------------------------------------------
/skins/PopPad/Controller_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/Controller_3.png
--------------------------------------------------------------------------------
/skins/PopPad/PopPad.css:
--------------------------------------------------------------------------------
1 | /* Skin: PopPad */
2 | #GameInputDisplay[data-styles~="PopPad"] > ul::before {
3 | background-image: url("../../skins/PopPad/Base.png");
4 | } #GameInputDisplay[data-styles~="PopPad"] > ul > li {
5 | /* 他のスキンをリセット */
6 | background-image: unset;
7 | }
8 | /* 押したボタンの差分画像(ul.Button_{ボタン番号}) */
9 | #GameInputDisplay[data-styles~="PopPad"] > ul.Button_0 > li:nth-child(1) {
10 | background-image: url("../../skins/PopPad/Button_0.png");
11 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_1 > li:nth-child(2) {
12 | background-image: url("../../skins/PopPad/Button_1.png");
13 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_2 > li:nth-child(3) {
14 | background-image: url("../../skins/PopPad/Button_2.png");
15 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_3 > li:nth-child(4) {
16 | background-image: url("../../skins/PopPad/Button_3.png");
17 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_4 > li:nth-child(5) {
18 | background-image: url("../../skins/PopPad/Button_4.png");
19 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_5 > li:nth-child(6) {
20 | background-image: url("../../skins/PopPad/Button_5.png");
21 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_6 > li:nth-child(7) {
22 | background-image: url("../../skins/PopPad/Button_6.png");
23 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_7 > li:nth-child(8) {
24 | background-image: url("../../skins/PopPad/Button_7.png");
25 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_8 > li:nth-child(9) {
26 | background-image: url("../../skins/PopPad/Button_8.png");
27 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_9 > li:nth-child(10) {
28 | background-image: url("../../skins/PopPad/Button_9.png");
29 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_10 > li:nth-child(11) {
30 | background-image: url("../../skins/PopPad/Button_10.png");
31 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_11 > li:nth-child(12) {
32 | background-image: url("../../skins/PopPad/Button_11.png");
33 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_12 > li:nth-child(13),
34 | #GameInputDisplay[data-styles~="PopPad"] > ul.StickB_Up > li:nth-child(13) {
35 | background-image: url("../../skins/PopPad/Button_12.png");
36 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_13 > li:nth-child(14),
37 | #GameInputDisplay[data-styles~="PopPad"] > ul.StickB_Down > li:nth-child(14) {
38 | background-image: url("../../skins/PopPad/Button_13.png");
39 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_14 > li:nth-child(15),
40 | #GameInputDisplay[data-styles~="PopPad"] > ul.StickB_Left > li:nth-child(15) {
41 | background-image: url("../../skins/PopPad/Button_14.png");
42 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_15 > li:nth-child(16),
43 | #GameInputDisplay[data-styles~="PopPad"] > ul.StickB_Right > li:nth-child(16) {
44 | background-image: url("../../skins/PopPad/Button_15.png");
45 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_16 > li:nth-child(17) {
46 | background-image: url("../../skins/PopPad/Button_16.png");
47 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_17 > li:nth-child(18) {
48 | background-image: url("../../skins/PopPad/Button_17.png");
49 | }
50 | /* 左スティックの差分画像 */
51 | #GameInputDisplay[data-styles~="PopPad"] > ul.StickL_Up > li:nth-child(30) {
52 | background-image: url("../../skins/PopPad/StickL_8.png");
53 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickL_Down > li:nth-child(30) {
54 | background-image: url("../../skins/PopPad/StickL_2.png");
55 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickL_Left > li:nth-child(30) {
56 | background-image: url("../../skins/PopPad/StickL_4.png");
57 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickL_Right > li:nth-child(30) {
58 | background-image: url("../../skins/PopPad/StickL_6.png");
59 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickL_Down.StickL_Left > li:nth-child(30) {
60 | background-image: url("../../skins/PopPad/StickL_1.png");
61 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickL_Down.StickL_Right > li:nth-child(30) {
62 | background-image: url("../../skins/PopPad/StickL_3.png");
63 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickL_Up.StickL_Left > li:nth-child(30) {
64 | background-image: url("../../skins/PopPad/StickL_7.png");
65 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickL_Up.StickL_Right > li:nth-child(30) {
66 | background-image: url("../../skins/PopPad/StickL_9.png");
67 | }
68 | /* 右スティックの差分画像 */
69 | #GameInputDisplay[data-styles~="PopPad"] > ul.StickR_Up > li:nth-child(40) {
70 | background-image: url("../../skins/PopPad/StickR_8.png");
71 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickR_Down > li:nth-child(40) {
72 | background-image: url("../../skins/PopPad/StickR_2.png");
73 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickR_Left > li:nth-child(40) {
74 | background-image: url("../../skins/PopPad/StickR_4.png");
75 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickR_Right > li:nth-child(40) {
76 | background-image: url("../../skins/PopPad/StickR_6.png");
77 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickR_Down.StickR_Left > li:nth-child(40) {
78 | background-image: url("../../skins/PopPad/StickR_1.png");
79 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickR_Down.StickR_Right > li:nth-child(40) {
80 | background-image: url("../../skins/PopPad/StickR_3.png");
81 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickR_Up.StickR_Left > li:nth-child(40) {
82 | background-image: url("../../skins/PopPad/StickR_7.png");
83 | } #GameInputDisplay[data-styles~="PopPad"] > ul.StickR_Up.StickR_Right > li:nth-child(40) {
84 | background-image: url("../../skins/PopPad/StickR_9.png");
85 | }
86 | /* コントローラーIndex識別用差分画像(Switchコンなどに見られる) */
87 | #GameInputDisplay[data-styles~="PopPad"][data-controller="0"] > ul > li:nth-child(42) {
88 | background-image: url("../../skins/PopPad/Controller_0.png");
89 | } #GameInputDisplay[data-styles~="PopPad"][data-controller="1"] > ul > li:nth-child(42) {
90 | background-image: url("../../skins/PopPad/Controller_1.png");
91 | } #GameInputDisplay[data-styles~="PopPad"][data-controller="2"] > ul > li:nth-child(42) {
92 | background-image: url("../../skins/PopPad/Controller_2.png");
93 | } #GameInputDisplay[data-styles~="PopPad"][data-controller="3"] > ul > li:nth-child(42) {
94 | background-image: url("../../skins/PopPad/Controller_3.png");
95 | }
96 | /* トリガーボタン(L2/R2)の入力強度の表現(.Button_Value_{入力強度%}_{ボタン番号}) */
97 | #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_10_6 > li:nth-child(7),
98 | #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_10_7 > li:nth-child(8) {
99 | opacity: .1; /* 不透明度 */
100 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_20_6 > li:nth-child(7),
101 | #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_20_7 > li:nth-child(8) {
102 | opacity: .2; /* 不透明度 */
103 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_30_6 > li:nth-child(7),
104 | #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_30_7 > li:nth-child(8) {
105 | opacity: .3; /* 不透明度 */
106 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_40_6 > li:nth-child(7),
107 | #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_40_7 > li:nth-child(8) {
108 | opacity: .4; /* 不透明度 */
109 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_50_6 > li:nth-child(7),
110 | #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_50_7 > li:nth-child(8) {
111 | opacity: .5; /* 不透明度 */
112 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_60_6 > li:nth-child(7),
113 | #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_60_7 > li:nth-child(8) {
114 | opacity: .6; /* 不透明度 */
115 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_70_6 > li:nth-child(7),
116 | #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_70_7 > li:nth-child(8) {
117 | opacity: .7; /* 不透明度 */
118 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_80_6 > li:nth-child(7),
119 | #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_80_7 > li:nth-child(8) {
120 | opacity: .8; /* 不透明度 */
121 | } #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_90_6 > li:nth-child(7),
122 | #GameInputDisplay[data-styles~="PopPad"] > ul.Button_Value_90_7 > li:nth-child(8) {
123 | opacity: .9; /* 不透明度 */
124 | }
125 |
--------------------------------------------------------------------------------
/skins/PopPad/PopPad.svg:
--------------------------------------------------------------------------------
1 |
2 |
211 |
--------------------------------------------------------------------------------
/skins/PopPad/StickL_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickL_1.png
--------------------------------------------------------------------------------
/skins/PopPad/StickL_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickL_2.png
--------------------------------------------------------------------------------
/skins/PopPad/StickL_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickL_3.png
--------------------------------------------------------------------------------
/skins/PopPad/StickL_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickL_4.png
--------------------------------------------------------------------------------
/skins/PopPad/StickL_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickL_6.png
--------------------------------------------------------------------------------
/skins/PopPad/StickL_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickL_7.png
--------------------------------------------------------------------------------
/skins/PopPad/StickL_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickL_8.png
--------------------------------------------------------------------------------
/skins/PopPad/StickL_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickL_9.png
--------------------------------------------------------------------------------
/skins/PopPad/StickR_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickR_1.png
--------------------------------------------------------------------------------
/skins/PopPad/StickR_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickR_2.png
--------------------------------------------------------------------------------
/skins/PopPad/StickR_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickR_3.png
--------------------------------------------------------------------------------
/skins/PopPad/StickR_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickR_4.png
--------------------------------------------------------------------------------
/skins/PopPad/StickR_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickR_6.png
--------------------------------------------------------------------------------
/skins/PopPad/StickR_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickR_7.png
--------------------------------------------------------------------------------
/skins/PopPad/StickR_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickR_8.png
--------------------------------------------------------------------------------
/skins/PopPad/StickR_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/PopPad/StickR_9.png
--------------------------------------------------------------------------------
/skins/ProPad/Active.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Active.png
--------------------------------------------------------------------------------
/skins/ProPad/Base.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Base.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_0.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_1.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_10.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_11.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_12.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_13.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_14.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_15.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_16.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_17.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_2.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_3.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_4.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_5.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_6.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_7.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_8.png
--------------------------------------------------------------------------------
/skins/ProPad/Button_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Button_9.png
--------------------------------------------------------------------------------
/skins/ProPad/Controller_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Controller_0.png
--------------------------------------------------------------------------------
/skins/ProPad/Controller_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Controller_1.png
--------------------------------------------------------------------------------
/skins/ProPad/Controller_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Controller_2.png
--------------------------------------------------------------------------------
/skins/ProPad/Controller_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/Controller_3.png
--------------------------------------------------------------------------------
/skins/ProPad/StickL_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickL_1.png
--------------------------------------------------------------------------------
/skins/ProPad/StickL_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickL_2.png
--------------------------------------------------------------------------------
/skins/ProPad/StickL_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickL_3.png
--------------------------------------------------------------------------------
/skins/ProPad/StickL_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickL_4.png
--------------------------------------------------------------------------------
/skins/ProPad/StickL_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickL_6.png
--------------------------------------------------------------------------------
/skins/ProPad/StickL_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickL_7.png
--------------------------------------------------------------------------------
/skins/ProPad/StickL_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickL_8.png
--------------------------------------------------------------------------------
/skins/ProPad/StickL_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickL_9.png
--------------------------------------------------------------------------------
/skins/ProPad/StickR_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickR_1.png
--------------------------------------------------------------------------------
/skins/ProPad/StickR_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickR_2.png
--------------------------------------------------------------------------------
/skins/ProPad/StickR_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickR_3.png
--------------------------------------------------------------------------------
/skins/ProPad/StickR_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickR_4.png
--------------------------------------------------------------------------------
/skins/ProPad/StickR_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickR_6.png
--------------------------------------------------------------------------------
/skins/ProPad/StickR_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickR_7.png
--------------------------------------------------------------------------------
/skins/ProPad/StickR_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickR_8.png
--------------------------------------------------------------------------------
/skins/ProPad/StickR_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/ProPad/StickR_9.png
--------------------------------------------------------------------------------
/skins/StreetFighter6/StreetFighter6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codelelou/GameInputDisplay/c85ec874716a2ae572a6d7404ea14f498587dbf1/skins/StreetFighter6/StreetFighter6.png
--------------------------------------------------------------------------------