Skip to content

Commit

Permalink
chnage the game_query and watch operation
Browse files Browse the repository at this point in the history
  • Loading branch information
QianhuaiOzc committed Feb 28, 2012
1 parent 1351e43 commit b23fefa
Show file tree
Hide file tree
Showing 9 changed files with 101 additions and 64 deletions.
8 changes: 6 additions & 2 deletions include/common.hrl
Expand Up @@ -22,7 +22,8 @@
trace
}).

-define(PLAYER_TIMEOUT, 15000).
-define(SLOW_PLAYER_TIMEOUT, 18000).
-define(FAST_PLAYER_TIMEOUT, 9000).
-define(START_DELAY, 14000).

%%% Error codes
Expand All @@ -40,6 +41,7 @@

%%% Game stage

-define(GS_CANCEL, 254).
-define(GS_PREFLOP, 0).
-define(GS_FLOP, 1).
-define(GS_TURN, 2).
Expand All @@ -62,7 +64,9 @@
-record(limit, {
type,
low,
high
high,
min,
max
}).

%%% Query operator
Expand Down
2 changes: 1 addition & 1 deletion include/game.hrl
Expand Up @@ -38,7 +38,7 @@
observers = [],
%% time given to players
%% to make a move
timeout = ?PLAYER_TIMEOUT,
timeout = ?SLOW_PLAYER_TIMEOUT,
%% number of raises so far
raise_count = 0,
%% players required to start a game
Expand Down
9 changes: 5 additions & 4 deletions include/pp.hrl
Expand Up @@ -105,8 +105,8 @@
game_type,
limit_type,
expected, % query op
joined, % query op
waiting
min,
timeout
}).

-define(CMD_SEAT_QUERY, 14).
Expand Down Expand Up @@ -135,7 +135,7 @@
seat_count,
required = 2,
start_delay = ?START_DELAY,
player_timeout = ?PLAYER_TIMEOUT,
player_timeout = ?SLOW_PLAYER_TIMEOUT,
rigged_deck = [],
barrier
}).
Expand All @@ -150,7 +150,8 @@
seat_count,
required,
joined,
waiting
waiting,
timeout
}).

-define(CMD_PLAYER_INFO, 19).
Expand Down
27 changes: 18 additions & 9 deletions src/exch.erl
Expand Up @@ -34,7 +34,9 @@

-include_lib("eunit/include/eunit.hrl").

-include("common.hrl").
-include("test.hrl").
-include("pp.hrl").

-record(exch, {
parent,
Expand Down Expand Up @@ -129,19 +131,26 @@ process_call(Event, Exch) ->
Cbk:call(Event, Exch#exch.data).

process_cast(Event, Exch) ->
%io:format("EVENT: ~p~n", [Event]),
{Mod, _} = hd(Exch#exch.stack),
State = Exch#exch.state,
Data = Exch#exch.data,
Ctx = Exch#exch.ctx,

case Cbk:cast(Event, Ctx, Data) of
skip ->
Result = Mod:State(Data, Ctx, Event),
advance(Exch, Event, Result);
{NewGame, NewCtx} ->
{noreply, Exch#exch{data = NewGame, ctx = NewCtx}}
end.

if
is_record(Event, watch) ->
io:format("EVENT: ~p~n", [Event]);
true ->
ok
end,
Result = Mod:State(Data, Ctx, Event),
advance(Exch, Event, Result).
% case Cbk:cast(Event, Ctx, Data) of
% skip ->
% Result = Mod:State(Data, Ctx, Event),
% advance(Exch, Event, Result);
% {NewGame, NewCtx} ->
% {noreply, Exch#exch{data = NewGame, ctx = NewCtx}}
% end.

init(Exch = #exch{ stack = [{Mod, Params}|_] }, Event) ->
Ctx = Exch#exch.ctx,
Expand Down
15 changes: 9 additions & 6 deletions src/pp.erl
Expand Up @@ -187,13 +187,15 @@ limit() ->
record(limit, {
limit_type(),
price(),
price(),
price(),
price()
}).

query_op() ->
record(query_op, {
byte(),
byte()
int()
}).

game_to_id(G)
Expand Down Expand Up @@ -428,7 +430,8 @@ game_info() ->
seat_count(),
required_players(),
joined_players(),
waiting_players()
waiting_players(),
player_timeout()
}).

player_info() ->
Expand Down Expand Up @@ -641,8 +644,8 @@ notify_game_detail() ->
record(notify_game_detail, {
game(),
amount(),
seats(),
players(),
seat_count(),
byte(),
stage(),
price(),
price(),
Expand Down Expand Up @@ -826,9 +829,9 @@ write(R) when is_record(R, pong) ->
%% 新增的注册协议的序列化写函数
write(R) when is_record(R, sign_in) ->
[?CMD_SIGN_IN|pickle(sign_in(), R)];
write(R) when is_record(R, ?NOTIFY_SEAT_DETAIL) ->
write(R) when is_record(R, notify_seat_detail) ->
[?NOTIFY_SEAT_DETAIL | pickle(notify_seat_detail(), R)];
write(R) when is_record(R, ?NOTIFY_GAME_DETAIL) ->
write(R) when is_record(R, notify_game_detail) ->
[?NOTIFY_GAME_DETAIL | pickle(notify_game_detail(), R)].

%%% Unpickle
Expand Down
52 changes: 36 additions & 16 deletions src/schema.erl
Expand Up @@ -151,22 +151,42 @@ install_counter(Nodes) ->

populate() ->
%% 创建tab_game_config table 的一条记录
g:setup(?GT_IRC_TEXAS, 20,
#limit{ type = ?LT_FIXED_LIMIT, low = 10, high = 20},
?START_DELAY, ?PLAYER_TIMEOUT,
10),
g:setup(?GT_TEXAS_HOLDEM, 10,
#limit{ type = ?LT_FIXED_LIMIT, low = 10, high = 20},
?START_DELAY, ?PLAYER_TIMEOUT,
50),
g:setup(?GT_TEXAS_HOLDEM, 10,
#limit{ type = ?LT_NO_LIMIT, low = 10, high = 20},
?START_DELAY, ?PLAYER_TIMEOUT,
50),
g:setup(?GT_TEXAS_HOLDEM, 10,
#limit{ type = ?LT_POT_LIMIT, low = 10, high = 20},
?START_DELAY, ?PLAYER_TIMEOUT,
50).
g:setup(?GT_TEXAS_HOLDEM, 9,
#limit{ type = ?LT_FIXED_LIMIT, low = 1, high = 2, min = 20, max = 200},
?START_DELAY, ?SLOW_PLAYER_TIMEOUT, 50),
g:setup(?GT_TEXAS_HOLDEM, 9,
#limit{ type = ?LT_FIXED_LIMIT, low = 1, high = 2, min = 20, max = 200},
?START_DELAY, ?FAST_PLAYER_TIMEOUT, 50),
g:setup(?GT_TEXAS_HOLDEM, 5,
#limit{ type = ?LT_FIXED_LIMIT, low = 1, high = 2, min = 20, max = 200},
?START_DELAY, ?SLOW_PLAYER_TIMEOUT, 50),
g:setup(?GT_TEXAS_HOLDEM, 5,
#limit{ type = ?LT_FIXED_LIMIT, low = 1, high = 2, min = 20, max = 200},
?START_DELAY, ?FAST_PLAYER_TIMEOUT, 50),
g:setup(?GT_TEXAS_HOLDEM, 9,
#limit{ type = ?LT_FIXED_LIMIT, low = 2, high = 4, min = 40, max = 400},
?START_DELAY, ?SLOW_PLAYER_TIMEOUT, 50),
g:setup(?GT_TEXAS_HOLDEM, 9,
#limit{ type = ?LT_FIXED_LIMIT, low = 2, high = 4, min = 40, max = 400},
?START_DELAY, ?FAST_PLAYER_TIMEOUT, 50),
g:setup(?GT_TEXAS_HOLDEM, 5,
#limit{ type = ?LT_FIXED_LIMIT, low = 2, high = 4, min = 40, max = 400},
?START_DELAY, ?SLOW_PLAYER_TIMEOUT, 50),
g:setup(?GT_TEXAS_HOLDEM, 5,
#limit{ type = ?LT_FIXED_LIMIT, low = 2, high = 4, min = 40, max = 400},
?START_DELAY, ?FAST_PLAYER_TIMEOUT, 50),
g:setup(?GT_TEXAS_HOLDEM, 9,
#limit{ type = ?LT_FIXED_LIMIT, low = 5, high = 10, min = 50, max = 1000},
?START_DELAY, ?SLOW_PLAYER_TIMEOUT, 50),
g:setup(?GT_TEXAS_HOLDEM, 9,
#limit{ type = ?LT_FIXED_LIMIT, low = 5, high = 10, min = 50, max = 1000},
?START_DELAY, ?FAST_PLAYER_TIMEOUT, 50),
g:setup(?GT_TEXAS_HOLDEM, 5,
#limit{ type = ?LT_FIXED_LIMIT, low = 5, high = 10, min = 50, max = 1000},
?START_DELAY, ?SLOW_PLAYER_TIMEOUT, 50),
g:setup(?GT_TEXAS_HOLDEM, 5,
#limit{ type = ?LT_FIXED_LIMIT, low = 5, high = 10, min = 50, max = 1000},
?START_DELAY, ?FAST_PLAYER_TIMEOUT, 50).

reset_counters()->
counter:reset(game),
Expand Down
21 changes: 14 additions & 7 deletions src/server.erl
Expand Up @@ -239,12 +239,13 @@ process_test_start_game(Client, Socket, R) ->

process_game_query(Client, Socket, Q)
when is_record(Q, game_query) ->
io:format("GAME QUERY: ~p~n", [Q]),
find_games(Socket,
Q#game_query.game_type,
Q#game_query.limit_type,
Q#game_query.expected,
Q#game_query.joined,
Q#game_query.waiting),
Q#game_query.min,
Q#game_query.timeout),
Client.

process_event(Client, _Socket, Event) ->
Expand Down Expand Up @@ -318,13 +319,19 @@ send_games(Socket, [H|T]) ->
find_games(Socket,
GameType, LimitType,
#query_op{ op = ExpOp, val = Expected },
#query_op{ op = JoinOp, val = Joined },
#query_op{ op = WaitOp, val = Waiting }) ->
#query_op{ op = MinOp, val = Min },
#query_op{ op = TimeoutOp, val = Timeout }) ->
{atomic, L} = g:find(GameType, LimitType,
ExpOp, Expected,
JoinOp, Joined,
WaitOp, Waiting),
send_games(Socket, L).
MinOp, Min,
TimeoutOp, Timeout),
if
length(L) =:= 0 ->
send_games(Socket, []);
true ->
[H | _T] = lists:keysort(9, L),
send_games(Socket, [H])
end.

start_games() ->
{atomic, Games} = db:find(tab_game_config),
Expand Down
6 changes: 3 additions & 3 deletions src/test.erl
Expand Up @@ -630,7 +630,7 @@ simple_game_simulation_test() ->
?assertEqual({'START', GID}, wait()),
%% wait for game to end
Winners = gb_trees:insert(2, 15.0, gb_trees:empty()),
?assertEqual({'END', GID, Winners}, wait(?PLAYER_TIMEOUT)),
?assertEqual({'END', GID, Winners}, wait(?SLOW_PLAYER_TIMEOUT)),
timer:sleep(1000),
%% check balances
[B1] = db:read(tab_balance, ID1),
Expand Down Expand Up @@ -1035,8 +1035,8 @@ find_game(Host, Port, GameType) ->
game_type = GameType,
limit_type = ?LT_FIXED_LIMIT,
expected = #query_op{ op = ?OP_IGNORE, val = 2},
joined = #query_op{ op = ?OP_EQUAL, val = 0},
waiting = #query_op{ op = ?OP_IGNORE, val = 0}
min = #query_op{ op = ?OP_EQUAL, val = 0},
timeout = #query_op{ op = ?OP_IGNORE, val = 0}
}),
X = wait([chat, notify_cancel_game, ping, pong]),
?assertEqual(game_info, element(1, X)),
Expand Down
25 changes: 9 additions & 16 deletions src/texas/g.erl
Expand Up @@ -261,11 +261,7 @@ watch(Game, Ctx, R) ->
pot = pot:total(Game#game.pot),
players = length(Players),
seats = size(Game#game.seats),
stage = Ctx#texas.stage,
min = Game#game.min,
max = Game#game.max,
low = Game#game.low,
high = Game#game.high
stage = Ctx#texas.stage
},

Detail1 = case Detail#notify_game_detail.stage of
Expand All @@ -275,12 +271,8 @@ watch(Game, Ctx, R) ->
Detail
end,

gen_server:cast(R#watch.player, Detail1),
gen_server:cast(R#watch.player, Detail1).

notify_shared(lists:reverse(Game#game.board), Game, R#watch.player),

notify_player_state(R#watch.player, Game),
watch(R, Game).

notify_player_state(Player, Game) ->
L = seat_query(Game),
Expand Down Expand Up @@ -747,14 +739,14 @@ query_op(Arg, Op, Value)

find(GameType, LimitType,
ExpOp, Expected,
JoinOp, Joined,
WaitOp, Waiting) ->
MinOp, Min,
TimeoutOp, Timeout) ->
F = fun() -> find_1(GameType, LimitType) end,
{atomic, L} = mnesia:transaction(F),
F1 = fun(R = #game_info{}) ->
query_op(R#game_info.required, ExpOp, Expected)
and query_op(R#game_info.joined, JoinOp, Joined)
and query_op(R#game_info.waiting, WaitOp, Waiting)
query_op(R#game_info.seat_count, ExpOp, Expected)
and query_op(R#game_info.timeout, TimeoutOp, Timeout)
and query_op((R#game_info.limit)#limit.min, MinOp, Min)
end,
{atomic, lists:filter(F1, L)}.

Expand All @@ -776,7 +768,8 @@ find_1(GameType, LimitType) ->
seat_count = R#tab_game_xref.seat_count,
required = R#tab_game_xref.required,
joined = Joined,
waiting = Waiting
waiting = Waiting,
timeout = R#tab_game_xref.timeout
}
end, L).

Expand Down

0 comments on commit b23fefa

Please sign in to comment.