├── 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 |
17 | 18 | 19 | 20 |
    21 |
  • 十字・スティック: ↔ 移動 / ↕ 増減
  • 22 |
  • 十字・スティック: ↔ 移動 / ↓ Stop or Roll
  • 23 |
24 |
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 |
13 | 14 |
15 |
16 | 129 |
130 |

131 | 132 | 247 |
248 |
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 | 20 | HORI Fighting Commander 22 | 24 | 47 | 49 | 50 | 52 | image/svg+xml 53 | 55 | HORI Fighting Commander 56 | 57 | 58 | 59 | 63 | 68 | 73 | 81 | 87 | 93 | 99 | 105 | 111 | 119 | 124 | 129 | 134 | 139 | 144 | 150 | 156 | 162 | 168 | 174 | 180 | 185 | 191 | 197 | 203 | 209 | 210 | 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 --------------------------------------------------------------------------------