1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
-module(load_state).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-include("../../include/yaws_api.hrl").
-record
(
input,
{
session_token,
player_id,
battlemap_id,
instance_id
}
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-export([out/1]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
parse_input (Req) ->
JSONReqMap = jiffy:decode(Req, [return_maps]),
PlayerID = maps:get(<<"player_id">>, JSONReqMap),
SessionToken = maps:get(<<"session_token">>, JSONReqMap),
database_shim:assert_session_is_valid(PlayerID, SessionToken),
#input
{
player_id = PlayerID,
battlemap_id = maps:get(<<"battlemap_id">>, JSONReqMap),
instance_id = maps:get(<<"instance_id">>, JSONReqMap)
}.
generate_reply (Battlemap, BattlemapInstance, Characters, PlayerID) ->
jiffy:encode
(
[
set_map:generate(Battlemap)
|
lists:map
(
fun ({Char, CharInstance}) ->
add_char:generate
(
Char,
CharInstance,
(
battlemap_instance:can_play_char_instance
(
BattlemapInstance,
PlayerID,
character:get_id(Char)
)
and
(not character_instance:is_dead(CharInstance))
)
)
end,
Characters
)
]
).
handle (Req) ->
%%%% Parse
Input = parse_input(Req),
%%%% Fetch
Battlemap =
timed_cache:fetch
(
battlemap_db,
Input#input.player_id,
Input#input.battlemap_id
),
BattlemapInstance =
timed_cache:fetch
(
battlemap_instance_db,
Input#input.player_id,
<<"0">>
),
Characters =
lists:map
(
fun ({CharID, CharInst}) ->
{
timed_cache:fetch(character_db, Input#input.player_id, CharID),
CharInst
}
end,
battlemap_instance:list_characters(BattlemapInstance)
),
%%%% Calc
%%%% Commit
%%%% Reply
generate_reply
(
Battlemap,
BattlemapInstance,
Characters,
Input#input.player_id
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
out(A) ->
{
content,
"application/json; charset=UTF-8",
handle(A#arg.clidata)
}.
|