Skip to content

Commit

Permalink
upload host control scheme
Browse files Browse the repository at this point in the history
  • Loading branch information
n-at committed Sep 7, 2023
1 parent 728acaa commit 6e9bd71
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 48 deletions.
34 changes: 32 additions & 2 deletions assets/play-control-scheme.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,11 @@
window.PlaytimeControls = {};

['0', '1', '2' , '3'].forEach(player => {
console.log(gatherInputs(player, ControlSchemeMappingState));
window.EJS_emulator.controls[player.toString()] = gatherInputs(player, ControlSchemeMapping);
window.PlaytimeControls[player.toString()] = gatherInputs(player, ControlSchemeMappingState);
});

//TODO gather and send to the server
uploadHostControlScheme();
}

function resetHostControlScheme() {
Expand All @@ -82,6 +81,27 @@
});
}

function uploadHostControlScheme() {
const formData = new FormData();
const inputs = gatherInputsToUpload();
for (let key in inputs) {
formData.append(key, inputs[key]);
}
formData.append('_playtime_csrf', window._csrf);

fetch(`/games/controls/${GameId}/save`, {
method: 'post',
body: formData,
})
.then(() => {
window.FlashButtonIcon('btn-control-scheme', ['btn-outline-secondary'], ['bi-controller'], ['btn-outline-success'], ['bi-check']);
})
.catch(e => {
window.FlashButtonIcon('btn-control-scheme', ['btn-outline-secondary'], ['bi-controller'], ['btn-outline-danger'], ['bi-x']);
console.error('game controls save error', e);
});
}

///////////////////////////////////////////////////////////////////////////

function loadClientControlScheme() {
Expand Down Expand Up @@ -178,4 +198,14 @@
return controls;
}

function gatherInputsToUpload() {
const inputs = {};

document.querySelectorAll('input.keyboard, input.gamepad').forEach(input => {
inputs[input.name] = input.value;
});

return inputs;
}

})();
2 changes: 1 addition & 1 deletion templates/play.twig
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
<i class="bi bi-globe"></i>
</button>
{% endif %}
<button type="button" class="btn btn-sm btn-outline-secondary" title="Controls" data-bs-toggle="modal" data-bs-target="#modal-control-scheme">
<button type="button" id="btn-control-scheme" class="btn btn-sm btn-outline-secondary" title="Controls" data-bs-toggle="modal" data-bs-target="#modal-control-scheme">
<i class="bi bi-controller"></i>
</button>
{% include "includes/game_menu.twig" with game_menu_title=true %}
Expand Down
31 changes: 31 additions & 0 deletions web/handlers_game.go
Original file line number Diff line number Diff line change
Expand Up @@ -236,3 +236,34 @@ func (s *Server) gameNetplayRefreshId(c echo.Context) error {
return c.Redirect(http.StatusFound, "/games")
}
}

func (s *Server) gameControlsSave(c echo.Context) error {
context := c.(*PlaytimeContext)
game := context.game

controls := settingsCollectControls(c)

if game.OverrideEmulatorSettings {
game.EmulatorSettings.Controls = controls
if _, err := s.storage.GameSave(*game); err != nil {
return err
}
} else {
settings, err := s.storage.SettingsGetByUserId(context.session.UserId)
if err != nil {
return err
}
platformSettings, ok := settings.EmulatorSettings[game.Platform]
if !ok {
return errors.New("platform not found")
}

platformSettings.Controls = controls
settings.EmulatorSettings[game.Platform] = platformSettings
if _, err := s.storage.SettingsSave(settings); err != nil {
return err
}
}

return c.JSON(http.StatusOK, nil)
}
94 changes: 49 additions & 45 deletions web/handlers_settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,50 +115,6 @@ func settingsCollectFormData(c echo.Context) storage.EmulatorSettings {
CacheManager: c.FormValue("button-cache-manager") == "1",
}

controls := [4]storage.EmulatorControls{}

for _, player := range []int{0, 1, 2, 3} {
for _, input := range []string{"keyboard", "gamepad"} {
mapping := storage.EmulatorControlsMapping{
B: settingsReadControlButton(c, input, player, "b"),
Y: settingsReadControlButton(c, input, player, "y"),
Select: settingsReadControlButton(c, input, player, "select"),
Start: settingsReadControlButton(c, input, player, "start"),
Up: settingsReadControlButton(c, input, player, "up"),
Down: settingsReadControlButton(c, input, player, "down"),
Left: settingsReadControlButton(c, input, player, "left"),
Right: settingsReadControlButton(c, input, player, "right"),
A: settingsReadControlButton(c, input, player, "a"),
X: settingsReadControlButton(c, input, player, "x"),
L: settingsReadControlButton(c, input, player, "l"),
R: settingsReadControlButton(c, input, player, "r"),
L2: settingsReadControlButton(c, input, player, "l2"),
R2: settingsReadControlButton(c, input, player, "r2"),
L3: settingsReadControlButton(c, input, player, "l3"),
R3: settingsReadControlButton(c, input, player, "r3"),
LStickUp: settingsReadControlButton(c, input, player, "l-stick-up"),
LStickDown: settingsReadControlButton(c, input, player, "l-stick-down"),
LStickLeft: settingsReadControlButton(c, input, player, "l-stick-left"),
LStickRight: settingsReadControlButton(c, input, player, "l-stick-right"),
RStickUp: settingsReadControlButton(c, input, player, "r-stick-up"),
RStickDown: settingsReadControlButton(c, input, player, "r-stick-down"),
RStickLeft: settingsReadControlButton(c, input, player, "r-stick-left"),
RStickRight: settingsReadControlButton(c, input, player, "r-stick-right"),
QuickSaveState: settingsReadControlButton(c, input, player, "quick-save-state"),
QuickLoadState: settingsReadControlButton(c, input, player, "quick-load-state"),
ChangeStateSlot: settingsReadControlButton(c, input, player, "change-state-slot"),
FastForward: settingsReadControlButton(c, input, player, "fast-forward"),
SlowMotion: settingsReadControlButton(c, input, player, "slow-motion"),
Rewind: settingsReadControlButton(c, input, player, "rewind"),
}
if input == "keyboard" {
controls[player].Keyboard = mapping
} else if input == "gamepad" {
controls[player].Gamepad = mapping
}
}
}

shader := c.FormValue("shader")
shaderFound := false
for _, item := range storage.Shaders {
Expand Down Expand Up @@ -200,13 +156,61 @@ func settingsCollectFormData(c echo.Context) storage.EmulatorSettings {
Rewind: c.FormValue("rewind-enabled") == "1",
Threads: c.FormValue("threads") == "1",
Buttons: buttons,
Controls: controls,
Controls: settingsCollectControls(c),
CoreOptions: coreOptionsValues,
}

return settings
}

func settingsCollectControls(c echo.Context) [4]storage.EmulatorControls {
controls := [4]storage.EmulatorControls{}

for _, player := range []int{0, 1, 2, 3} {
for _, input := range []string{"keyboard", "gamepad"} {
mapping := storage.EmulatorControlsMapping{
B: settingsReadControlButton(c, input, player, "b"),
Y: settingsReadControlButton(c, input, player, "y"),
Select: settingsReadControlButton(c, input, player, "select"),
Start: settingsReadControlButton(c, input, player, "start"),
Up: settingsReadControlButton(c, input, player, "up"),
Down: settingsReadControlButton(c, input, player, "down"),
Left: settingsReadControlButton(c, input, player, "left"),
Right: settingsReadControlButton(c, input, player, "right"),
A: settingsReadControlButton(c, input, player, "a"),
X: settingsReadControlButton(c, input, player, "x"),
L: settingsReadControlButton(c, input, player, "l"),
R: settingsReadControlButton(c, input, player, "r"),
L2: settingsReadControlButton(c, input, player, "l2"),
R2: settingsReadControlButton(c, input, player, "r2"),
L3: settingsReadControlButton(c, input, player, "l3"),
R3: settingsReadControlButton(c, input, player, "r3"),
LStickUp: settingsReadControlButton(c, input, player, "l-stick-up"),
LStickDown: settingsReadControlButton(c, input, player, "l-stick-down"),
LStickLeft: settingsReadControlButton(c, input, player, "l-stick-left"),
LStickRight: settingsReadControlButton(c, input, player, "l-stick-right"),
RStickUp: settingsReadControlButton(c, input, player, "r-stick-up"),
RStickDown: settingsReadControlButton(c, input, player, "r-stick-down"),
RStickLeft: settingsReadControlButton(c, input, player, "r-stick-left"),
RStickRight: settingsReadControlButton(c, input, player, "r-stick-right"),
QuickSaveState: settingsReadControlButton(c, input, player, "quick-save-state"),
QuickLoadState: settingsReadControlButton(c, input, player, "quick-load-state"),
ChangeStateSlot: settingsReadControlButton(c, input, player, "change-state-slot"),
FastForward: settingsReadControlButton(c, input, player, "fast-forward"),
SlowMotion: settingsReadControlButton(c, input, player, "slow-motion"),
Rewind: settingsReadControlButton(c, input, player, "rewind"),
}
if input == "keyboard" {
controls[player].Keyboard = mapping
} else if input == "gamepad" {
controls[player].Gamepad = mapping
}
}
}

return controls
}

func settingsReadControlButton(c echo.Context, input string, player int, button string) string {
key := fmt.Sprintf("control-%s-%d-%s", input, player, button)
return c.FormValue(key)
Expand Down
4 changes: 4 additions & 0 deletions web/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,10 @@ func New(config *Configuration, storage *storage.Storage) *Server {
gamesNetplay.Use(s.gameRequiredMiddleware)
gamesNetplay.GET("/refresh-id", s.gameNetplayRefreshId)

gamesControls := games.Group("/controls/:game_id")
gamesControls.Use(s.gameRequiredMiddleware)
gamesControls.POST("/save", s.gameControlsSave)

uploadBatch := games.Group("/upload-batch/:upload_batch_id")
uploadBatch.Use(s.uploadBatchRequiredMiddleware)
uploadBatch.GET("", s.gameUploadBatchForm)
Expand Down

0 comments on commit 6e9bd71

Please sign in to comment.