index.erl 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. -module(index).
  2. -compile({parse_transform, shen}).
  3. -compile(export_all).
  4. -include_lib("n2o/include/wf.hrl").
  5. -include("../../server/include/requests.hrl").
  6. -include("../../server/include/settings.hrl").
  7. -jsmacro([take/2,attach/1,join/1,discard/3]).
  8. join(Game) ->
  9. ws:send(bert:encodebuf(bert:tuple(
  10. bert:atom('client'),
  11. bert:tuple(bert:atom("join_game"), Game)))).
  12. attach(Token) ->
  13. ws:send(bert:encodebuf(bert:tuple(
  14. bert:atom('client'),
  15. bert:tuple(bert:atom("session_attach"), Token)))).
  16. take(GameId,Place) ->
  17. ws:send(bert:encodebuf(bert:tuple(
  18. bert:atom('client'),
  19. bert:tuple(bert:atom("game_action"),GameId, bert:atom("okey_take"),[{pile,Place}])))).
  20. discard(GameId, Color, Value) ->
  21. ws:send(bert:encodebuf(bert:tuple(
  22. bert:atom('client'),
  23. bert:tuple(
  24. bert:atom("game_action"),
  25. GameId,
  26. bert:atom("okey_discard"),
  27. [{tile, bert:tuple(bert:atom("OkeyPiece"), Color, Value)}])))).
  28. redraw_tiles([{Tile, _}| _ ] = TilesList) ->
  29. wf:update(dddiscard, [#dropdown{id = dddiscard, postback = combo, value = Tile, source = [dddiscard], options = [#option{label = CVBin, value = CVBin} || {CVBin, _} <- TilesList]}]).
  30. main() -> #dtl{file="index", bindings=[{title,<<"N2O">>},{body,body()}]}.
  31. body() ->
  32. [ #panel{ id=history },
  33. #label{ id = player1, body = "Player 1", style = "color=black;"}, #label{ id = player2, body = "Player 2", style = "color=black;"},
  34. #label{ id = player3, body = "Player 3", style = "color=black;"}, #label{ id = player4, body = "Player 4", style = "color=black;"},
  35. #br{},
  36. #button{ id = attach, body = <<"Attach">>, postback = attach},
  37. #button{ id = join, body = <<"Join">>, postback = join},
  38. #dropdown{ id=ddtake, value="0", postback=combo, source=[ddtake],
  39. options =
  40. [
  41. #option { label= <<"0">>, value= <<"0">> },
  42. #option { label= <<"1">>, value= <<"1">> }
  43. ]
  44. },
  45. #button{ id = take, body = <<"Take">>, postback = take, source = [ddtake]},
  46. #dropdown{ id=dddiscard, value="2", postback=combo, source=[dddiscard],
  47. options =
  48. [
  49. #option { label= <<"Option 1">>, value= <<"1">> },
  50. #option { label= <<"Option 2">>, value= <<"2">> },
  51. #option { label= <<"Option 3">>, value= <<"3">> }
  52. ]
  53. },
  54. #button{ id = discard, body = <<"Discard">>, postback = discard, source=[dddiscard]}
  55. ].
  56. event(terminate) -> wf:info("terminate");
  57. event(init) ->
  58. {ok,GamePid} = game_session:start_link(self()),
  59. event(attach),
  60. event(join),
  61. put(game_session, GamePid);
  62. event(combo) -> wf:info("Combo: ~p",[wf:q(dddiscard)]);
  63. event(join) -> wf:wire(join("1000001"));
  64. event(attach) ->
  65. Token = auth_server:generate_token(),
  66. auth_server:store_token(1000001,Token,"maxim"),
  67. wf:wire(attach(wf:f("'~s'",[Token])));
  68. event(take) -> wf:wire(take("1000001", wf:q(ddtake)));
  69. event(discard) ->
  70. TilesList = get(game_okey_tiles),
  71. % wf:info("dd ~p", [wf:q(dddiscard)]),
  72. {_, {C, V}} = lists:keyfind(erlang:list_to_binary(wf:q(dddiscard)), 1, TilesList),
  73. wf:wire(discard("1000001", erlang:integer_to_list(C), erlang:integer_to_list(V)));
  74. event({client,Message}) ->
  75. GamePid = get(game_session),
  76. game_session:process_request(GamePid, Message);
  77. event({server, {game_event, _, okey_game_started, Args}}) ->
  78. {_, Tiles} = lists:keyfind(tiles, 1, Args),
  79. TilesList = [{erlang:list_to_binary([erlang:integer_to_list(C), " ", erlang:integer_to_list(V)]), {C, V}} || {_, C, V} <- Tiles],
  80. wf:info("tiles ~p", [TilesList]),
  81. put(game_okey_tiles, TilesList),
  82. redraw_tiles(TilesList);
  83. event({server, {game_event, _, okey_tile_discarded, Args}}) ->
  84. Im = get(okey_im),
  85. {_, Player} = lists:keyfind(player, 1, Args),
  86. if
  87. Im == Player ->
  88. {_, {_, C, V}} = lists:keyfind(tile, 1, Args),
  89. % wf:info("c ~p v ~p", [C, V]),
  90. TilesListOld = get(game_okey_tiles),
  91. TilesList = lists:keydelete({C, V}, 2, TilesListOld),
  92. put(game_okey_tiles, TilesList),
  93. redraw_tiles(TilesList);
  94. true ->
  95. ok
  96. end;
  97. event({server, {game_event, _, okey_tile_taken, Args}}) ->
  98. Im = get(okey_im),
  99. {_, Player} = lists:keyfind(player, 1, Args),
  100. if
  101. Im == Player ->
  102. case lists:keyfind(revealed, 1, Args) of
  103. {_, {_, C, V}} ->
  104. TilesList = [{erlang:list_to_binary([erlang:integer_to_list(C), " ", erlang:integer_to_list(V)]), {C, V}} | get(game_okey_tiles)],
  105. put(game_okey_tiles, TilesList),
  106. redraw_tiles(TilesList);
  107. _ ->
  108. ok
  109. end;
  110. true ->
  111. ok
  112. end;
  113. event({server,{game_event, Game, okey_turn_timeout, Args}}) ->
  114. wf:info("okey_turn_timeout ~p", [Args]),
  115. {_, TileTaken} = lists:keyfind(tile_taken, 1, Args),
  116. event({server, {game_event, Game, okey_tile_taken, [{player, get(okey_im)}, {revealed, TileTaken}]}}),
  117. {_, TileDiscarded} = lists:keyfind(tile_discarded, 1, Args),
  118. event({server, {game_event, Game, okey_tile_discarded, [{player, get(okey_im)}, {tile, TileDiscarded}]}});
  119. event({server, {game_event, _, okey_game_info, Args}}) ->
  120. wf:info("okay_game_info ~p", [Args]),
  121. {_, PlayersInfo} = lists:keyfind(players, 1, Args),
  122. % wf:info("pi ~p", [PlayersInfo]),
  123. Players =
  124. lists:zipwith(
  125. fun(ListId, {PlayerId, PlayerLabel}) ->
  126. {ListId, PlayerId, PlayerLabel}
  127. end,
  128. [player1, player2, player3, player4],
  129. lists:map(
  130. fun
  131. (#'PlayerInfo'{id = Id, robot = true} = P) ->
  132. % wf:info("pp ~p", [P]),
  133. {Id, <<Id/binary, <<" R ">>/binary>>};
  134. (#'PlayerInfo'{id = Id, robot = false} = P) ->
  135. % wf:info("pr ~p", [P]),
  136. put(okey_im, Id),
  137. {Id, <<Id/binary, <<" M ">>/binary>>}
  138. end,
  139. PlayersInfo
  140. )
  141. ),
  142. wf:info("players ~p", [Players]),
  143. put(okey_players, Players),
  144. [wf:update(LabelId, [#label{id = LabelId, body = PlayerLabel}]) || {LabelId, _, PlayerLabel} <- Players];
  145. event({server,{game_event, _, okey_next_turn, Args}}) ->
  146. {player, PlayerId} = lists:keyfind(player, 1, Args),
  147. {LabelId, _, _} = lists:keyfind(PlayerId, 2, get(okey_players)),
  148. case get(okey_turn_mark) of
  149. undefined ->
  150. ok;
  151. OldLabelId ->
  152. wf:wire("document.querySelector('#" ++ erlang:atom_to_list(OldLabelId) ++ "').style.color = \"black\";")
  153. end,
  154. wf:wire("document.querySelector('#" ++ erlang:atom_to_list(LabelId) ++ "').style.color = \"red\";"),
  155. put(okey_turn_mark, LabelId);
  156. event(Event) -> ok. % wf:info("Event: ~p", [Event]).