Merge branch 'master' into jonte_rewrite
Conflicts: src/ggs_coordinator.erl src/ggs_gamevm_e.erl src/ggs_table.erl
This commit is contained in:
commit
97c7e39b4a
23 changed files with 306 additions and 272 deletions
|
@ -91,7 +91,6 @@ handle_cast({stop, _Reason}, State) ->
|
|||
%% @TODO: Implement me
|
||||
%handle_cast({remove_player, Player}) ->
|
||||
% {noreply, State#co_state{
|
||||
|
||||
|
||||
handle_cast(_Message, State) ->
|
||||
{noreply, State}.
|
||||
|
|
91
src/ggs_db.erl
Normal file
91
src/ggs_db.erl
Normal file
|
@ -0,0 +1,91 @@
|
|||
%%%%----------------------------------------------------
|
||||
%%% @author Mattias Pettersson <mattiaspgames@gmail.com>
|
||||
%%% @copyright 2011 Mattias Pettersson
|
||||
%%% @doc Database for runtime game variable storage.
|
||||
%%% @end
|
||||
|
||||
-module(ggs_db).
|
||||
-export([init/0,stop/0,setItem/4,getItem/3,removeItem/3,key/3,clear/2,clear/1,length/2]).
|
||||
%-include("ggs_db.hrl").
|
||||
-record(data, {key, value}).
|
||||
|
||||
%%-----------------------------------------------------
|
||||
%% Creation
|
||||
%%-----------------------------------------------------
|
||||
init() ->
|
||||
% mnesia:create_schema([node()]),
|
||||
mnesia:start(),
|
||||
mnesia:create_table(data, [{attributes, record_info(fields, data)}]).
|
||||
|
||||
stop() ->
|
||||
mnesia:stop().
|
||||
|
||||
|
||||
%%-----------------------------------------------------
|
||||
%% Insertions
|
||||
%%-----------------------------------------------------
|
||||
setItem(GameToken,Ns,Key,Value) ->
|
||||
Fun = fun() ->
|
||||
Data = #data{key = {GameToken,Ns,Key}, value = Value},
|
||||
mnesia:write(Data)
|
||||
end,
|
||||
mnesia:transaction(Fun).
|
||||
|
||||
|
||||
%%-----------------------------------------------------
|
||||
%% Deletions
|
||||
%%-----------------------------------------------------
|
||||
removeItem(GameToken,Ns,Key) ->
|
||||
Fun = fun() ->
|
||||
mnesia:delete({data,{GameToken,Ns,Key}})
|
||||
end,
|
||||
mnesia:transaction(Fun).
|
||||
|
||||
clear(GameToken,Ns) ->
|
||||
Fun = fun() ->
|
||||
Keys = mnesia:all_keys(data),
|
||||
Rest = lists:filter(fun({A,B,_}) -> ((A==GameToken) and (B==Ns)) end, Keys),
|
||||
lists:map(fun({A,B,C}) -> removeItem(A,B,C) end, Rest)
|
||||
end,
|
||||
{atomic, Ret} = mnesia:transaction(Fun),
|
||||
Ret.
|
||||
|
||||
clear(GameToken) ->
|
||||
Fun = fun() ->
|
||||
Keys = mnesia:all_keys(data),
|
||||
Rest = lists:filter(fun({A,_,_}) -> (A==GameToken) end, Keys),
|
||||
lists:map(fun({A,B,C}) -> removeItem(A,B,C) end, Rest)
|
||||
end,
|
||||
{atomic, Ret} = mnesia:transaction(Fun),
|
||||
Ret.
|
||||
|
||||
%%-----------------------------------------------------
|
||||
%% Queries
|
||||
%%-----------------------------------------------------
|
||||
getItem(GameToken,Ns,Key) ->
|
||||
Fun = fun() ->
|
||||
mnesia:read(data, {GameToken,Ns,Key})
|
||||
end,
|
||||
case mnesia:transaction(Fun) of
|
||||
{atomic, []} ->
|
||||
{error};
|
||||
{atomic, [Ret]} ->
|
||||
Ret#data.value
|
||||
end.
|
||||
|
||||
length(GameToken,Ns) ->
|
||||
Fun = fun() ->
|
||||
Keys = mnesia:all_keys(data),
|
||||
length(lists:filter(fun({A,B,_}) -> ((A==GameToken) and (B==Ns)) end, Keys))
|
||||
end,
|
||||
{atomic, Ret} = mnesia:transaction(Fun),
|
||||
Ret.
|
||||
|
||||
key(GameToken,Ns,Position) ->
|
||||
Fun = fun() ->
|
||||
Keys = mnesia:all_keys(data),
|
||||
Rest = lists:filter(fun({A,B,_}) -> ((A==GameToken) and (B==Ns)) end, Keys),
|
||||
lists:nth(Position, Rest)
|
||||
end,
|
||||
{atomic, Ret} = mnesia:transaction(Fun),
|
||||
Ret.
|
5
src/ggs_db.hrl
Normal file
5
src/ggs_db.hrl
Normal file
|
@ -0,0 +1,5 @@
|
|||
%% gamedb.hrl
|
||||
|
||||
-record(data, {key, value}).
|
||||
|
||||
|
|
@ -97,34 +97,3 @@ code_change(_OldVsn, State, _Extra) ->
|
|||
js_escape(S) ->
|
||||
lists:flatmap(fun($\') -> [$\\, $\']; (X) -> [X] end, S).
|
||||
|
||||
%% ----------------------------------------------------------------------
|
||||
% Tests
|
||||
|
||||
start_link_test() ->
|
||||
erlang_js:start(), %% @TODO: should only be done once
|
||||
GameVM = start_link(test_table),
|
||||
?assertNot(GameVM =:= undefined).
|
||||
|
||||
define_test() ->
|
||||
GameVM = start_link(test_table),
|
||||
define(GameVM, "function hello(test) { return test; }"),
|
||||
?assertMatch(<<"jeena">>, gen_server:call(GameVM, {eval, "hello('jeena')"})).
|
||||
|
||||
stop_test() ->
|
||||
GameVM = start_link(test_table),
|
||||
ok = stop(GameVM).
|
||||
|
||||
user_command_test() ->
|
||||
GameVM = start_link(test_table),
|
||||
define(GameVM, "var t = '';\nfunction userCommand(user, command, args) { t = user + command + args; }\n"),
|
||||
user_command(GameVM, "'jeena", "thecommand", "theargs'"),
|
||||
?assertMatch(<<"'jeenathecommandtheargs'">>, gen_server:call(GameVM, {eval, "t;"})).
|
||||
|
||||
js_erlang_test() ->
|
||||
GameVM = start_link(test_table),
|
||||
define(GameVM, "var t = '';\nfunction userCommand(user, command, args) { t = callErlang('erlang time') + ''; }\n"),
|
||||
user_command(GameVM, "", "", ""),
|
||||
{A, B, C} = erlang:time(),
|
||||
T = "{" ++ integer_to_list(A) ++ ", " ++ integer_to_list(B) ++ ", " ++ integer_to_list(C) ++ "}",
|
||||
?assertMatch(T, binary_to_list(gen_server:call(GameVM, {eval, "t;"}))).
|
||||
|
||||
|
|
|
@ -12,12 +12,13 @@
|
|||
|
||||
%% API
|
||||
-export([start_link/0,
|
||||
add_player/2,
|
||||
remove_player/2,
|
||||
stop/1,
|
||||
notify/3]).
|
||||
add_player/2,
|
||||
remove_player/2,
|
||||
stop/1,
|
||||
notify/3,
|
||||
notify_all_players/2,
|
||||
notify_game/3]).
|
||||
|
||||
-include_lib("eunit/include/eunit.hrl").
|
||||
|
||||
%% ----------------------------------------------------------------------
|
||||
% API implementation
|
||||
|
@ -25,6 +26,7 @@
|
|||
% @doc returns a new table
|
||||
start_link() ->
|
||||
{ok, Pid} = gen_server:start_link(?MODULE, [], []),
|
||||
Pid.
|
||||
|
||||
%% @private
|
||||
call(Pid, Msg) ->
|
||||
|
@ -96,9 +98,10 @@ handle_cast({notify_game, Message, From}, #state { game_vm = GameVM } = State) -
|
|||
{noreply, State};
|
||||
|
||||
handle_cast({notify_all_players, Message}, #state{players = Players} = State) ->
|
||||
lists:foreach(fun(P) ->
|
||||
ggs_player:notify(P, "Server", Message)
|
||||
end, Players),
|
||||
lists:foreach(
|
||||
fun(P) -> ggs_player:notify(P, "Server", Message) end,
|
||||
Players
|
||||
),
|
||||
{noreply, State};
|
||||
|
||||
handle_cast(stop, State) ->
|
||||
|
@ -120,80 +123,3 @@ terminate(_Reason, _State) ->
|
|||
code_change(_OldVsn, State, _Extra) ->
|
||||
{ok, State}.
|
||||
|
||||
%% @TODO: Please put these tests in a separate file. We can't compile this file if
|
||||
%% they contain errors from switching vms
|
||||
%% ----------------------------------------------------------------------
|
||||
% Tests
|
||||
|
||||
%<<<<<<< HEAD
|
||||
%start_link_test() ->
|
||||
% Table = start_link(),
|
||||
% ?assertNot(Table =:= undefined).
|
||||
|
||||
%add_player_test() ->
|
||||
% Table = start_link(),
|
||||
% Player = test_player,
|
||||
% add_player(Table, Player),
|
||||
% {ok, [Player]} = gen_server:call(Table, get_player_list).
|
||||
|
||||
%remove_player_test() ->
|
||||
% Table = start_link(),
|
||||
% Player = test_player,
|
||||
% Player2 = test_player2,
|
||||
% add_player(Table, Player),
|
||||
% {ok, [Player]} = gen_server:call(Table, get_player_list),
|
||||
% add_player(Table, Player2),
|
||||
% {ok, [Player2, Player]} = gen_server:call(Table, get_player_list),
|
||||
% remove_player(Table, Player),
|
||||
% {ok, [Player2]} = gen_server:call(Table, get_player_list),
|
||||
% remove_player(Table, Player2),
|
||||
% {ok, []} = gen_server:call(Table, get_player_list).
|
||||
%
|
||||
%stop_test() ->
|
||||
% Table = start_link(),
|
||||
% ok = stop(Table).
|
||||
|
||||
% @private
|
||||
%notify_test() ->
|
||||
% Table = start_link(),
|
||||
% Player = test_player,
|
||||
% Message = {server, define, "function helloWorld(x) { }"},
|
||||
% ok = notify(Table, Player, Message).
|
||||
%=======
|
||||
%%start_link_test() ->
|
||||
% Table = start_link("123", none),
|
||||
% ?assertNot(Table =:= undefined).
|
||||
%
|
||||
%add_player_test() ->
|
||||
% Table = start_link("123", none),
|
||||
% Player = test_player,
|
||||
% add_player(Table, Player),
|
||||
% {ok, [Player]} = gen_server:call(Table, get_player_list).
|
||||
|
||||
%remove_player_test() ->
|
||||
% Table = start_link("123", none),
|
||||
% Player = test_player,
|
||||
% Player2 = test_player2,
|
||||
% add_player(Table, Player),
|
||||
% {ok, [Player]} = gen_server:call(Table, get_player_list),
|
||||
% add_player(Table, Player2),
|
||||
% {ok, [Player2, Player]} = gen_server:call(Table, get_player_list),
|
||||
% remove_player(Table, Player),
|
||||
% {ok, [Player2]} = gen_server:call(Table, get_player_list),
|
||||
% remove_player(Table, Player2),
|
||||
% {ok, []} = gen_server:call(Table, get_player_list).
|
||||
%
|
||||
%stop_test() ->
|
||||
% Table = start_link("123", none),
|
||||
% ok = stop(Table).
|
||||
%
|
||||
%% @private
|
||||
%notify_test() ->
|
||||
% Table = start_link("123", none),
|
||||
% Player = test_player,
|
||||
% Message = {server, define, "function helloWorld(x) { }"},
|
||||
% ok = notify(Table, Player, Message).
|
||||
%>>>>>>> jonte_rewrite
|
||||
%Message2 = {game, "helloWorld", "test"},
|
||||
%ok = notify(Table, Player, Message2).
|
||||
|
||||
|
|
Reference in a new issue