diff --git a/assets/elm/Main.elm b/assets/elm/Main.elm index 1993634..9ccac29 100644 --- a/assets/elm/Main.elm +++ b/assets/elm/Main.elm @@ -265,8 +265,11 @@ playersListItem player = player.username else Maybe.withDefault "" player.displayName + + playerLink = + "players/" ++ (toString player.id) in li [ class "player-item list-group-item" ] - [ strong [] [ text displayName ] + [ strong [] [ a [ href playerLink ] [ text displayName ] ] , span [ class "badge" ] [ text (toString player.score) ] ] diff --git a/assets/elm/Platformer.elm b/assets/elm/Platformer.elm index 9a15e3e..9e68496 100644 --- a/assets/elm/Platformer.elm +++ b/assets/elm/Platformer.elm @@ -39,6 +39,11 @@ main = -- MODEL +type Direction + = Left + | Right + + type GameState = StartScreen | Playing @@ -46,6 +51,13 @@ type GameState | GameOver +type alias Gameplay = + { gameId : Int + , playerId : Int + , playerScore : Int + } + + type alias Player = { displayName : Maybe String , id : Int @@ -55,36 +67,38 @@ type alias Player = type alias Model = - { errors : String - , gameId : Int - , gameState : GameState + { characterDirection : Direction , characterPositionX : Int , characterPositionY : Int + , errors : String + , gameId : Int + , gameplays : List Gameplay + , gameState : GameState , itemPositionX : Int , itemPositionY : Int , itemsCollected : Int , phxSocket : Phoenix.Socket.Socket Msg , playersList : List Player , playerScore : Int - , playerScores : List Score , timeRemaining : Int } initialModel : Flags -> Model initialModel flags = - { errors = "" - , gameId = 1 - , gameState = StartScreen + { characterDirection = Right , characterPositionX = 50 , characterPositionY = 300 + , errors = "" + , gameId = 1 + , gameplays = [] + , gameState = StartScreen , itemPositionX = 150 , itemPositionY = 300 , itemsCollected = 0 , phxSocket = initialSocketJoin flags , playersList = [] , playerScore = 0 - , playerScores = [] , timeRemaining = 10 } @@ -100,7 +114,7 @@ initialSocket flags = in Phoenix.Socket.init prodSocketServer |> Phoenix.Socket.withDebug - |> Phoenix.Socket.on "shout" "score:platformer" SendScore + |> Phoenix.Socket.on "save_score" "score:platformer" SaveScore |> Phoenix.Socket.on "save_score" "score:platformer" ReceiveScoreChanges |> Phoenix.Socket.join initialChannel @@ -124,7 +138,12 @@ initialSocketCommand flags = init : Flags -> ( Model, Cmd Msg ) init flags = - ( initialModel flags, Cmd.map PhoenixMsg (initialSocketCommand flags) ) + ( initialModel flags + , Cmd.batch + [ fetchPlayersList + , Cmd.map PhoenixMsg (initialSocketCommand flags) + ] + ) @@ -153,16 +172,18 @@ decodePlayer = (Decode.field "username" Decode.string) -type alias Score = - { gameId : Int - , playerId : Int - , playerScore : Int +anonymousPlayer : Player +anonymousPlayer = + { displayName = Just "Anonymous User" + , id = 0 + , score = 0 + , username = "anonymous" } -scoreDecoder : Decode.Decoder Score +scoreDecoder : Decode.Decoder Gameplay scoreDecoder = - Decode.map3 Score + Decode.map3 Gameplay (Decode.field "game_id" Decode.int) (Decode.field "player_id" Decode.int) (Decode.field "player_score" Decode.int) @@ -182,9 +203,6 @@ type Msg | SaveScore Encode.Value | SaveScoreError Encode.Value | SaveScoreRequest - | SendScore Encode.Value - | SendScoreError Encode.Value - | SendScoreRequest | SetNewItemPositionX Int | TimeUpdate Time @@ -214,10 +232,11 @@ update msg model = 32 -> if model.gameState /= Playing then ( { model - | gameState = Playing + | characterDirection = Right , characterPositionX = 50 - , playerScore = 0 , itemsCollected = 0 + , gameState = Playing + , playerScore = 0 , timeRemaining = 10 } , Cmd.none @@ -227,13 +246,23 @@ update msg model = 37 -> if model.gameState == Playing then - ( { model | characterPositionX = model.characterPositionX - 15 }, Cmd.none ) + ( { model + | characterDirection = Left + , characterPositionX = model.characterPositionX - 15 + } + , Cmd.none + ) else ( model, Cmd.none ) 39 -> if model.gameState == Playing then - ( { model | characterPositionX = model.characterPositionX + 15 }, Cmd.none ) + ( { model + | characterDirection = Right + , characterPositionX = model.characterPositionX + 15 + } + , Cmd.none + ) else ( model, Cmd.none ) @@ -252,7 +281,7 @@ update msg model = ReceiveScoreChanges raw -> case Decode.decodeValue scoreDecoder raw of Ok scoreChange -> - ( { model | playerScores = scoreChange :: model.playerScores }, Cmd.none ) + ( { model | gameplays = scoreChange :: model.gameplays }, Cmd.none ) Err message -> ( { model | errors = message }, Cmd.none ) @@ -261,7 +290,7 @@ update msg model = ( model, Cmd.none ) SaveScoreError message -> - Debug.log "Error saveing score over socket." + Debug.log "Error saving score over socket." ( model, Cmd.none ) SaveScoreRequest -> @@ -282,31 +311,6 @@ update msg model = , Cmd.map PhoenixMsg phxCmd ) - SendScore value -> - ( model, Cmd.none ) - - SendScoreError message -> - Debug.log "Error sending score over socket." - ( model, Cmd.none ) - - SendScoreRequest -> - let - payload = - Encode.object [ ( "player_score", Encode.int model.playerScore ) ] - - phxPush = - Phoenix.Push.init "shout" "score:platformer" - |> Phoenix.Push.withPayload payload - |> Phoenix.Push.onOk SendScore - |> Phoenix.Push.onError SendScoreError - - ( phxSocket, phxCmd ) = - Phoenix.Socket.push phxPush model.phxSocket - in - ( { model | phxSocket = phxSocket } - , Cmd.map PhoenixMsg phxCmd - ) - SetNewItemPositionX newPositionX -> ( { model | itemPositionX = newPositionX }, Cmd.none ) @@ -363,20 +367,8 @@ view : Model -> Html Msg view model = div [] [ viewGame model - , viewSendScoreButton , viewSaveScoreButton - , viewPlayerScoresIndex model - ] - - -viewSendScoreButton : Html Msg -viewSendScoreButton = - div [] - [ button - [ onClick SendScoreRequest - , Html.Attributes.class "btn btn-primary" - ] - [ text "Send Score" ] + , viewGameplaysIndex model ] @@ -391,31 +383,56 @@ viewSaveScoreButton = ] -viewPlayerScoresIndex : Model -> Html Msg -viewPlayerScoresIndex model = - if List.isEmpty model.playerScores then +viewGameplaysIndex : Model -> Html Msg +viewGameplaysIndex model = + if List.isEmpty model.gameplays then div [] [] else div [ Html.Attributes.class "players-index" ] [ h1 [ Html.Attributes.class "players-section" ] [ text "Player Scores" ] - , viewPlayerScoresList model.playerScores + , viewGameplaysList model ] -viewPlayerScoresList : List Score -> Html Msg -viewPlayerScoresList scores = +viewGameplaysList : Model -> Html Msg +viewGameplaysList model = div [ Html.Attributes.class "players-list panel panel-info" ] - [ div [ Html.Attributes.class "panel-heading" ] [ text "Leaderboard" ] - , ul [ Html.Attributes.class "list-group" ] (List.map viewPlayerScoreItem scores) + [ div [ Html.Attributes.class "panel-heading" ] [ text "Scores" ] + , ul [ Html.Attributes.class "list-group" ] (List.map (viewGameplayItem model) model.gameplays) ] -viewPlayerScoreItem : Score -> Html Msg -viewPlayerScoreItem score = - li [ Html.Attributes.class "player-item list-group-item" ] - [ strong [] [ text (toString score.playerId) ] - , span [ Html.Attributes.class "badge" ] [ text (toString score.playerScore) ] - ] +viewGameplayItem : Model -> Gameplay -> Html Msg +viewGameplayItem model gameplay = + let + currentPlayer = + model.playersList + |> List.filter (\player -> player.id == gameplay.playerId) + |> List.head + |> Maybe.withDefault anonymousPlayer + + displayName = + Maybe.withDefault currentPlayer.username currentPlayer.displayName + in + li [ Html.Attributes.class "player-item list-group-item" ] + [ strong [] [ text displayName ] + , span [ Html.Attributes.class "badge" ] [ text (toString gameplay.playerScore) ] + ] + + +playersListItem : Player -> Html msg +playersListItem player = + let + displayName = + if player.displayName == Nothing then + player.username + else + Maybe.withDefault "" player.displayName + in + li [ Html.Attributes.class "player-item list-group-item" ] + [ strong [] [ text displayName ] + , span [ Html.Attributes.class "badge" ] [ text (toString player.score) ] + ] viewGame : Model -> Svg Msg @@ -527,14 +544,23 @@ viewGameGround = viewCharacter : Model -> Svg Msg viewCharacter model = - image - [ xlinkHref "/images/character.gif" - , x (toString model.characterPositionX) - , y (toString model.characterPositionY) - , width "50" - , height "50" - ] - [] + let + characterImage = + case model.characterDirection of + Left -> + "/images/character-left.gif" + + Right -> + "/images/character-right.gif" + in + image + [ xlinkHref characterImage + , x (toString model.characterPositionX) + , y (toString model.characterPositionY) + , width "50" + , height "50" + ] + [] viewItem : Model -> Svg Msg diff --git a/assets/js/app.js b/assets/js/app.js index d500c11..5ee11e6 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -21,7 +21,7 @@ import "phoenix_html" // import socket from "./socket" // Elm -const Elm = require("./elm.js"); +import Elm from "./elm"; const elmContainer = document.querySelector("#elm-container"); const platformer = document.querySelector("#platformer"); diff --git a/assets/js/elm.js b/assets/js/elm.js index a865de9..2ffe616 100644 --- a/assets/js/elm.js +++ b/assets/js/elm.js @@ -15476,6 +15476,10 @@ var _fbonetti$elm_phoenix_socket$Phoenix_Socket$listen = F2( }); var _user$project$Main$playersListItem = function (player) { + var playerLink = A2( + _elm_lang$core$Basics_ops['++'], + 'players/', + _elm_lang$core$Basics$toString(player.id)); var displayName = _elm_lang$core$Native_Utils.eq(player.displayName, _elm_lang$core$Maybe$Nothing) ? player.username : A2(_elm_lang$core$Maybe$withDefault, '', player.displayName); return A2( _elm_lang$html$Html$li, @@ -15491,7 +15495,18 @@ var _user$project$Main$playersListItem = function (player) { {ctor: '[]'}, { ctor: '::', - _0: _elm_lang$html$Html$text(displayName), + _0: A2( + _elm_lang$html$Html$a, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$href(playerLink), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$html$Html$text(displayName), + _1: {ctor: '[]'} + }), _1: {ctor: '[]'} }), _1: { @@ -16139,11 +16154,19 @@ var _user$project$Platformer$viewItem = function (model) { {ctor: '[]'}); }; var _user$project$Platformer$viewCharacter = function (model) { + var characterImage = function () { + var _p0 = model.characterDirection; + if (_p0.ctor === 'Left') { + return '/images/character-left.gif'; + } else { + return '/images/character-right.gif'; + } + }(); return A2( _elm_lang$svg$Svg$image, { ctor: '::', - _0: _elm_lang$svg$Svg_Attributes$xlinkHref('/images/character.gif'), + _0: _elm_lang$svg$Svg_Attributes$xlinkHref(characterImage), _1: { ctor: '::', _0: _elm_lang$svg$Svg_Attributes$x( @@ -16271,8 +16294,8 @@ var _user$project$Platformer$viewStartScreenText = A2( } }); var _user$project$Platformer$viewGameState = function (model) { - var _p0 = model.gameState; - switch (_p0.ctor) { + var _p1 = model.gameState; + switch (_p1.ctor) { case 'StartScreen': return { ctor: '::', @@ -16405,7 +16428,8 @@ var _user$project$Platformer$viewGame = function (model) { }, _user$project$Platformer$viewGameState(model)); }; -var _user$project$Platformer$viewPlayerScoreItem = function (score) { +var _user$project$Platformer$playersListItem = function (player) { + var displayName = _elm_lang$core$Native_Utils.eq(player.displayName, _elm_lang$core$Maybe$Nothing) ? player.username : A2(_elm_lang$core$Maybe$withDefault, '', player.displayName); return A2( _elm_lang$html$Html$li, { @@ -16420,8 +16444,7 @@ var _user$project$Platformer$viewPlayerScoreItem = function (score) { {ctor: '[]'}, { ctor: '::', - _0: _elm_lang$svg$Svg$text( - _elm_lang$core$Basics$toString(score.playerId)), + _0: _elm_lang$svg$Svg$text(displayName), _1: {ctor: '[]'} }), _1: { @@ -16436,14 +16459,75 @@ var _user$project$Platformer$viewPlayerScoreItem = function (score) { { ctor: '::', _0: _elm_lang$svg$Svg$text( - _elm_lang$core$Basics$toString(score.playerScore)), + _elm_lang$core$Basics$toString(player.score)), _1: {ctor: '[]'} }), _1: {ctor: '[]'} } }); }; -var _user$project$Platformer$viewPlayerScoresList = function (scores) { +var _user$project$Platformer$characterFoundItem = function (model) { + var approximateItemUpperBound = model.itemPositionX; + var approximateItemLowerBound = model.itemPositionX - 35; + var approximateItemRange = A2(_elm_lang$core$List$range, approximateItemLowerBound, approximateItemUpperBound); + return A2(_elm_lang$core$List$member, model.characterPositionX, approximateItemRange); +}; +var _user$project$Platformer$anonymousPlayer = { + displayName: _elm_lang$core$Maybe$Just('Anonymous User'), + id: 0, + score: 0, + username: 'anonymous' +}; +var _user$project$Platformer$viewGameplayItem = F2( + function (model, gameplay) { + var currentPlayer = A2( + _elm_lang$core$Maybe$withDefault, + _user$project$Platformer$anonymousPlayer, + _elm_lang$core$List$head( + A2( + _elm_lang$core$List$filter, + function (player) { + return _elm_lang$core$Native_Utils.eq(player.id, gameplay.playerId); + }, + model.playersList))); + var displayName = A2(_elm_lang$core$Maybe$withDefault, currentPlayer.username, currentPlayer.displayName); + return A2( + _elm_lang$html$Html$li, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$class('player-item list-group-item'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$strong, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$svg$Svg$text(displayName), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$span, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$class('badge'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$svg$Svg$text( + _elm_lang$core$Basics$toString(gameplay.playerScore)), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } + }); + }); +var _user$project$Platformer$viewGameplaysList = function (model) { return A2( _elm_lang$html$Html$div, { @@ -16462,7 +16546,7 @@ var _user$project$Platformer$viewPlayerScoresList = function (scores) { }, { ctor: '::', - _0: _elm_lang$svg$Svg$text('Leaderboard'), + _0: _elm_lang$svg$Svg$text('Scores'), _1: {ctor: '[]'} }), _1: { @@ -16474,13 +16558,16 @@ var _user$project$Platformer$viewPlayerScoresList = function (scores) { _0: _elm_lang$html$Html_Attributes$class('list-group'), _1: {ctor: '[]'} }, - A2(_elm_lang$core$List$map, _user$project$Platformer$viewPlayerScoreItem, scores)), + A2( + _elm_lang$core$List$map, + _user$project$Platformer$viewGameplayItem(model), + model.gameplays)), _1: {ctor: '[]'} } }); }; -var _user$project$Platformer$viewPlayerScoresIndex = function (model) { - return _elm_lang$core$List$isEmpty(model.playerScores) ? A2( +var _user$project$Platformer$viewGameplaysIndex = function (model) { + return _elm_lang$core$List$isEmpty(model.gameplays) ? A2( _elm_lang$html$Html$div, {ctor: '[]'}, {ctor: '[]'}) : A2( @@ -16506,21 +16593,25 @@ var _user$project$Platformer$viewPlayerScoresIndex = function (model) { }), _1: { ctor: '::', - _0: _user$project$Platformer$viewPlayerScoresList(model.playerScores), + _0: _user$project$Platformer$viewGameplaysList(model), _1: {ctor: '[]'} } }); }; -var _user$project$Platformer$characterFoundItem = function (model) { - var approximateItemUpperBound = model.itemPositionX; - var approximateItemLowerBound = model.itemPositionX - 35; - var approximateItemRange = A2(_elm_lang$core$List$range, approximateItemLowerBound, approximateItemUpperBound); - return A2(_elm_lang$core$List$member, model.characterPositionX, approximateItemRange); -}; var _user$project$Platformer$initialChannel = _fbonetti$elm_phoenix_socket$Phoenix_Channel$init('score:platformer'); var _user$project$Platformer$Flags = function (a) { return {token: a}; }; +var _user$project$Platformer$Gameplay = F3( + function (a, b, c) { + return {gameId: a, playerId: b, playerScore: c}; + }); +var _user$project$Platformer$scoreDecoder = A4( + _elm_lang$core$Json_Decode$map3, + _user$project$Platformer$Gameplay, + A2(_elm_lang$core$Json_Decode$field, 'game_id', _elm_lang$core$Json_Decode$int), + A2(_elm_lang$core$Json_Decode$field, 'player_id', _elm_lang$core$Json_Decode$int), + A2(_elm_lang$core$Json_Decode$field, 'player_score', _elm_lang$core$Json_Decode$int)); var _user$project$Platformer$Player = F4( function (a, b, c, d) { return {displayName: a, id: b, score: c, username: d}; @@ -16554,7 +16645,9 @@ var _user$project$Platformer$Model = function (a) { return function (k) { return function (l) { return function (m) { - return {errors: a, gameId: b, gameState: c, characterPositionX: d, characterPositionY: e, itemPositionX: f, itemPositionY: g, itemsCollected: h, phxSocket: i, playersList: j, playerScore: k, playerScores: l, timeRemaining: m}; + return function (n) { + return {characterDirection: a, characterPositionX: b, characterPositionY: c, errors: d, gameId: e, gameplays: f, gameState: g, itemPositionX: h, itemPositionY: i, itemsCollected: j, phxSocket: k, playersList: l, playerScore: m, timeRemaining: n}; + }; }; }; }; @@ -16568,16 +16661,8 @@ var _user$project$Platformer$Model = function (a) { }; }; }; -var _user$project$Platformer$Score = F3( - function (a, b, c) { - return {gameId: a, playerId: b, playerScore: c}; - }); -var _user$project$Platformer$scoreDecoder = A4( - _elm_lang$core$Json_Decode$map3, - _user$project$Platformer$Score, - A2(_elm_lang$core$Json_Decode$field, 'game_id', _elm_lang$core$Json_Decode$int), - A2(_elm_lang$core$Json_Decode$field, 'player_id', _elm_lang$core$Json_Decode$int), - A2(_elm_lang$core$Json_Decode$field, 'player_score', _elm_lang$core$Json_Decode$int)); +var _user$project$Platformer$Right = {ctor: 'Right'}; +var _user$project$Platformer$Left = {ctor: 'Left'}; var _user$project$Platformer$GameOver = {ctor: 'GameOver'}; var _user$project$Platformer$Success = {ctor: 'Success'}; var _user$project$Platformer$Playing = {ctor: 'Playing'}; @@ -16588,36 +16673,6 @@ var _user$project$Platformer$TimeUpdate = function (a) { var _user$project$Platformer$SetNewItemPositionX = function (a) { return {ctor: 'SetNewItemPositionX', _0: a}; }; -var _user$project$Platformer$SendScoreRequest = {ctor: 'SendScoreRequest'}; -var _user$project$Platformer$viewSendScoreButton = A2( - _elm_lang$html$Html$div, - {ctor: '[]'}, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$button, - { - ctor: '::', - _0: _elm_lang$html$Html_Events$onClick(_user$project$Platformer$SendScoreRequest), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('btn btn-primary'), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$svg$Svg$text('Send Score'), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - }); -var _user$project$Platformer$SendScoreError = function (a) { - return {ctor: 'SendScoreError', _0: a}; -}; -var _user$project$Platformer$SendScore = function (a) { - return {ctor: 'SendScore', _0: a}; -}; var _user$project$Platformer$SaveScoreRequest = {ctor: 'SaveScoreRequest'}; var _user$project$Platformer$viewSaveScoreButton = A2( _elm_lang$html$Html$div, @@ -16651,15 +16706,11 @@ var _user$project$Platformer$view = function (model) { _0: _user$project$Platformer$viewGame(model), _1: { ctor: '::', - _0: _user$project$Platformer$viewSendScoreButton, + _0: _user$project$Platformer$viewSaveScoreButton, _1: { ctor: '::', - _0: _user$project$Platformer$viewSaveScoreButton, - _1: { - ctor: '::', - _0: _user$project$Platformer$viewPlayerScoresIndex(model), - _1: {ctor: '[]'} - } + _0: _user$project$Platformer$viewGameplaysIndex(model), + _1: {ctor: '[]'} } } }); @@ -16686,9 +16737,9 @@ var _user$project$Platformer$initialSocket = function (flags) { _user$project$Platformer$ReceiveScoreChanges, A4( _fbonetti$elm_phoenix_socket$Phoenix_Socket$on, - 'shout', + 'save_score', 'score:platformer', - _user$project$Platformer$SendScore, + _user$project$Platformer$SaveScore, _fbonetti$elm_phoenix_socket$Phoenix_Socket$withDebug( _fbonetti$elm_phoenix_socket$Phoenix_Socket$init(prodSocketServer))))); }; @@ -16698,18 +16749,19 @@ var _user$project$Platformer$initialSocketJoin = function (flags) { }; var _user$project$Platformer$initialModel = function (flags) { return { + characterDirection: _user$project$Platformer$Right, + characterPositionX: 50, + characterPositionY: 300, errors: '', gameId: 1, + gameplays: {ctor: '[]'}, gameState: _user$project$Platformer$StartScreen, - characterPositionX: 50, - characterPositionY: 300, itemPositionX: 150, itemPositionY: 300, itemsCollected: 0, phxSocket: _user$project$Platformer$initialSocketJoin(flags), playersList: {ctor: '[]'}, playerScore: 0, - playerScores: {ctor: '[]'}, timeRemaining: 10 }; }; @@ -16720,20 +16772,10 @@ var _user$project$Platformer$initialSocketCommand = function (flags) { var _user$project$Platformer$PhoenixMsg = function (a) { return {ctor: 'PhoenixMsg', _0: a}; }; -var _user$project$Platformer$init = function (flags) { - return { - ctor: '_Tuple2', - _0: _user$project$Platformer$initialModel(flags), - _1: A2( - _elm_lang$core$Platform_Cmd$map, - _user$project$Platformer$PhoenixMsg, - _user$project$Platformer$initialSocketCommand(flags)) - }; -}; var _user$project$Platformer$update = F2( function (msg, model) { - var _p1 = msg; - switch (_p1.ctor) { + var _p2 = msg; + switch (_p2.ctor) { case 'NoOp': return {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}; case 'CountdownTimer': @@ -16745,13 +16787,13 @@ var _user$project$Platformer$update = F2( _1: _elm_lang$core$Platform_Cmd$none } : {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}; case 'FetchPlayersList': - var _p2 = _p1._0; - if (_p2.ctor === 'Ok') { + var _p3 = _p2._0; + if (_p3.ctor === 'Ok') { return { ctor: '_Tuple2', _0: _elm_lang$core$Native_Utils.update( model, - {playersList: _p2._0}), + {playersList: _p3._0}), _1: _elm_lang$core$Platform_Cmd$none }; } else { @@ -16760,20 +16802,20 @@ var _user$project$Platformer$update = F2( _0: _elm_lang$core$Native_Utils.update( model, { - errors: _elm_lang$core$Basics$toString(_p2._0) + errors: _elm_lang$core$Basics$toString(_p3._0) }), _1: _elm_lang$core$Platform_Cmd$none }; } case 'KeyDown': - var _p3 = _p1._0; - switch (_p3) { + var _p4 = _p2._0; + switch (_p4) { case 32: return (!_elm_lang$core$Native_Utils.eq(model.gameState, _user$project$Platformer$Playing)) ? { ctor: '_Tuple2', _0: _elm_lang$core$Native_Utils.update( model, - {gameState: _user$project$Platformer$Playing, characterPositionX: 50, playerScore: 0, itemsCollected: 0, timeRemaining: 10}), + {characterDirection: _user$project$Platformer$Right, characterPositionX: 50, itemsCollected: 0, gameState: _user$project$Platformer$Playing, playerScore: 0, timeRemaining: 10}), _1: _elm_lang$core$Platform_Cmd$none } : {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}; case 37: @@ -16781,7 +16823,7 @@ var _user$project$Platformer$update = F2( ctor: '_Tuple2', _0: _elm_lang$core$Native_Utils.update( model, - {characterPositionX: model.characterPositionX - 15}), + {characterDirection: _user$project$Platformer$Left, characterPositionX: model.characterPositionX - 15}), _1: _elm_lang$core$Platform_Cmd$none } : {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}; case 39: @@ -16789,16 +16831,16 @@ var _user$project$Platformer$update = F2( ctor: '_Tuple2', _0: _elm_lang$core$Native_Utils.update( model, - {characterPositionX: model.characterPositionX + 15}), + {characterDirection: _user$project$Platformer$Right, characterPositionX: model.characterPositionX + 15}), _1: _elm_lang$core$Platform_Cmd$none } : {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}; default: return {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}; } case 'PhoenixMsg': - var _p4 = A2(_fbonetti$elm_phoenix_socket$Phoenix_Socket$update, _p1._0, model.phxSocket); - var phxSocket = _p4._0; - var phxCmd = _p4._1; + var _p5 = A2(_fbonetti$elm_phoenix_socket$Phoenix_Socket$update, _p2._0, model.phxSocket); + var phxSocket = _p5._0; + var phxCmd = _p5._1; return { ctor: '_Tuple2', _0: _elm_lang$core$Native_Utils.update( @@ -16807,14 +16849,14 @@ var _user$project$Platformer$update = F2( _1: A2(_elm_lang$core$Platform_Cmd$map, _user$project$Platformer$PhoenixMsg, phxCmd) }; case 'ReceiveScoreChanges': - var _p5 = A2(_elm_lang$core$Json_Decode$decodeValue, _user$project$Platformer$scoreDecoder, _p1._0); - if (_p5.ctor === 'Ok') { + var _p6 = A2(_elm_lang$core$Json_Decode$decodeValue, _user$project$Platformer$scoreDecoder, _p2._0); + if (_p6.ctor === 'Ok') { return { ctor: '_Tuple2', _0: _elm_lang$core$Native_Utils.update( model, { - playerScores: {ctor: '::', _0: _p5._0, _1: model.playerScores} + gameplays: {ctor: '::', _0: _p6._0, _1: model.gameplays} }), _1: _elm_lang$core$Platform_Cmd$none }; @@ -16823,7 +16865,7 @@ var _user$project$Platformer$update = F2( ctor: '_Tuple2', _0: _elm_lang$core$Native_Utils.update( model, - {errors: _p5._0}), + {errors: _p6._0}), _1: _elm_lang$core$Platform_Cmd$none }; } @@ -16832,7 +16874,7 @@ var _user$project$Platformer$update = F2( case 'SaveScoreError': return A2( _elm_lang$core$Debug$log, - 'Error saveing score over socket.', + 'Error saving score over socket.', {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}); case 'SaveScoreRequest': var payload = _elm_lang$core$Json_Encode$object( @@ -16855,44 +16897,6 @@ var _user$project$Platformer$update = F2( _fbonetti$elm_phoenix_socket$Phoenix_Push$withPayload, payload, A2(_fbonetti$elm_phoenix_socket$Phoenix_Push$init, 'save_score', 'score:platformer')))); - var _p6 = A2(_fbonetti$elm_phoenix_socket$Phoenix_Socket$push, phxPush, model.phxSocket); - var phxSocket = _p6._0; - var phxCmd = _p6._1; - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Native_Utils.update( - model, - {phxSocket: phxSocket}), - _1: A2(_elm_lang$core$Platform_Cmd$map, _user$project$Platformer$PhoenixMsg, phxCmd) - }; - case 'SendScore': - return {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}; - case 'SendScoreError': - return A2( - _elm_lang$core$Debug$log, - 'Error sending score over socket.', - {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}); - case 'SendScoreRequest': - var payload = _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'player_score', - _1: _elm_lang$core$Json_Encode$int(model.playerScore) - }, - _1: {ctor: '[]'} - }); - var phxPush = A2( - _fbonetti$elm_phoenix_socket$Phoenix_Push$onError, - _user$project$Platformer$SendScoreError, - A2( - _fbonetti$elm_phoenix_socket$Phoenix_Push$onOk, - _user$project$Platformer$SendScore, - A2( - _fbonetti$elm_phoenix_socket$Phoenix_Push$withPayload, - payload, - A2(_fbonetti$elm_phoenix_socket$Phoenix_Push$init, 'shout', 'score:platformer')))); var _p7 = A2(_fbonetti$elm_phoenix_socket$Phoenix_Socket$push, phxPush, model.phxSocket); var phxSocket = _p7._0; var phxCmd = _p7._1; @@ -16908,7 +16912,7 @@ var _user$project$Platformer$update = F2( ctor: '_Tuple2', _0: _elm_lang$core$Native_Utils.update( model, - {itemPositionX: _p1._0}), + {itemPositionX: _p2._0}), _1: _elm_lang$core$Platform_Cmd$none }; default: @@ -16946,6 +16950,25 @@ var _user$project$Platformer$fetchPlayersList = A2( _elm_lang$http$Http$send, _user$project$Platformer$FetchPlayersList, A2(_elm_lang$http$Http$get, '/api/players', _user$project$Platformer$decodePlayersList)); +var _user$project$Platformer$init = function (flags) { + return { + ctor: '_Tuple2', + _0: _user$project$Platformer$initialModel(flags), + _1: _elm_lang$core$Platform_Cmd$batch( + { + ctor: '::', + _0: _user$project$Platformer$fetchPlayersList, + _1: { + ctor: '::', + _0: A2( + _elm_lang$core$Platform_Cmd$map, + _user$project$Platformer$PhoenixMsg, + _user$project$Platformer$initialSocketCommand(flags)), + _1: {ctor: '[]'} + } + }) + }; +}; var _user$project$Platformer$CountdownTimer = function (a) { return {ctor: 'CountdownTimer', _0: a}; }; @@ -16987,7 +17010,7 @@ if (typeof _user$project$Main$main !== 'undefined') { } Elm['Platformer'] = Elm['Platformer'] || {}; if (typeof _user$project$Platformer$main !== 'undefined') { - _user$project$Platformer$main(Elm['Platformer'], 'Platformer', {"types":{"unions":{"Dict.LeafColor":{"args":[],"tags":{"LBBlack":[],"LBlack":[]}},"Platformer.Msg":{"args":[],"tags":{"SetNewItemPositionX":["Int"],"SendScoreRequest":[],"SaveScoreRequest":[],"CountdownTimer":["Time.Time"],"FetchPlayersList":["Result.Result Http.Error (List Platformer.Player)"],"SaveScore":["Json.Encode.Value"],"SendScore":["Json.Encode.Value"],"PhoenixMsg":["Phoenix.Socket.Msg Platformer.Msg"],"TimeUpdate":["Time.Time"],"SendScoreError":["Json.Encode.Value"],"KeyDown":["Keyboard.KeyCode"],"ReceiveScoreChanges":["Json.Encode.Value"],"NoOp":[],"SaveScoreError":["Json.Encode.Value"]}},"Json.Encode.Value":{"args":[],"tags":{"Value":[]}},"Dict.Dict":{"args":["k","v"],"tags":{"RBNode_elm_builtin":["Dict.NColor","k","v","Dict.Dict k v","Dict.Dict k v"],"RBEmpty_elm_builtin":["Dict.LeafColor"]}},"Maybe.Maybe":{"args":["a"],"tags":{"Just":["a"],"Nothing":[]}},"Dict.NColor":{"args":[],"tags":{"BBlack":[],"Red":[],"NBlack":[],"Black":[]}},"Http.Error":{"args":[],"tags":{"BadUrl":["String"],"NetworkError":[],"Timeout":[],"BadStatus":["Http.Response String"],"BadPayload":["String","Http.Response String"]}},"Result.Result":{"args":["error","value"],"tags":{"Ok":["value"],"Err":["error"]}},"Phoenix.Socket.Msg":{"args":["msg"],"tags":{"ChannelErrored":["String"],"ChannelClosed":["String"],"ExternalMsg":["msg"],"ChannelJoined":["String"],"Heartbeat":["Time.Time"],"NoOp":[],"ReceiveReply":["String","Int"]}}},"aliases":{"Http.Response":{"args":["body"],"type":"{ url : String , status : { code : Int, message : String } , headers : Dict.Dict String String , body : body }"},"Keyboard.KeyCode":{"args":[],"type":"Int"},"Platformer.Player":{"args":[],"type":"{ displayName : Maybe.Maybe String , id : Int , score : Int , username : String }"},"Time.Time":{"args":[],"type":"Float"}},"message":"Platformer.Msg"},"versions":{"elm":"0.18.0"}}); + _user$project$Platformer$main(Elm['Platformer'], 'Platformer', {"types":{"unions":{"Dict.LeafColor":{"args":[],"tags":{"LBBlack":[],"LBlack":[]}},"Platformer.Msg":{"args":[],"tags":{"SetNewItemPositionX":["Int"],"SaveScoreRequest":[],"CountdownTimer":["Time.Time"],"FetchPlayersList":["Result.Result Http.Error (List Platformer.Player)"],"SaveScore":["Json.Encode.Value"],"PhoenixMsg":["Phoenix.Socket.Msg Platformer.Msg"],"TimeUpdate":["Time.Time"],"KeyDown":["Keyboard.KeyCode"],"ReceiveScoreChanges":["Json.Encode.Value"],"NoOp":[],"SaveScoreError":["Json.Encode.Value"]}},"Json.Encode.Value":{"args":[],"tags":{"Value":[]}},"Dict.Dict":{"args":["k","v"],"tags":{"RBNode_elm_builtin":["Dict.NColor","k","v","Dict.Dict k v","Dict.Dict k v"],"RBEmpty_elm_builtin":["Dict.LeafColor"]}},"Maybe.Maybe":{"args":["a"],"tags":{"Just":["a"],"Nothing":[]}},"Dict.NColor":{"args":[],"tags":{"BBlack":[],"Red":[],"NBlack":[],"Black":[]}},"Http.Error":{"args":[],"tags":{"BadUrl":["String"],"NetworkError":[],"Timeout":[],"BadStatus":["Http.Response String"],"BadPayload":["String","Http.Response String"]}},"Result.Result":{"args":["error","value"],"tags":{"Ok":["value"],"Err":["error"]}},"Phoenix.Socket.Msg":{"args":["msg"],"tags":{"ChannelErrored":["String"],"ChannelClosed":["String"],"ExternalMsg":["msg"],"ChannelJoined":["String"],"Heartbeat":["Time.Time"],"NoOp":[],"ReceiveReply":["String","Int"]}}},"aliases":{"Http.Response":{"args":["body"],"type":"{ url : String , status : { code : Int, message : String } , headers : Dict.Dict String String , body : body }"},"Keyboard.KeyCode":{"args":[],"type":"Int"},"Platformer.Player":{"args":[],"type":"{ displayName : Maybe.Maybe String , id : Int , score : Int , username : String }"},"Time.Time":{"args":[],"type":"Float"}},"message":"Platformer.Msg"},"versions":{"elm":"0.18.0"}}); } if (typeof define === "function" && define['amd']) diff --git a/assets/static/images/character-left.gif b/assets/static/images/character-left.gif new file mode 100644 index 0000000..ce49afe Binary files /dev/null and b/assets/static/images/character-left.gif differ diff --git a/assets/static/images/character-right.gif b/assets/static/images/character-right.gif new file mode 100644 index 0000000..cb86973 Binary files /dev/null and b/assets/static/images/character-right.gif differ