From efaf3ee3f4b2478079c7b9dde8f9e879956a460f Mon Sep 17 00:00:00 2001 From: nsensfel Date: Thu, 16 Nov 2017 17:06:17 +0100 Subject: Starting changes in the structure. --- src/battlemap.erl | 22 +++++++++ src/battlemap_battlemap.erl | 22 --------- src/battlemap_character.erl | 30 ----------- src/battlemap_character_turn.erl | 37 -------------- src/battlemap_load_state.erl | 36 -------------- src/battlemap_node.erl | 11 ----- src/battlemap_shim.erl | 37 ++++++++++++++ src/character.erl | 30 +++++++++++ src/character_shim.erl | 43 ++++++++++++++++ src/database_shim.erl | 26 ++++++++++ src/handler.erl | 12 +++++ src/shim_battlemap_battlemap.erl | 37 -------------- src/shim_battlemap_character.erl | 43 ---------------- src/shim_database.erl | 17 ------- src/timed_cache.erl | 82 +++++++++++++++++++++++++++++++ src/timed_cache_data.hrl | 6 +++ src/timed_cache_object.erl | 82 ------------------------------- src/timed_caches_manager.erl | 4 +- www/handler/battlemap/character_turn.yaws | 32 +++++++++++- www/handler/battlemap/load_state.yaws | 40 ++++++++++++++- 20 files changed, 330 insertions(+), 319 deletions(-) create mode 100644 src/battlemap.erl delete mode 100644 src/battlemap_battlemap.erl delete mode 100644 src/battlemap_character.erl delete mode 100644 src/battlemap_character_turn.erl delete mode 100644 src/battlemap_load_state.erl delete mode 100644 src/battlemap_node.erl create mode 100644 src/battlemap_shim.erl create mode 100644 src/character.erl create mode 100644 src/character_shim.erl create mode 100644 src/database_shim.erl create mode 100644 src/handler.erl delete mode 100644 src/shim_battlemap_battlemap.erl delete mode 100644 src/shim_battlemap_character.erl delete mode 100644 src/shim_database.erl create mode 100644 src/timed_cache.erl create mode 100644 src/timed_cache_data.hrl delete mode 100644 src/timed_cache_object.erl diff --git a/src/battlemap.erl b/src/battlemap.erl new file mode 100644 index 0000000..4366852 --- /dev/null +++ b/src/battlemap.erl @@ -0,0 +1,22 @@ +-module(battlemap). +-export([encode_in_json/1]). + +encode_in_json ( + { + Width, + Height, + Tiles + } +) -> + jiffy:encode( + { + [ + {<<"width">>, Width}, + {<<"height">>, Height}, + { + <<"content">>, + lists:map((fun ({ID, Cost}) -> [ID, Cost] end), Tiles) + } + ] + } + ). diff --git a/src/battlemap_battlemap.erl b/src/battlemap_battlemap.erl deleted file mode 100644 index 64cf10d..0000000 --- a/src/battlemap_battlemap.erl +++ /dev/null @@ -1,22 +0,0 @@ --module(battlemap_battlemap). --export([encode_in_json/1]). - -encode_in_json ( - { - Width, - Height, - Tiles - } -) -> - jiffy:encode( - { - [ - {<<"width">>, Width}, - {<<"height">>, Height}, - { - <<"content">>, - lists:map((fun ({ID, Cost}) -> [ID, Cost] end), Tiles) - } - ] - } - ). diff --git a/src/battlemap_character.erl b/src/battlemap_character.erl deleted file mode 100644 index 0e9d0af..0000000 --- a/src/battlemap_character.erl +++ /dev/null @@ -1,30 +0,0 @@ --module(battlemap_character). --export([encode_in_json/1]). - -encode_in_json ( - { - ID, - Name, - Icon, - Portrait, - {X, Y}, - Team, - MovementPoints, - AttackRange - } -) -> - jiffy:encode( - { - [ - {<<"id">>, ID}, - {<<"name">>, Name}, - {<<"icon">>, Icon}, - {<<"portrait">>, Portrait}, - {<<"loc_x">>, X}, - {<<"loc_y">>, Y}, - {<<"team">>, Team}, - {<<"mov_pts">>, MovementPoints}, - {<<"atk_rg">>, AttackRange} - ] - } - ). diff --git a/src/battlemap_character_turn.erl b/src/battlemap_character_turn.erl deleted file mode 100644 index bf70823..0000000 --- a/src/battlemap_character_turn.erl +++ /dev/null @@ -1,37 +0,0 @@ --module(battlemap_character_turn). - --export( - [ - handle/1 - ] -). - -handle (Req) -> - io:format("~nReceived~p...", [Req]), - JSON_Req_Map = jiffy:decode(Req, [return_maps]), - UserToken = maps:get(<<"user_token">>, JSON_Req_Map), - io:format("~nCharacter Turn for ~p...", [UserToken]), -%% ok = users_manager:ping(UserToken), - jiffy:encode( - { - [ - {<<"types">>, [<<"STATUS">>]}, - { - <<"data">>, - [ - jiffy:encode - ( - { - [ - { - <<"status">>, - <<"OK">> - } - ] - } - ) - ] - } - ] - } - ). diff --git a/src/battlemap_load_state.erl b/src/battlemap_load_state.erl deleted file mode 100644 index f311946..0000000 --- a/src/battlemap_load_state.erl +++ /dev/null @@ -1,36 +0,0 @@ --module(battlemap_load_state). - --export( - [ - handle/1 - ] -). - -handle (Req) -> - JSONReqMap = jiffy:decode(Req, [return_maps]), - BattlemapID = maps:get(<<"battlemap_id">>, JSONReqMap), - io:format("~nLoading Battlemap ~p...~n", [BattlemapID]), - {Battlemap, CharList} = - timed_cache_object:fetch( - battlemaps_db, - BattlemapID - ), -%% ok = users_manager:ping(UserToken), - jiffy:encode( - [ - [ - <<"set_map">>, - battlemap_battlemap:encode_in_json(Battlemap) - ] - | - lists:map( - fun (Char) -> - [ - <<"add_char">>, - battlemap_character:encode_in_json(Char) - ] - end, - CharList - ) - ] - ). diff --git a/src/battlemap_node.erl b/src/battlemap_node.erl deleted file mode 100644 index cf6b65b..0000000 --- a/src/battlemap_node.erl +++ /dev/null @@ -1,11 +0,0 @@ --module(battlemap_node). --export([start/1]). - -start(_YawsParams) -> - {ok, Pid} = gen_server:start(timed_caches_manager, [], []), - gen_server:cast(Pid, {add, battlemaps_db, none}), -%% timed_caches_manager:add_cache([], battlemaps_db, none), - receive - after 5000 -> - [] = ets:lookup(battlemaps_db, <<"00">>) - end. diff --git a/src/battlemap_shim.erl b/src/battlemap_shim.erl new file mode 100644 index 0000000..37a953b --- /dev/null +++ b/src/battlemap_shim.erl @@ -0,0 +1,37 @@ +-module(battlemap_shim). + +-export( + [ + generate/2 + ] +). + +generate_tile (0) -> + {0, 1}; +generate_tile (1) -> + {1, 2}; +generate_tile (2) -> + {2, 99}. + +generate(_Prev, Result, _X, 0, _BaseWidth) -> + Result; +generate(Prev, Result, 0, Y, BaseWidth) -> + generate(Prev, Result, BaseWidth, (Y - 1), BaseWidth); +generate(Prev, Result, X, Y, BaseWidth) -> + case rand:uniform(6) of + N when (N > 3) -> + generate(Prev, [generate_tile(Prev)|Result], (X - 1), Y, BaseWidth); + + N -> + NewTileType = (N - 1), + generate( + NewTileType, + [generate_tile(NewTileType)|Result], + (X - 1), + Y, + BaseWidth + ) + end. + +generate (Width, Height) -> + {Width, Height, generate(0, [], Width, Height, Width)}. diff --git a/src/character.erl b/src/character.erl new file mode 100644 index 0000000..aa0d5f0 --- /dev/null +++ b/src/character.erl @@ -0,0 +1,30 @@ +-module(character). +-export([encode_in_json/1]). + +encode_in_json ( + { + ID, + Name, + Icon, + Portrait, + {X, Y}, + Team, + MovementPoints, + AttackRange + } +) -> + jiffy:encode( + { + [ + {<<"id">>, ID}, + {<<"name">>, Name}, + {<<"icon">>, Icon}, + {<<"portrait">>, Portrait}, + {<<"loc_x">>, X}, + {<<"loc_y">>, Y}, + {<<"team">>, Team}, + {<<"mov_pts">>, MovementPoints}, + {<<"atk_rg">>, AttackRange} + ] + } + ). diff --git a/src/character_shim.erl b/src/character_shim.erl new file mode 100644 index 0000000..7390cc4 --- /dev/null +++ b/src/character_shim.erl @@ -0,0 +1,43 @@ +-module(character_shim). + +-export( + [ + generate/2 + ] +). + +generate_char (N, X, Y, Team) -> + IDAsString = list_to_binary(integer_to_list(N)), + { + IDAsString, % ID + IDAsString, % Name + IDAsString, % Icon + IDAsString, % Portrait + {X, Y}, + Team, + rand:uniform(10), % Movement Points + (rand:uniform(5) - 1) % Attack Range + }. + +generate (0, Result, _MaxX, _MaxY) -> + Result; +generate (N, Prev, MaxX, MaxY) -> + generate + ( + (N - 1), + [ + generate_char + ( + N, + (rand:uniform(MaxX) - 1), + (rand:uniform(MaxY) - 1), + (N rem 2) + ) + | Prev + ], + MaxX, + MaxY + ). + +generate (MaxX, MaxY) -> + generate(rand:uniform(14) + 2, [], MaxX, MaxY). diff --git a/src/database_shim.erl b/src/database_shim.erl new file mode 100644 index 0000000..3e88c34 --- /dev/null +++ b/src/database_shim.erl @@ -0,0 +1,26 @@ +-module(database_shim). +-export([fetch/2]). + +-include("timed_cache_data.hrl"). + +fetch(battlemap_db, Object_ID) -> + Width = (rand:uniform(54) + 10), + Height = (rand:uniform(54) + 10), + io:format + ( + "~nGenerating new Battlemap ~p of size (~p, ~p)...~n", + [Object_ID, Width, Height] + ), + Result = + #battlemap { + id = Object_ID, + width = Width, + height = Height, + content = battlemap_shim:generate(Width, Height) + }, + {ok, + { + character_shim:generate(Width, Height) + } + }; +fetch(battlemap_db, Object_ID) -> diff --git a/src/handler.erl b/src/handler.erl new file mode 100644 index 0000000..9270aa4 --- /dev/null +++ b/src/handler.erl @@ -0,0 +1,12 @@ +-module(handler). +-export([start/1]). + +start(_YawsParams) -> + {ok, Pid} = gen_server:start(timed_caches_manager, [], []), + gen_server:cast(Pid, {add, battlemap_db, none}), + gen_server:cast(Pid, {add, battlemap_instance_db, none}), + gen_server:cast(Pid, {add, character_db, none}), + gen_server:cast(Pid, {add, character_instance_db, none}), + gen_server:cast(Pid, {add, character_turn_db, none}), + gen_server:cast(Pid, {add, player_data_db, none}), + ok. diff --git a/src/shim_battlemap_battlemap.erl b/src/shim_battlemap_battlemap.erl deleted file mode 100644 index a6adc83..0000000 --- a/src/shim_battlemap_battlemap.erl +++ /dev/null @@ -1,37 +0,0 @@ --module(shim_battlemap_battlemap). - --export( - [ - generate/2 - ] -). - -generate_tile (0) -> - {0, 1}; -generate_tile (1) -> - {1, 2}; -generate_tile (2) -> - {2, 99}. - -generate(_Prev, Result, _X, 0, _BaseWidth) -> - Result; -generate(Prev, Result, 0, Y, BaseWidth) -> - generate(Prev, Result, BaseWidth, (Y - 1), BaseWidth); -generate(Prev, Result, X, Y, BaseWidth) -> - case rand:uniform(6) of - N when (N > 3) -> - generate(Prev, [generate_tile(Prev)|Result], (X - 1), Y, BaseWidth); - - N -> - NewTileType = (N - 1), - generate( - NewTileType, - [generate_tile(NewTileType)|Result], - (X - 1), - Y, - BaseWidth - ) - end. - -generate (Width, Height) -> - {Width, Height, generate(0, [], Width, Height, Width)}. diff --git a/src/shim_battlemap_character.erl b/src/shim_battlemap_character.erl deleted file mode 100644 index adea111..0000000 --- a/src/shim_battlemap_character.erl +++ /dev/null @@ -1,43 +0,0 @@ --module(shim_battlemap_character). - --export( - [ - generate/2 - ] -). - -generate_char (N, X, Y, Team) -> - IDAsString = list_to_binary(integer_to_list(N)), - { - IDAsString, % ID - IDAsString, % Name - IDAsString, % Icon - IDAsString, % Portrait - {X, Y}, - Team, - rand:uniform(10), % Movement Points - (rand:uniform(5) - 1) % Attack Range - }. - -generate (0, Result, _MaxX, _MaxY) -> - Result; -generate (N, Prev, MaxX, MaxY) -> - generate - ( - (N - 1), - [ - generate_char - ( - N, - (rand:uniform(MaxX) - 1), - (rand:uniform(MaxY) - 1), - (N rem 2) - ) - | Prev - ], - MaxX, - MaxY - ). - -generate (MaxX, MaxY) -> - generate(rand:uniform(14) + 2, [], MaxX, MaxY). diff --git a/src/shim_database.erl b/src/shim_database.erl deleted file mode 100644 index f1abd8b..0000000 --- a/src/shim_database.erl +++ /dev/null @@ -1,17 +0,0 @@ --module(shim_database). --export([fetch/2]). - -fetch(battlemaps_db, Object_ID) -> - Width = (rand:uniform(54) + 10), - Height = (rand:uniform(54) + 10), - io:format - ( - "~nGenerating new Battlemap ~p of size (~p, ~p)...~n", - [Object_ID, Width, Height] - ), - {ok, - { - shim_battlemap_battlemap:generate(Width, Height), - shim_battlemap_character:generate(Width, Height) - } - }. diff --git a/src/timed_cache.erl b/src/timed_cache.erl new file mode 100644 index 0000000..70f9896 --- /dev/null +++ b/src/timed_cache.erl @@ -0,0 +1,82 @@ +-module(timed_cache). +-behavior(gen_server). + +%%%% gen_server exports +-export( + [ + init/1, + handle_cast/2, + handle_call/3, %% No reply will ever be given. + terminate/2, + code_change/3, + format_status/2, + handle_info/2 + ] +). + +%%%% actual interface +-export( + [ + fetch/2, + invalidate/2 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +add_to_cache (DB, ObjectID) -> + {ok, TimerPID} = gen_server:start(?MODULE, {DB, ObjectID}, []), + {ok, Data} = database_shim:fetch(DB, ObjectID), + ets:insert(DB, {ObjectID, TimerPID, Data}), + Data. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% gen_server + +init ({DB, ObjectID}) -> + {ok, {DB, ObjectID}}. + +handle_call (invalidate, _, State) -> + {stop, normal, State}; +handle_call (ping, _, {DB, ObjectID}) -> + {noreply, {DB, ObjectID}, timed_caches_manager:get_timeout(DB)}. + +handle_cast (invalidate, State) -> + {stop, normal, State}; +handle_cast (ping, {DB, ObjectID}) -> + {noreply, {DB, ObjectID}, timed_caches_manager:get_timeout(DB)}. + +terminate (_, {DB, ObjectID}) -> + ets:delete(DB, ObjectID). + +code_change (_, State, _) -> + {ok, State}. + +format_status (_, [_, State]) -> + [{data, [{"State", State}]}]. + +handle_info(timeout, State) -> + {stop, normal, State}; +handle_info(_, {DB, ObjectID}) -> + {noreply, {DB, ObjectID}, timed_caches_manager:get_timeout(DB)}. + +%%%% interface +fetch (DB, ObjectID) -> + case ets:lookup(DB, ObjectID) of + [] -> add_to_cache(DB, ObjectID); + + [{_, TimerPID, Data}] -> + gen_server:cast(TimerPID, ping), + Data + end. + +invalidate (DB, ObjectID) -> + case ets:lookup(DB, ObjectID) of + [] -> ok; + + [{_, TimerPID, _}] -> + gen_server:stop(TimerPID) + end. diff --git a/src/timed_cache_data.hrl b/src/timed_cache_data.hrl new file mode 100644 index 0000000..b0d7ba6 --- /dev/null +++ b/src/timed_cache_data.hrl @@ -0,0 +1,6 @@ +-record(battlemap, {id, width, height, content, instances}). +-record(battlemap_instance, {id, chars, curr_player, rem_chars, last_turn}). +-record(character, {id, name, icon, portrait, mov_pts, atk_rg}). +-record(character_instance, {id, x, y, team}). +-record(character_turn, {id, path, target}). +-record(player, {id, battlemaps, characters}). diff --git a/src/timed_cache_object.erl b/src/timed_cache_object.erl deleted file mode 100644 index 341d128..0000000 --- a/src/timed_cache_object.erl +++ /dev/null @@ -1,82 +0,0 @@ --module(timed_cache_object). --behavior(gen_server). - -%%%% gen_server exports --export( - [ - init/1, - handle_cast/2, - handle_call/3, %% No reply will ever be given. - terminate/2, - code_change/3, - format_status/2, - handle_info/2 - ] -). - -%%%% actual interface --export( - [ - fetch/2, - invalidate/2 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -add_to_cache (DB, ObjectID) -> - {ok, TimerPID} = gen_server:start(?MODULE, {DB, ObjectID}, []), - {ok, Data} = shim_database:fetch(DB, ObjectID), - ets:insert(DB, {ObjectID, TimerPID, Data}), - Data. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% gen_server - -init ({DB, ObjectID}) -> - {ok, {DB, ObjectID}}. - -handle_call (invalidate, _, State) -> - {stop, normal, State}; -handle_call (ping, _, {DB, ObjectID}) -> - {noreply, {DB, ObjectID}, timed_caches_manager:get_timeout(DB)}. - -handle_cast (invalidate, State) -> - {stop, normal, State}; -handle_cast (ping, {DB, ObjectID}) -> - {noreply, {DB, ObjectID}, timed_caches_manager:get_timeout(DB)}. - -terminate (_, {DB, ObjectID}) -> - ets:delete(DB, ObjectID). - -code_change (_, State, _) -> - {ok, State}. - -format_status (_, [_, State]) -> - [{data, [{"State", State}]}]. - -handle_info(timeout, State) -> - {stop, normal, State}; -handle_info(_, {DB, ObjectID}) -> - {noreply, {DB, ObjectID}, timed_caches_manager:get_timeout(DB)}. - -%%%% interface -fetch (DB, ObjectID) -> - case ets:lookup(DB, ObjectID) of - [] -> add_to_cache(DB, ObjectID); - - [{_, TimerPID, Data}] -> - gen_server:cast(TimerPID, ping), - Data - end. - -invalidate (DB, ObjectID) -> - case ets:lookup(DB, ObjectID) of - [] -> ok; - - [{_, TimerPID, _}] -> - gen_server:stop(TimerPID) - end. diff --git a/src/timed_caches_manager.erl b/src/timed_caches_manager.erl index 4c3c267..019aed9 100644 --- a/src/timed_caches_manager.erl +++ b/src/timed_caches_manager.erl @@ -76,7 +76,7 @@ inherit_cache (CacheList, DB, Heir) -> %%%% gen_server init (CacheList) -> io:format("~nStarting Timed Caches Manager..."), - {ok,CacheList}. + {ok, CacheList}. handle_call ({delete, CacheName}, _Caller, State) -> {noreply, delete_cache(State, CacheName)}; @@ -135,7 +135,7 @@ add_cache (CacheList, DB, Heir) -> [DB|CacheList] end. -get_timeout(battlemaps_db) -> +get_timeout(battlemap_db) -> 60000; get_timeout(_) -> 60000. diff --git a/www/handler/battlemap/character_turn.yaws b/www/handler/battlemap/character_turn.yaws index 8b0a229..c42e26b 100644 --- a/www/handler/battlemap/character_turn.yaws +++ b/www/handler/battlemap/character_turn.yaws @@ -1,8 +1,38 @@ +handle (Req) -> + io:format("~nReceived~p...", [Req]), + JSON_Req_Map = jiffy:decode(Req, [return_maps]), + UserToken = maps:get(<<"user_token">>, JSON_Req_Map), + io:format("~nCharacter Turn for ~p...", [UserToken]), +%% ok = users_manager:ping(UserToken), + jiffy:encode( + { + [ + {<<"types">>, [<<"STATUS">>]}, + { + <<"data">>, + [ + jiffy:encode + ( + { + [ + { + <<"status">>, + <<"OK">> + } + ] + } + ) + ] + } + ] + } + ). + out(A) -> { content, "application/json; charset=UTF-8", - battlemap_character_turn:handle(A#arg.clidata) + handle(A#arg.clidata) }. diff --git a/www/handler/battlemap/load_state.yaws b/www/handler/battlemap/load_state.yaws index c778b66..fb7cda6 100644 --- a/www/handler/battlemap/load_state.yaws +++ b/www/handler/battlemap/load_state.yaws @@ -1,8 +1,46 @@ +-record(input, {battlemap_id}). + +parse_input (Req) -> + JSONReqMap = jiffy:decode(Req, [return_maps]), + #input { + battlemap_id = maps:get(<<"battlemap_id">>, JSONReqMap) + }. + +fetch_battlemap (Input) -> + {Battlemap, CharList} = + timed_cache:fetch( + battlemap_db, + Input#input.battlemap_id + ), + +handle (Req) -> + Input = parse_input(Req), + io:format("~nLoading Battlemap ~p...~n", [Input#input.battlemap_id]), +%% ok = users_manager:ping(UserToken), + jiffy:encode( + [ + [ + <<"set_map">>, + battlemap:encode_in_json(Battlemap) + ] + | + lists:map( + fun (Char) -> + [ + <<"add_char">>, + character:encode_in_json(Char) + ] + end, + CharList + ) + ] + ). + out(A) -> { content, "application/json; charset=UTF-8", - battlemap_load_state:handle(A#arg.clidata) + handle(A#arg.clidata) }. -- cgit v1.2.3-70-g09d2