| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'www/handler/battlemap/character_turn.yaws')
| -rw-r--r-- | www/handler/battlemap/character_turn.yaws | 150 | 
1 files changed, 122 insertions, 28 deletions
| diff --git a/www/handler/battlemap/character_turn.yaws b/www/handler/battlemap/character_turn.yaws index 83a3570..2b3f818 100644 --- a/www/handler/battlemap/character_turn.yaws +++ b/www/handler/battlemap/character_turn.yaws @@ -12,6 +12,21 @@        target_id     }  ). +-record +( +   query_state, +   { +      input, +      battlemap, +      battlemap_inst, +      main_char, +      main_char_inst, +      main_char_new_loc, +      target_char, +      target_char_inst +   } +). +  -include("/my/src/tacticians-server/src/timed_cache_data.hrl"). @@ -28,54 +43,133 @@ parse_input (Req) ->        target_id = maps:get(<<"target_id">>, JSONReqMap)     }. -handle (Req) -> -   %%%% Parse -   Input = parse_input(Req), -   %%%% Fetch +fetch_data (Input) ->     Battlemap = timed_cache:fetch(battlemap_db, Input#input.battlemap_id), -   BattlemapInstance = +   BattlemapInst =        timed_cache:fetch        (           battlemap_instance_db,           <<"0">>        ), -   Character = timed_cache:fetch(character_db, Input#input.char_id), -   CharInst = +   MainChar = timed_cache:fetch(character_db, Input#input.char_id), +   MainCharInst =        battlemap_instance:get_char_instance        ( -         BattlemapInstance, +         BattlemapInst,           Input#input.char_id        ), -   %%%% Calc +   case Input#input.target_id of +      <<"">> -> +         TargetChar = nothing, +         TargetCharInst = nothing; + +      TargetID -> +         TargetChar = timed_cache:fetch(character_db, TargetID), +         TargetCharInst = +            battlemap_instance:get_char_instance +            ( +               BattlemapInst, +               TargetID +            ) +   end, +   #query_state +   { +      input = Input, +      battlemap = Battlemap, +      battlemap_inst = BattlemapInst, +      main_char = MainChar, +      main_char_inst = MainCharInst, +      main_char_new_loc = nothing, +      target_char = TargetChar, +      target_char_inst = TargetCharInst +   }. + +assert_main_char_can_be_used (QueryState) -> +   false = character_instance:is_dead(QueryState#query_state.main_char_inst),     true =        battlemap_instance:can_play_char_instance        ( -         BattlemapInstance, -         Input#input.player_id, -         Input#input.char_id -      ), +         QueryState#query_state.battlemap_inst, +         QueryState#query_state.input#input.player_id, +         QueryState#query_state.input#input.char_id +      ). + +handle_main_char_movement (QueryState) ->     {X, Y} =        battlemap:cross        ( -         Battlemap, -         character_instance:get_location(CharInst), -         character:get_movement_points(Character), -         Input#input.path, -         battlemap_instance:get_char_instances(BattlemapInstance) +         QueryState#query_state.battlemap, +         character_instance:get_location(QueryState#query_state.main_char_inst), +         character:get_movement_points(QueryState#query_state.main_char), +         QueryState#query_state.input#input.path, +         battlemap_instance:get_char_instances +         ( +            QueryState#query_state.battlemap_inst +         )        ), -   NewBattlemapInstance = -      battlemap_instance:set_char_instance -      ( -         battlemap_instance:post_play_char_instance +   QueryState#query_state +   { +      battlemap_inst = +         battlemap_instance:set_char_instance           ( -            BattlemapInstance, -            Input#input.char_id +            battlemap_instance:post_play_char_instance +            ( +               QueryState#query_state.battlemap_inst, +               QueryState#query_state.input#input.char_id +            ), +            QueryState#query_state.input#input.char_id, +            character_instance:set_location +            ( +               QueryState#query_state.main_char_inst, +               X, +               Y +            )           ), -         Input#input.char_id, -         character_instance:set_location(CharInst, X, Y) -      ), +      main_char_new_loc = {X, Y} +   }. + +handle_target (QueryState) +   when (QueryState#query_state.target_char_inst == nothing) -> +   QueryState; +handle_target (QueryState) -> +   TargetLoc = +      character_instance:get_location(QueryState#query_state.main_char_inst), +   Dist = +      battlemap:dist(QueryState#query_state.main_char_new_loc, TargetLoc), +   true = +      (Dist =< character:get_attack_range(QueryState#query_state.main_char)), +   %% TODO: test for (and handle) riposte. +   QueryState#query_state +   { +      battlemap_inst = +         battlemap_instance:set_char_instance +         ( +            QueryState#query_state.battlemap_inst, +            QueryState#query_state.input#input.target_id, +            character_instance:mod_health +            ( +               QueryState#query_state.target_char_inst, +               -1, +               character:get_max_health(QueryState#query_state.main_char) +            ) +         ) +   }. + +handle (Req) -> +   %%%% Parse +   Input = parse_input(Req), +   %%%% Fetch +   QueryState = fetch_data(Input), +   %%%% Calc +   assert_main_char_can_be_used(QueryState), +   NQueryState = handle_target(handle_main_char_movement(QueryState)),     %%%% Commit -   database_shim:commit(battlemap_instance_db, <<"0">>, NewBattlemapInstance), +   database_shim:commit +   ( +      battlemap_instance_db, +      <<"0">>, +      NQueryState#query_state.battlemap_inst +   ),     %%%% Reply     jiffy:encode([[<<"okay">>]]). | 


