From d9e95b2508d561ff6e5f5bb3abd147af530dcc2a Mon Sep 17 00:00:00 2001 From: Jeena Paradies Date: Wed, 13 Apr 2011 16:31:11 +0200 Subject: [PATCH] fixed problem with two concurrent players --- src/ggs_gamevm_p.erl | 36 ++++++++++++++++++++---------------- src/ggs_player.erl | 24 ++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/ggs_gamevm_p.erl b/src/ggs_gamevm_p.erl index b408acc..78aafda 100644 --- a/src/ggs_gamevm_p.erl +++ b/src/ggs_gamevm_p.erl @@ -36,7 +36,6 @@ define(GameVM, SourceCode) -> %% Command = a game command to run %% Args = arguments for the Command parameter player_command(GameVM, Player, Command, Args) -> - erlang:display(Command), gen_server:cast(GameVM, {player_command, Player, Command, Args}). %% @private @@ -118,23 +117,28 @@ intern_player_command(Table, Player, Command, _Args) -> intern_add_player(Table, Player) -> {ok, PlayerList} = ggs_table:get_player_list(Table), - erlang:display(PlayerList), case length(PlayerList) of - 1 -> - erlang:display("P1: joining"), - ggs_db:setItem(Table, local_storage, Player, player1), - erlang:display(ggs_db:getItem(Table, local_storage, Player)), - ggs_db:setItem(Table, local_storage, player1_y, 50), - ggs_table:send_command(Table, Player, {"welcome", int2str(1)}), - ggs_table:notify_all_players(Table, {"player1_y", int2str(50)}); + 1 -> + erlang:display("A player joined"); 2 -> - erlang:display("P2: joining"), - ggs_db:setItem(Table, local_storage, Player, player2), - erlang:display(ggs_db:getItem(Table, local_storage, Player)), - ggs_db:setItem(Table, local_storage, player2_y, 50), - ggs_table:send_command(Table, Player, {"welcome", int2str(2)}), - ggs_table:send_command(Table, Player, {"player1_y", int2str(50)}), - ggs_table:notify_all_players(Table, {"player2_y", int2str(50)}); + [First|_] = PlayerList, + case First == Player of + true -> + erlang:display("P1: joining"), + ggs_db:setItem(Table, local_storage, Player, player1), + erlang:display(ggs_db:getItem(Table, local_storage, Player)), + ggs_db:setItem(Table, local_storage, player1_y, 50), + ggs_table:send_command(Table, Player, {"welcome", int2str(1)}), + ggs_table:notify_all_players(Table, {"player1_y", int2str(50)}); + false -> + erlang:display("P2: joining"), + ggs_db:setItem(Table, local_storage, Player, player2), + erlang:display(ggs_db:getItem(Table, local_storage, Player)), + ggs_db:setItem(Table, local_storage, player2_y, 50), + ggs_table:send_command(Table, Player, {"welcome", int2str(2)}), + ggs_table:send_command(Table, Player, {"player1_y", int2str(50)}), + ggs_table:notify_all_players(Table, {"player2_y", int2str(50)}) + end; _Other -> ggs_table:send_command(Table, Player, {"not_welcome", ""}) end. diff --git a/src/ggs_player.erl b/src/ggs_player.erl index 1406cc6..7057dbe 100644 --- a/src/ggs_player.erl +++ b/src/ggs_player.erl @@ -27,13 +27,33 @@ start(Socket) -> gen_server:start(?MODULE, [Socket], []). +join_table(Num) -> + case ggs_coordinator:join_table(integer_to_list(Num)) of + {ok, T} -> + io:format("Joining existing table: ~p~n", [T]), + T; + {error, no_such_table} -> + case ggs_coordinator:create_table({force, integer_to_list(Num)}) of + {ok, TBToken} -> ok + end, + case ggs_coordinator:join_table(integer_to_list(Num)) of + {ok, T} -> io:format("Creating new table: ~p~n", [T]), + T; + {error, E} -> erlang:display(E), + join_table(Num+1) + end; + {error, table_full} -> + erlang:display("Table full!"), + join_table(Num+1) + end. + init([Socket]) -> {ok, Protocol} = ggs_protocol:start_link(), {ok, Token} = ggs_coordinator:join_lobby(), erlang:port_connect(Socket, self()), - Table = ggs_coordinator:join_table(), + Table = join_table(1), State = #state{ token = Token, socket = Socket, @@ -108,4 +128,4 @@ terminate(Reason, State) -> % TODO: release Socket ok. -code_change(_OldVsn, St, _Extra) -> {ok, St}. +code_change(_OldVsn, St, _Extra) -> {ok, St}. \ No newline at end of file