summaryrefslogtreecommitdiff |
diff options
author | nsensfel <SpamShield0@noot-noot.org> | 2017-11-28 13:38:04 +0100 |
---|---|---|
committer | nsensfel <SpamShield0@noot-noot.org> | 2017-11-28 13:38:04 +0100 |
commit | 80358376b9300a0d73cb8b62dfa9fdd65240ca66 (patch) | |
tree | 6eb82383ba1fdfb33c68dbe699bc2a4b68763d24 /www/handler/battlemap | |
parent | 299a37b6d245dbb9806f4922cf492009775a8bf0 (diff) |
Starting to work on attacks.
I find it difficult to keep the code tidy in Erlang...
Diffstat (limited to 'www/handler/battlemap')
-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">>]]). |