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
118
119
120
121
122
123
|
-module(load_state).
-record(input, {session_token, player_id, battlemap_id, instance_id}).
-export([out/1]).
parse_input (Req) ->
JSONReqMap = jiffy:decode(Req, [return_maps]),
#input
{
session_token = maps:get(<<"session_token">>, JSONReqMap),
player_id = maps:get(<<"player_id">>, JSONReqMap),
battlemap_id = maps:get(<<"battlemap_id">>, JSONReqMap),
instance_id = maps:get(<<"instance_id">>, JSONReqMap)
}.
generate_set_map (Battlemap) ->
jiffy:encode
(
{
[
{<<"width">>, battlemap:get_width(Battlemap)},
{<<"height">>, battlemap:get_height(Battlemap)},
{<<"content">>, battlemap:list_tiles(Battlemap)}
]
}
).
generate_add_char (Char, CharInstance, BattlemapInstance, PlayerID) ->
{X, Y} = character_instance:get_location(CharInstance),
CharID = character:get_id(Char),
jiffy:encode
(
{
[
{<<"id">>, character:get_id(Char)},
{<<"name">>, character:get_name(Char)},
{<<"icon">>, character:get_icon(Char)},
{<<"portrait">>, character:get_portrait(Char)},
{<<"loc_x">>, X},
{<<"loc_y">>, Y},
{<<"team">>, character_instance:get_owner(CharInstance)},
{<<"mov_pts">>, character:get_movement_points(Char)},
{<<"atk_rg">>, character:get_attack_range(Char)},
{
<<"enabled">>,
battlemap_instance:can_play_char_instance
(
BattlemapInstance,
PlayerID,
CharID
)
}
]
}
).
generate_reply (Battlemap, BattlemapInstance, Characters, PlayerID) ->
jiffy:encode
(
[
[
<<"set_map">>,
generate_set_map(Battlemap)
]
|
lists:map
(
fun ({CharID, CharInstance}) ->
[
<<"add_char">>,
generate_add_char
(
CharID,
CharInstance,
BattlemapInstance,
PlayerID
)
]
end,
Characters
)
]
).
handle (Req) ->
%%%% Parse
Input = parse_input(Req),
%%%% Fetch
Battlemap = timed_cache:fetch(battlemap_db, Input#input.battlemap_id),
BattlemapInstance =
timed_cache:fetch
(
battlemap_instance_db,
<<"0">>
% {Input#input.battlemap_id, Input#input.battlemap_instance_id}
),
Characters =
lists:map
(
fun ({CharID, CharInst}) ->
{
timed_cache:fetch(character_db, CharID),
CharInst
}
end,
battlemap_instance:list_characters(BattlemapInstance)
),
%%%% Calc
%%%% Commit
%%%% Reply
generate_reply
(
Battlemap,
BattlemapInstance,
Characters,
Input#input.player_id
).
out(A) ->
{
content,
"application/json; charset=UTF-8",
handle(A#arg.clidata)
}.
|