From 82081d45fd64294f4bc417085e06284f3487b32f Mon Sep 17 00:00:00 2001 From: nsensfel Date: Wed, 6 Jun 2018 16:42:42 +0200 Subject: ... --- Makefile | 32 +- src/battlemap/game-logic/bm_next_turn.erl | 2 +- src/battlemap/game-logic/bm_turn_actions.erl | 12 +- src/battlemap/query/bm_load_state.erl | 2 +- src/battlemap/reply/add_char.erl | 78 ----- src/battlemap/reply/bm_add_char.erl | 78 +++++ src/battlemap/reply/bm_set_map.erl | 28 ++ src/battlemap/reply/bm_set_timeline.erl | 27 ++ src/battlemap/reply/bm_turn_results.erl | 27 ++ src/battlemap/reply/set_map.erl | 28 -- src/battlemap/reply/set_timeline.erl | 27 -- src/battlemap/reply/turn_results.erl | 27 -- src/battlemap/struct/bm_attack.erl | 42 +-- src/battlemap/struct/bm_battle_action.erl | 2 +- src/battlemap/struct/bm_character.erl | 22 +- src/battlemap/struct/bm_character_turn_request.erl | 2 +- src/battlemap/struct/bm_weapon.erl | 360 --------------------- src/db/logic/db_access.erl | 54 ++++ src/db/logic/storage_access.erl | 54 ---- src/db/struct/db_query.erl | 114 ------- src/shared/include/db_item.hrl | 15 - src/shared/include/db_query.hrl | 63 ---- src/shared/include/db_user.hrl | 7 - src/shared/io/sh_timed_cache.erl | 2 +- src/shared/struct/sh_db_item.erl | 12 +- src/shared/struct/sh_db_query.erl | 157 ++++++++- src/shared/struct/sh_db_user.erl | 5 +- src/shared/struct/sh_statistics.erl | 29 +- src/shared/struct/sh_weapon.erl | 360 +++++++++++++++++++++ 29 files changed, 830 insertions(+), 838 deletions(-) delete mode 100644 src/battlemap/reply/add_char.erl create mode 100644 src/battlemap/reply/bm_add_char.erl create mode 100644 src/battlemap/reply/bm_set_map.erl create mode 100644 src/battlemap/reply/bm_set_timeline.erl create mode 100644 src/battlemap/reply/bm_turn_results.erl delete mode 100644 src/battlemap/reply/set_map.erl delete mode 100644 src/battlemap/reply/set_timeline.erl delete mode 100644 src/battlemap/reply/turn_results.erl delete mode 100644 src/battlemap/struct/bm_weapon.erl create mode 100644 src/db/logic/db_access.erl delete mode 100644 src/db/logic/storage_access.erl delete mode 100644 src/db/struct/db_query.erl delete mode 100644 src/shared/include/db_item.hrl delete mode 100644 src/shared/include/db_query.hrl delete mode 100644 src/shared/include/db_user.hrl create mode 100644 src/shared/struct/sh_weapon.erl diff --git a/Makefile b/Makefile index abe6817..1c121cc 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,13 @@ ERL_BIN_FILES = $(patsubst %.erl,$(BIN_DIR)/%.beam,$(notdir $(ERL_SRC_FILES))) ## Yaws REQUIRED_HEADERS = $(INCLUDE_DIR)/yaws_api.hrl +## Binaries +YAWS_EXEC = $(YAWS) $(YAWS_OPTS) +ERLC_EXEC = $(ERLC) $(ERLC_OPTS) +ERL_EXEC = $(ERL) $(ERL_OPTS) +DIALYZER_EXEC = $(DIALYZER) $(DIALYZER_OPTS) +M4_EXEC = $(M4) $(M4_OPTS) + ################################################################################ ## SANITY CHECKS ############################################################### ################################################################################ @@ -59,7 +66,8 @@ all: build debug: debug_run -build: $(OPTIONAL_DIRS) $(REQUIRED_HEADERS) $(PREPROCESSED_FILES) $(ERL_BIN_FILES) +build: $(OPTIONAL_DIRS) $(REQUIRED_HEADERS) \ + $(PREPROCESSED_FILES) $(ERL_BIN_FILES) run: yaws_run @@ -77,12 +85,30 @@ reset: ################################################################################ ## INTERNAL RULES ############################################################## ################################################################################ +debug_rebuild: + $(MAKE) clean + $(MAKE) ERLC_OPTS="$(ERLC_OPTS) +debug_info" + +ifeq ($(wildcard $(DIALYZER_PLT_FILE)),) +debug_run: + $(DIALYZER_EXEC) --build_plt --apps erts kernel stdlib jiffy mnesia \ + --output_plt $(DIALYZER_PLT_FILE) + $(MAKE) debug_rebuild + $(DIALYZER_EXEC) --add_to_plt --plt $(DIALYZER_PLT_FILE) -r $(BIN_DIR) +else +debug_run: + $(MAKE) debug_rebuild + $(DIALYZER_EXEC) --check_plt --plt $(DIALYZER_PLT_FILE) + $(DIALYZER_EXEC) --get_warnings $(ERL_SRC_FILES) \\ + --src --plt $(DIALYZER_PLT_FILE) +endif + $(PREPROCESSED_FILES): %: $(PREPROCESSOR_CONFIG_FILES) %.m4 - $(M4) -P $^ > $@ + $(M4_EXEC) -P $^ > $@ $(OPTIONAL_DIRS): %: mkdir -p $@ .SECONDEXPANSION: $(ERL_BIN_FILES): $(BIN_DIR)/%.beam: $$(shell find $(SRC_DIR) -name "%.erl") - $(ERLC) $(ERLC_OPTS) -o $(BIN_DIR) $< + $(ERLC_EXEC) -o $(BIN_DIR) $< diff --git a/src/battlemap/game-logic/bm_next_turn.erl b/src/battlemap/game-logic/bm_next_turn.erl index 3628111..abe286e 100644 --- a/src/battlemap/game-logic/bm_next_turn.erl +++ b/src/battlemap/game-logic/bm_next_turn.erl @@ -127,7 +127,7 @@ requires_update (Update) -> ( bm_character_turn_update:type() ) - -> character_turn_update:type(). + -> bm_character_turn_update:type(). update_if_needed (Update) -> case requires_update(Update) of true -> update(Update); diff --git a/src/battlemap/game-logic/bm_turn_actions.erl b/src/battlemap/game-logic/bm_turn_actions.erl index 9664283..bf4075f 100644 --- a/src/battlemap/game-logic/bm_turn_actions.erl +++ b/src/battlemap/game-logic/bm_turn_actions.erl @@ -32,7 +32,7 @@ handle_switch_weapon (Update) -> UpdatedWeaponIDs = {SecondaryWeaponID, PrimaryWeaponID}, UpdatedCharacterStatistics = - bm_statistics:new(CharacterAttributes, UpdatedWeaponIDs), + sh_statistics:new(CharacterAttributes, UpdatedWeaponIDs), UpdatedCharacter = bm_character:set_statistics ( @@ -115,7 +115,7 @@ assert_character_can_move (Data, Cost) -> Character = bm_character_turn_data:get_character(Data), CharacterStatistics = bm_character:get_statistics(Character), CharacterMovementPoints = - bm_statistics:get_movement_points(CharacterStatistics), + sh_statistics:get_movement_points(CharacterStatistics), true = (Cost =< CharacterMovementPoints), @@ -247,10 +247,10 @@ handle_attack_sequence bm_character:type(), bm_character:type() ) - -> list(attack:step()). + -> list(bm_attack:step()). get_attack_sequence (Character, TargetCharacter) -> Range = - location:dist + bm_location:dist ( bm_character:get_location(Character), bm_character:get_location(TargetCharacter) @@ -259,8 +259,8 @@ get_attack_sequence (Character, TargetCharacter) -> {AttackingWeaponID, _} = bm_character:get_weapon_ids(Character), {DefendingWeaponID, _} = bm_character:get_weapon_ids(TargetCharacter), - AttackingWeapon = bm_weapon:from_id(AttackingWeaponID), - DefendingWeapon = bm_weapon:from_id(DefendingWeaponID), + AttackingWeapon = sh_weapon:from_id(AttackingWeaponID), + DefendingWeapon = sh_weapon:from_id(DefendingWeaponID), bm_attack:get_sequence(Range, AttackingWeapon, DefendingWeapon). diff --git a/src/battlemap/query/bm_load_state.erl b/src/battlemap/query/bm_load_state.erl index b580b9f..4af2385 100644 --- a/src/battlemap/query/bm_load_state.erl +++ b/src/battlemap/query/bm_load_state.erl @@ -53,7 +53,7 @@ fetch_data (Input) -> PlayerID = Input#input.player_id, BattleID = Input#input.battle_id, - Battle = timed_cache:fetch (battle_db, PlayerID, BattleID), + Battle = sh_timed_cache:fetch(battle_db, PlayerID, BattleID), #query_state { diff --git a/src/battlemap/reply/add_char.erl b/src/battlemap/reply/add_char.erl deleted file mode 100644 index 86b1e9c..0000000 --- a/src/battlemap/reply/add_char.erl +++ /dev/null @@ -1,78 +0,0 @@ --module(add_char). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export([generate/3]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec attributes_as_json - ( - attributes:type() - ) -> - {list({binary(), non_neg_integer()})}. -attributes_as_json (Attributes) -> - { - [ - {<<"con">>, attributes:get_constitution(Attributes)}, - {<<"dex">>, attributes:get_dexterity(Attributes)}, - {<<"int">>, attributes:get_intelligence(Attributes)}, - {<<"min">>, attributes:get_mind(Attributes)}, - {<<"spe">>, attributes:get_speed(Attributes)}, - {<<"str">>, attributes:get_strength(Attributes)} - ] - }. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec generate - ( - non_neg_integer(), - character:type(), - player:id() - ) - -> {list(any())}. -generate (IX, Character, PlayerID) -> - IsAlive = character:get_is_alive(Character), - Attributes = character:get_attributes(Character), - {ActiveWeapon, SecondaryWeapon} = character:get_weapon_ids(Character), - OwnerID = character:get_owner_id(Character), - Location = - case IsAlive of - true -> character:get_location(Character); - _ -> location:get_nowhere() - end, - - { - [ - {<<"msg">>, <<"add_char">>}, - {<<"ix">>, IX}, - {<<"nam">>, character:get_name(Character)}, - {<<"ico">>, character:get_icon(Character)}, - {<<"prt">>, character:get_portrait(Character)}, - { - <<"hea">>, - character:get_current_health(Character) - }, - {<<"lc">>, location:encode(Location)}, - {<<"pla">>, OwnerID}, - { - <<"ena">>, - ( - character:get_is_active(Character) - and - (OwnerID == PlayerID) - ) - }, - {<<"att">>, attributes_as_json(Attributes)}, - {<<"awp">>, ActiveWeapon}, - {<<"swp">>, SecondaryWeapon} - ] - }. diff --git a/src/battlemap/reply/bm_add_char.erl b/src/battlemap/reply/bm_add_char.erl new file mode 100644 index 0000000..d6f5965 --- /dev/null +++ b/src/battlemap/reply/bm_add_char.erl @@ -0,0 +1,78 @@ +-module(bm_add_char). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([generate/3]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec attributes_as_json + ( + sh_attributes:type() + ) -> + {list({binary(), non_neg_integer()})}. +attributes_as_json (Attributes) -> + { + [ + {<<"con">>, sh_attributes:get_constitution(Attributes)}, + {<<"dex">>, sh_attributes:get_dexterity(Attributes)}, + {<<"int">>, sh_attributes:get_intelligence(Attributes)}, + {<<"min">>, sh_attributes:get_mind(Attributes)}, + {<<"spe">>, sh_attributes:get_speed(Attributes)}, + {<<"str">>, sh_attributes:get_strength(Attributes)} + ] + }. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec generate + ( + non_neg_integer(), + bm_character:type(), + bm_player:id() + ) + -> {list(any())}. +generate (IX, Character, PlayerID) -> + IsAlive = bm_character:get_is_alive(Character), + Attributes = bm_character:get_attributes(Character), + {ActiveWeapon, SecondaryWeapon} = bm_character:get_weapon_ids(Character), + OwnerID = bm_character:get_owner_id(Character), + Location = + case IsAlive of + true -> bm_character:get_location(Character); + _ -> bm_location:get_nowhere() + end, + + { + [ + {<<"msg">>, <<"add_char">>}, + {<<"ix">>, IX}, + {<<"nam">>, bm_character:get_name(Character)}, + {<<"ico">>, bm_character:get_icon(Character)}, + {<<"prt">>, bm_character:get_portrait(Character)}, + { + <<"hea">>, + bm_character:get_current_health(Character) + }, + {<<"lc">>, bm_location:encode(Location)}, + {<<"pla">>, OwnerID}, + { + <<"ena">>, + ( + bm_character:get_is_active(Character) + and + (OwnerID == PlayerID) + ) + }, + {<<"att">>, attributes_as_json(Attributes)}, + {<<"awp">>, ActiveWeapon}, + {<<"swp">>, SecondaryWeapon} + ] + }. diff --git a/src/battlemap/reply/bm_set_map.erl b/src/battlemap/reply/bm_set_map.erl new file mode 100644 index 0000000..992581b --- /dev/null +++ b/src/battlemap/reply/bm_set_map.erl @@ -0,0 +1,28 @@ +-module(bm_set_map). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([generate/1]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec generate (bm_battlemap:type()) -> {list(any())}. +generate (Battlemap) -> + { + [ + {<<"msg">>, <<"set_map">>}, + {<<"w">>, bm_battlemap:get_width(Battlemap)}, + {<<"h">>, bm_battlemap:get_height(Battlemap)}, + {<<"t">>, array:sparse_to_list(bm_battlemap:get_tile_ids(Battlemap))} + ] + }. diff --git a/src/battlemap/reply/bm_set_timeline.erl b/src/battlemap/reply/bm_set_timeline.erl new file mode 100644 index 0000000..cea3790 --- /dev/null +++ b/src/battlemap/reply/bm_set_timeline.erl @@ -0,0 +1,27 @@ +-module(bm_set_timeline). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([generate/1]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec generate (list(any())) -> {list(any())}. +generate (EncodedClientUpdate) -> + io:format("~nSending timeline:~n~p~n", [EncodedClientUpdate]), + { + [ + {<<"msg">>, <<"set_timeline">>}, + {<<"cnt">>, EncodedClientUpdate} + ] + }. diff --git a/src/battlemap/reply/bm_turn_results.erl b/src/battlemap/reply/bm_turn_results.erl new file mode 100644 index 0000000..d47a693 --- /dev/null +++ b/src/battlemap/reply/bm_turn_results.erl @@ -0,0 +1,27 @@ +-module(bm_turn_results). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([generate/1]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec generate (list(any())) -> {list(any())}. +generate (EncodedClientUpdate) -> + io:format("~nSending turn results:~n~p~n", [EncodedClientUpdate]), + { + [ + {<<"msg">>, <<"turn_results">>}, + {<<"cnt">>, EncodedClientUpdate} + ] + }. diff --git a/src/battlemap/reply/set_map.erl b/src/battlemap/reply/set_map.erl deleted file mode 100644 index 8518ac5..0000000 --- a/src/battlemap/reply/set_map.erl +++ /dev/null @@ -1,28 +0,0 @@ --module(set_map). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export([generate/1]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec generate (battlemap:type()) -> {list(any())}. -generate (Battlemap) -> - { - [ - {<<"msg">>, <<"set_map">>}, - {<<"w">>, battlemap:get_width(Battlemap)}, - {<<"h">>, battlemap:get_height(Battlemap)}, - {<<"t">>, array:sparse_to_list(battlemap:get_tile_ids(Battlemap))} - ] - }. diff --git a/src/battlemap/reply/set_timeline.erl b/src/battlemap/reply/set_timeline.erl deleted file mode 100644 index bfe621a..0000000 --- a/src/battlemap/reply/set_timeline.erl +++ /dev/null @@ -1,27 +0,0 @@ --module(set_timeline). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export([generate/1]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec generate (list(any())) -> {list(any())}. -generate (EncodedClientUpdate) -> - io:format("~nSending timeline:~n~p~n", [EncodedClientUpdate]), - { - [ - {<<"msg">>, <<"set_timeline">>}, - {<<"cnt">>, EncodedClientUpdate} - ] - }. diff --git a/src/battlemap/reply/turn_results.erl b/src/battlemap/reply/turn_results.erl deleted file mode 100644 index 0f3ff25..0000000 --- a/src/battlemap/reply/turn_results.erl +++ /dev/null @@ -1,27 +0,0 @@ --module(turn_results). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export([generate/1]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec generate (list(any())) -> {list(any())}. -generate (EncodedClientUpdate) -> - io:format("~nSending turn results:~n~p~n", [EncodedClientUpdate]), - { - [ - {<<"msg">>, <<"turn_results">>}, - {<<"cnt">>, EncodedClientUpdate} - ] - }. diff --git a/src/battlemap/struct/bm_attack.erl b/src/battlemap/struct/bm_attack.erl index fe7d8b8..c647dae 100644 --- a/src/battlemap/struct/bm_attack.erl +++ b/src/battlemap/struct/bm_attack.erl @@ -47,13 +47,13 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec roll_precision ( - bm_statistics:type(), - bm_statistics:type() + sh_statistics:type(), + sh_statistics:type() ) -> precision(). roll_precision (AttackerStatistics, DefenderStatistics) -> - DefenderDodges = bm_statistics:get_dodges(DefenderStatistics), - AttackerAccuracy = bm_statistics:get_accuracy(AttackerStatistics), + DefenderDodges = sh_statistics:get_dodges(DefenderStatistics), + AttackerAccuracy = sh_statistics:get_accuracy(AttackerStatistics), MissChance = max(0, (DefenderDodges - AttackerAccuracy)), case sh_roll:percentage() of X when (X =< MissChance) -> misses; @@ -63,31 +63,31 @@ roll_precision (AttackerStatistics, DefenderStatistics) -> -spec roll_damage ( - bm_statistics:type(), - bm_statistics:type() + sh_statistics:type(), + sh_statistics:type() ) -> {non_neg_integer(), boolean()}. roll_damage (AttackerStatistics, _DefenderStatistics) -> {MinimumDamage, MaximumDamage} = - bm_statistics:get_damages(AttackerStatistics), + sh_statistics:get_damages(AttackerStatistics), MaximumRoll = max(1, MaximumDamage - MinimumDamage), BaseDamage = MinimumDamage + (rand:uniform(MaximumRoll) - 1), - CriticalHitChance = bm_statistics:get_critical_hits(AttackerStatistics), + CriticalHitChance = sh_statistics:get_critical_hits(AttackerStatistics), case sh_roll:percentage() of X when (X =< CriticalHitChance) -> {(BaseDamage * 2), true}; _ -> {BaseDamage, false} end. --spec roll_parry (bm_statistics:type()) -> boolean(). +-spec roll_parry (sh_statistics:type()) -> boolean(). roll_parry (DefenderStatistics) -> - DefenderParryChance = bm_statistics:get_parries(DefenderStatistics), + DefenderParryChance = sh_statistics:get_parries(DefenderStatistics), (sh_roll:percentage() =< DefenderParryChance). -spec effect_of_attack ( order(), - bm_statistics:type(), - bm_statistics:type(), + sh_statistics:type(), + sh_statistics:type(), boolean() ) -> type(). @@ -134,8 +134,8 @@ encode_precision (misses) -> <<"m">>. -spec get_description_of ( step(), - bm_statistics:type(), - bm_statistics:type() + sh_statistics:type(), + sh_statistics:type() ) -> maybe_type(). get_description_of @@ -152,7 +152,7 @@ get_description_of DefenderStatistics ) -> AttackerDoubleAttackChange = - bm_statistics:get_double_hits(AttackerStatistics), + sh_statistics:get_double_hits(AttackerStatistics), case sh_roll:percentage() of X when (X =< AttackerDoubleAttackChange) -> @@ -246,28 +246,28 @@ when -spec get_sequence ( non_neg_integer(), - bm_weapon:type(), - bm_weapon:type() + sh_weapon:type(), + sh_weapon:type() ) -> list(step()). get_sequence (AttackRange, AttackerWeapon, DefenderWeapon) -> {AttackerDefenseRange, AttackerAttackRange} = - bm_weapon:get_ranges(AttackerWeapon), + sh_weapon:get_ranges(AttackerWeapon), {DefenderDefenseRange, DefenderAttackRange} = - bm_weapon:get_ranges(DefenderWeapon), + sh_weapon:get_ranges(DefenderWeapon), AttackerCanAttack = (AttackRange =< AttackerAttackRange), AttackerCanAttack = true, AttackerCanDefend = (AttackerCanAttack and (AttackRange > AttackerDefenseRange)), AttackerCanParry = - (AttackerCanDefend and weapon:can_parry(AttackerWeapon)), + (AttackerCanDefend and sh_weapon:can_parry(AttackerWeapon)), DefenderCanAttack = (AttackRange =< DefenderAttackRange), DefenderCanDefend = (DefenderCanAttack and (AttackRange > DefenderDefenseRange)), DefenderCanParry = - (DefenderCanDefend and weapon:can_parry(DefenderWeapon)), + (DefenderCanDefend and sh_weapon:can_parry(DefenderWeapon)), First = {first, DefenderCanParry}, Second = {second, DefenderCanParry}, diff --git a/src/battlemap/struct/bm_battle_action.erl b/src/battlemap/struct/bm_battle_action.erl index abdc1c6..9f9b50f 100644 --- a/src/battlemap/struct/bm_battle_action.erl +++ b/src/battlemap/struct/bm_battle_action.erl @@ -92,7 +92,7 @@ can_follow (switch_weapon, attack) -> true; can_follow (move, attack) -> true; can_follow (_, _) -> false. --spec get_path (type()) -> list(direction:type()). +-spec get_path (type()) -> list(bm_direction:type()). get_path (Action) when is_record(Action, move) -> Action#move.path; get_path (_) -> diff --git a/src/battlemap/struct/bm_character.erl b/src/battlemap/struct/bm_character.erl index e797b74..5552a02 100644 --- a/src/battlemap/struct/bm_character.erl +++ b/src/battlemap/struct/bm_character.erl @@ -15,8 +15,8 @@ icon :: binary(), portrait :: binary(), attributes :: sh_attributes:type(), - statistics :: bm_statistics:type(), - weapon_ids :: {bm_weapon:id(), bm_weapon:id()}, + statistics :: sh_statistics:type(), + weapon_ids :: {sh_weapon:id(), sh_weapon:id()}, location :: {non_neg_integer(), non_neg_integer()}, current_health :: non_neg_integer(), active :: boolean() @@ -78,8 +78,8 @@ ) -> {non_neg_integer(), non_neg_integer()}. find_random_location (BattlemapWidth, BattlemapHeight, ForbiddenLocations) -> - X = roll:between(0, (BattlemapWidth - 1)), - Y = roll:between(0, (BattlemapHeight - 1)), + X = sh_roll:between(0, (BattlemapWidth - 1)), + Y = sh_roll:between(0, (BattlemapHeight - 1)), IsForbidden = lists:member({X, Y}, ForbiddenLocations), @@ -117,10 +117,10 @@ get_portrait (Char) -> Char#character.portrait. -spec get_attributes (type()) -> sh_attributes:type(). get_attributes (Char) -> Char#character.attributes. --spec get_weapon_ids (type()) -> {bm_weapon:id(), bm_weapon:id()}. +-spec get_weapon_ids (type()) -> {sh_weapon:id(), sh_weapon:id()}. get_weapon_ids (Char) -> Char#character.weapon_ids. --spec get_statistics (type()) -> bm_statistics:type(). +-spec get_statistics (type()) -> sh_statistics:type(). get_statistics (Char) -> Char#character.statistics. -spec get_location (type()) -> {non_neg_integer(), non_neg_integer()}. @@ -171,7 +171,7 @@ set_is_active (Active, Char) -> -spec set_weapon_ids ( - {bm_weapon:id(), bm_weapon:id()}, + {sh_weapon:id(), sh_weapon:id()}, type() ) -> type(). @@ -183,7 +183,7 @@ set_weapon_ids (WeaponIDs, Char) -> -spec set_statistics ( - bm_statistics:type(), + sh_statistics:type(), type() ) -> type(). @@ -206,9 +206,9 @@ set_statistics (Stats, Char) -> random (ID, OwnerID, BattlemapWidth, BattlemapHeight, ForbiddenLocations) -> Location = find_random_location(BattlemapWidth, BattlemapHeight, ForbiddenLocations), - WeaponIDs = {bm_weapon:random_id(), bm_weapon:random_id()}, + WeaponIDs = {sh_weapon:random_id(), sh_weapon:random_id()}, Attributes = sh_attributes:random(), - Statistics = bm_statistics:new(Attributes, WeaponIDs), + Statistics = sh_statistics:new(Attributes, WeaponIDs), IDAsListString = integer_to_list(ID), IDAsBinaryString = list_to_binary(IDAsListString), @@ -223,7 +223,7 @@ random (ID, OwnerID, BattlemapWidth, BattlemapHeight, ForbiddenLocations) -> weapon_ids = WeaponIDs, statistics = Statistics, location = Location, - current_health = bm_statistics:get_health(Statistics), + current_health = sh_statistics:get_health(Statistics), active = false }. diff --git a/src/battlemap/struct/bm_character_turn_request.erl b/src/battlemap/struct/bm_character_turn_request.erl index d141d7e..f922211 100644 --- a/src/battlemap/struct/bm_character_turn_request.erl +++ b/src/battlemap/struct/bm_character_turn_request.erl @@ -68,7 +68,7 @@ decode (Map) -> actions = Actions }. --spec get_player_id (type()) -> player:id(). +-spec get_player_id (type()) -> bm_player:id(). get_player_id (Request) -> Request#type.player_id. -spec get_session_token (type()) -> binary(). diff --git a/src/battlemap/struct/bm_weapon.erl b/src/battlemap/struct/bm_weapon.erl deleted file mode 100644 index 6c05799..0000000 --- a/src/battlemap/struct/bm_weapon.erl +++ /dev/null @@ -1,360 +0,0 @@ --module(bm_weapon). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --opaque id() :: non_neg_integer(). - --type range_type() :: 'ranged' | 'melee'. --type range_mod() :: 'long' | 'short'. --type damage_type() :: 'slash' | 'pierce' | 'blunt'. --type damage_mod() :: 'heavy' | 'light'. - --record -( - weapon, - { - id :: id(), - name :: binary(), - range_type :: range_type(), - range_mod :: range_mod(), - damage_type :: damage_type(), - damage_mod :: damage_mod() - } -). - --opaque type() :: #weapon{}. - --export_type([type/0, id/0]). --export_type -( - [ - range_type/0, - range_mod/0, - damage_type/0, - damage_mod/0 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Accessors --export -( - [ - get_id/1, - get_range_type/1, - get_ranges/1, - get_damages/1 - ] -). - --export -( - [ - random_id/0, - from_id/1, - can_parry/1, - apply_to_attributes/2 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec ranges_of_type - ( - range_type(), - range_mod() - ) - -> {non_neg_integer(), non_neg_integer()}. -ranges_of_type (ranged, long) -> {2, 6}; -ranges_of_type (ranged, short) -> {1, 4}; -ranges_of_type (melee, long) -> {0, 2}; -ranges_of_type (melee, short) -> {0, 1}. - --spec damages_of_type - ( - range_type(), - damage_mod() - ) - -> {non_neg_integer(), non_neg_integer()}. -damages_of_type (ranged, heavy) -> {10, 25}; -damages_of_type (ranged, light) -> {5, 20}; -damages_of_type (melee, heavy) -> {20, 35}; -damages_of_type (melee, light) -> {15, 30}. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Accessors --spec get_id (type()) -> id(). -get_id (Wp) -> Wp#weapon.id. - --spec get_range_type (type()) -> range_type(). -get_range_type (Wp) -> Wp#weapon.range_type. - --spec get_ranges (type()) -> {non_neg_integer(), non_neg_integer()}. -get_ranges (Wp) -> - ranges_of_type(Wp#weapon.range_type, Wp#weapon.range_mod). - --spec get_damages (type()) -> {non_neg_integer(), non_neg_integer()}. -get_damages (Wp) -> - damages_of_type(Wp#weapon.range_type, Wp#weapon.damage_mod). - --spec can_parry (type()) -> boolean(). -can_parry (Wp) -> (Wp#weapon.range_type == melee). - --spec from_id (id()) -> type(). -from_id (0) -> - #weapon{ - id = 0, - name = <<"None">>, - range_type = melee, - range_mod = short, - damage_type = blunt, - damage_mod = light - }; -from_id (1) -> - #weapon{ - id = 1, - name = <<"Dagger">>, - range_type = melee, - range_mod = short, - damage_type = slash, - damage_mod = light - }; -from_id (2) -> - #weapon{ - id = 2, - name = <<"Sword">>, - range_type = melee, - range_mod = short, - damage_type = slash, - damage_mod = heavy - }; -from_id (3) -> - #weapon{ - id = 3, - name = <<"Claymore">>, - range_type = melee, - range_mod = long, - damage_type = slash, - damage_mod = light - }; -from_id (4) -> - #weapon{ - id = 4, - name = <<"Bardiche">>, - range_type = melee, - range_mod = long, - damage_type = slash, - damage_mod = heavy - }; -from_id (5) -> - #weapon{ - id = 5, - name = <<"Stiletto">>, - range_type = melee, - range_mod = short, - damage_type = pierce, - damage_mod = light - }; -from_id (6) -> - #weapon{ - id = 6, - name = <<"Pickaxe">>, - range_type = melee, - range_mod = short, - damage_type = pierce, - damage_mod = heavy - }; -from_id (7) -> - #weapon{ - id = 7, - name = <<"Rapier">>, - range_type = melee, - range_mod = long, - damage_type = pierce, - damage_mod = light - }; -from_id (8) -> - #weapon{ - id = 8, - name = <<"Pike">>, - range_type = melee, - range_mod = long, - damage_type = pierce, - damage_mod = heavy - }; -from_id (9) -> - #weapon{ - id = 9, - name = <<"Club">>, - range_type = melee, - range_mod = short, - damage_type = blunt, - damage_mod = light - }; -from_id (10) -> - #weapon{ - id = 10, - name = <<"Mace">>, - range_type = melee, - range_mod = short, - damage_type = blunt, - damage_mod = heavy - }; -from_id (11) -> - #weapon{ - id = 11, - name = <<"Staff">>, - range_type = melee, - range_mod = long, - damage_type = blunt, - damage_mod = light - }; -from_id (12) -> - #weapon{ - id = 12, - name = <<"War Hammer">>, - range_type = melee, - range_mod = long, - damage_type = blunt, - damage_mod = heavy - }; -from_id (13) -> - #weapon{ - id = 13, - name = <<"Short Bow (Broadhead)">>, - range_type = ranged, - range_mod = short, - damage_type = slash, - damage_mod = light - }; -from_id (14) -> - #weapon{ - id = 14, - name = <<"Short Bow (Blunt)">>, - range_type = ranged, - range_mod = short, - damage_type = blunt, - damage_mod = light - }; -from_id (15) -> - #weapon{ - id = 15, - name = <<"Short Bow (Bodkin Point)">>, - range_type = ranged, - range_mod = short, - damage_type = pierce, - damage_mod = light - }; -from_id (16) -> - #weapon{ - id = 16, - name = <<"Long Bow (Broadhead)">>, - range_type = ranged, - range_mod = long, - damage_type = slash, - damage_mod = light - }; -from_id (17) -> - #weapon{ - id = 17, - name = <<"Long Bow (Blunt)">>, - range_type = ranged, - range_mod = long, - damage_type = blunt, - damage_mod = light - }; -from_id (18) -> - #weapon{ - id = 18, - name = <<"Long Bow (Bodkin Point)">>, - range_type = ranged, - range_mod = long, - damage_type = pierce, - damage_mod = light - }; -from_id (19) -> - #weapon{ - id = 19, - name = <<"Crossbow (Broadhead)">>, - range_type = ranged, - range_mod = short, - damage_type = slash, - damage_mod = heavy - }; -from_id (20) -> - #weapon{ - id = 20, - name = <<"Crossbow (Blunt)">>, - range_type = ranged, - range_mod = short, - damage_type = blunt, - damage_mod = heavy - }; -from_id (21) -> - #weapon{ - id = 21, - name = <<"Crossbow (Bodkin Point)">>, - range_type = ranged, - range_mod = short, - damage_type = pierce, - damage_mod = heavy - }; -from_id (22) -> - #weapon{ - id = 22, - name = <<"Arbalest (Broadhead)">>, - range_type = ranged, - range_mod = long, - damage_type = slash, - damage_mod = heavy - }; -from_id (23) -> - #weapon{ - id = 23, - name = <<"Arbalest (Blunt)">>, - range_type = ranged, - range_mod = long, - damage_type = blunt, - damage_mod = heavy - }; -from_id (24) -> - #weapon{ - id = 24, - name = <<"Arbalest (Bodkin Point)">>, - range_type = ranged, - range_mod = long, - damage_type = pierce, - damage_mod = heavy - }. - --spec random_id () -> id(). -random_id () -> sh_roll:between(0, 24). - --spec apply_to_attributes - ( - sh_attributes:type(), - bm_weapon:type() - ) - -> attributes:type(). -apply_to_attributes (Attributes, Weapon) -> - Dexterity = sh_attributes:get_dexterity(Attributes), - Speed = sh_attributes:get_speed(Attributes), - RangeModifier = Weapon#weapon.range_mod, - DamageModifier = Weapon#weapon.damage_mod, - WithRangeModifier = - case RangeModifier of - long -> - sh_attributes:set_dexterity(max(0, (Dexterity - 20)), Attributes); - _ -> Attributes - end, - case DamageModifier of - heavy -> sh_attributes:set_speed(max(0, (Speed - 20)), WithRangeModifier); - _ -> WithRangeModifier - end. - diff --git a/src/db/logic/db_access.erl b/src/db/logic/db_access.erl new file mode 100644 index 0000000..f589ba8 --- /dev/null +++ b/src/db/logic/db_access.erl @@ -0,0 +1,54 @@ +-module(db_access). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( + [ + read/2, + insert/4, + query/1 + ] +). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +get_value ([]) -> not_found; +get_value ([Regval]) -> {ok, sh_db_item:get_value(Regval)}. + +read_transaction (DB, ID) -> + get_value(mnesia:read(DB, ID)). + +insert_transaction (DB, ID, Perm, Value) -> + StoredItem = sh_db_item:new(ID, Perm, Value), + % FIXME: handle return value, mnesia:write -> (transaction abort | ok). + % FIXME: is this an atomic OP? Is the lock freed afterwards? + mnesia:write(DB, StoredItem, sticky_write), + ok. + +query_transaction (Query) -> + DB = sh_db_query:get_database(Query), + ID = sh_db_query:get_entry_id(Query), + [Item] = mnesia:read(DB, ID), + {ok, UpdatedItem} = sh_db_query:apply_to(Query, Item), + % FIXME: handle return value, mnesia:write -> (transaction abort | ok). + % FIXME: is this an atomic OP? Is the lock freed afterwards? + mnesia:write(DB, UpdatedItem, sticky_write), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +read (DB, ID) -> + mnesia:transaction(fun read_transaction/2, [DB, ID]). + +insert (DB, ID, Perm, Value) -> + mnesia:transaction(fun insert_transaction/4, [DB, ID, Perm, Value]). + +query (Query) -> + mnesia:transaction(fun query_transaction/1, [Query]). diff --git a/src/db/logic/storage_access.erl b/src/db/logic/storage_access.erl deleted file mode 100644 index 437294f..0000000 --- a/src/db/logic/storage_access.erl +++ /dev/null @@ -1,54 +0,0 @@ --module(storage_access). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( - [ - read/2, - insert/4, - query/1 - ] -). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -get_value ([]) -> not_found; -get_value ([Regval]) -> {ok, db_item:get_value(Regval)}. - -read_transaction (DB, ID) -> - get_value(mnesia:read(DB, ID)). - -insert_transaction (DB, ID, Perm, Value) -> - StoredItem = db_item:new(ID, Perm, Value), - % FIXME: handle return value, mnesia:write -> (transaction abort | ok). - % FIXME: is this an atomic OP? Is the lock freed afterwards? - mnesia:write(DB, StoredItem, sticky_write), - ok. - -query_transaction (Query) -> - DB = db_query:get_database(Query), - ID = db_query:get_entry_id(Query), - [Item] = mnesia:read(DB, ID), - {ok, UpdatedItem} = db_query:apply_to(Query, Item), - % FIXME: handle return value, mnesia:write -> (transaction abort | ok). - % FIXME: is this an atomic OP? Is the lock freed afterwards? - mnesia:write(DB, UpdatedItem, sticky_write), - ok. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -read (DB, ID) -> - mnesia:transaction(fun read_transaction/2, [DB, ID]). - -insert (DB, ID, Perm, Value) -> - mnesia:transaction(fun insert_transaction/4, [DB, ID, Perm, Value]). - -query (Query) -> - mnesia:transaction(fun query_transaction/1, [Query]). diff --git a/src/db/struct/db_query.erl b/src/db/struct/db_query.erl deleted file mode 100644 index 9a86f98..0000000 --- a/src/db/struct/db_query.erl +++ /dev/null @@ -1,114 +0,0 @@ --module(db_query). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --include("../../shared/include/db_query.hrl"). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( - [ - get_database/1, - get_entry_id/1 - ] -). --export([apply_to/2]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec get_user (db_query()) -> sh_db_user:user(). -get_user (#db_query{ user = Result }) -> Result. - --spec apply_update_indexed (#update_indexed{}, any()) -> any(). -apply_update_indexed (Op, Elem) -> - FieldNumber = Op#update_indexed.field, - IX = Op#update_indexed.ix, - Ops = Op#update_indexed.ops, - - IndexedFieldValue = element(FieldNumber, Elem), - ArrayValue = array:get(IX, IndexedFieldValue), - UpdatedArrayValue = lists:foldl(fun apply_op_to/2, ArrayValue, Ops), - UpdatedIndexedFieldValue = - array:set(IX, UpdatedArrayValue, IndexedFieldValue), - - setelement(FieldNumber, Elem, UpdatedIndexedFieldValue). - --spec apply_add_to_field (#add_to_field{}, any()) -> any(). -apply_add_to_field (Op, Elem) -> - FieldNumber = Op#add_to_field.field, - NewValues = Op#add_to_field.values, - AddToHead = Op#add_to_field.head, - - CurrentValues = element(FieldNumber, Elem), - UpdatedValues = - case AddToHead of - true -> (NewValues ++ CurrentValues); - _ -> (CurrentValues ++ NewValues) - end, - - setelement(FieldNumber, Elem, UpdatedValues). - --spec apply_set_field (#set_field{}, any()) -> any(). -apply_set_field (Op, Elem) -> - FieldNumber = Op#set_field.field, - NewValue = Op#set_field.value, - - setelement(FieldNumber, Elem, NewValue). - --spec apply_op_to (db_query_op(), any()) -> any(). -apply_op_to (Op, Elem) when is_record(Op, set_field) -> - apply_set_field(Op, Elem); -apply_op_to (Op, Elem) when is_record(Op, add_to_field) -> - apply_add_to_field(Op, Elem); -apply_op_to (Op, Elem) when is_record(Op, update_indexed) -> - apply_update_indexed(Op, Elem). - --spec apply_master_op_to - ( - db_query_master_op(), - db_item:type() - ) - -> db_item:type(). -apply_master_op_to (MOp, Elem) when is_record(MOp, set_perm) -> - NewPerm = MOp#set_perm.perm, - - db_item:set_perm(NewPerm, Elem); -apply_master_op_to (MOp, Elem) when is_record(MOp, set_val) -> - NewVal = MOp#set_val.val, - - db_item:set_value(NewVal, Elem); -apply_master_op_to (MOp, Elem) -> - OldValue = sh_db_item:get_value(Elem), - NewValue = apply_op_to(MOp, OldValue), - - db_item:set_value(NewValue, Elem). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec get_database (db_query()) -> atom(). -get_database (#db_query{ db = Result }) -> Result. - --spec get_entry_id (db_query()) -> any(). -get_entry_id (#db_query{ id = Result }) -> Result. - --spec apply_to - ( - db_query(), - db_item:type() - ) - -> ({'ok', db_item:type()} | 'error'). -apply_to (DBQuery, DBItem) -> - true = - sh_db_user:can_access - ( - sh_db_item:get_permission(DBItem), - get_user(DBQuery) - ), - MOps = DBQuery#db_query.ops, - {ok, lists:foldl(fun apply_master_op_to/2, DBItem, MOps)}. - diff --git a/src/shared/include/db_item.hrl b/src/shared/include/db_item.hrl deleted file mode 100644 index 86d5863..0000000 --- a/src/shared/include/db_item.hrl +++ /dev/null @@ -1,15 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --record -( - db_item, - { - id :: any(), - perm :: db_user:permission(), - val :: any() - } -). - --type db_item() :: #db_item{}. - diff --git a/src/shared/include/db_query.hrl b/src/shared/include/db_query.hrl deleted file mode 100644 index 7e5a5b0..0000000 --- a/src/shared/include/db_query.hrl +++ /dev/null @@ -1,63 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --record -( - set_field, - { - field :: non_neg_integer(), - value :: any() - } -). - --record -( - add_to_field, - { - field :: non_neg_integer(), - values :: list(any()), - head :: boolean() - } -). - --record -( - update_indexed, - { - field :: non_neg_integer(), - ix :: non_neg_integer(), - ops :: list(db_query_op()) - } -). - --record -( - set_perm, - { - perm :: db_user:permission() - } -). - --record -( - set_val, - { - val :: any() - } -). - --record -( - db_query, - { - db :: atom(), - id :: any(), - user :: db_user:user(), - ops :: list(db_query_master_op()) - } -). - --type db_query_op() :: (#set_field{} | #add_to_field{} | #update_indexed{}). --type db_query_master_op() :: (db_query_op() | #set_perm{} | #set_val{}). --type db_query() :: #db_query{}. - diff --git a/src/shared/include/db_user.hrl b/src/shared/include/db_user.hrl deleted file mode 100644 index c5b033e..0000000 --- a/src/shared/include/db_user.hrl +++ /dev/null @@ -1,7 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --type db_named_user() :: {'user', any()}. --type db_user() :: (db_named_user() | 'admin' | 'any'). --type db_permission() :: (list(db_named_user()) | 'any'). - diff --git a/src/shared/io/sh_timed_cache.erl b/src/shared/io/sh_timed_cache.erl index 1839992..de2f409 100644 --- a/src/shared/io/sh_timed_cache.erl +++ b/src/shared/io/sh_timed_cache.erl @@ -83,7 +83,7 @@ format_status (_, [_, State]) -> handle_info(timeout, State) -> {stop, normal, State}; handle_info(_, {DB, ObjectID}) -> - {noreply, {DB, ObjectID}, timed_caches_manager:get_timeout()}. + {noreply, {DB, ObjectID}, sh_timed_caches_manager:get_timeout()}. %%%% Interface Functions -spec fetch (atom(), any(), any()) -> any(). diff --git a/src/shared/struct/sh_db_item.erl b/src/shared/struct/sh_db_item.erl index e499634..98a1cb4 100644 --- a/src/shared/struct/sh_db_item.erl +++ b/src/shared/struct/sh_db_item.erl @@ -3,7 +3,17 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --include("../include/db_item.hrl"). +-record +( + db_item, + { + id :: any(), + perm :: sh_db_user:permission(), + val :: any() + } +). + +-type db_item() :: #db_item{}. -type type() :: db_item(). diff --git a/src/shared/struct/sh_db_query.erl b/src/shared/struct/sh_db_query.erl index 998568e..4eb50ba 100644 --- a/src/shared/struct/sh_db_query.erl +++ b/src/shared/struct/sh_db_query.erl @@ -3,7 +3,65 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --include("../include/db_query.hrl"). +-record +( + set_field, + { + field :: non_neg_integer(), + value :: any() + } +). + +-record +( + add_to_field, + { + field :: non_neg_integer(), + values :: list(any()), + head :: boolean() + } +). + +-record +( + update_indexed, + { + field :: non_neg_integer(), + ix :: non_neg_integer(), + ops :: list(db_query_op()) + } +). + +-record +( + set_perm, + { + perm :: sh_db_user:permission() + } +). + +-record +( + set_val, + { + val :: any() + } +). + +-record +( + db_query, + { + db :: atom(), + id :: any(), + user :: db_user:user(), + ops :: list(db_query_master_op()) + } +). + +-type db_query_op() :: (#set_field{} | #add_to_field{} | #update_indexed{}). +-type db_query_master_op() :: (db_query_op() | #set_perm{} | #set_val{}). +-type db_query() :: #db_query{}. -opaque op() :: db_query_op(). -opaque type() :: db_query(). @@ -22,10 +80,84 @@ update_indexed/3 ] ). +-export +( + [ + get_database/1, + get_entry_id/1 + ] +). +-export([apply_to/2]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_user (db_query()) -> sh_db_user:user(). +get_user (#db_query{ user = Result }) -> Result. + +-spec apply_update_indexed (#update_indexed{}, any()) -> any(). +apply_update_indexed (Op, Elem) -> + FieldNumber = Op#update_indexed.field, + IX = Op#update_indexed.ix, + Ops = Op#update_indexed.ops, + + IndexedFieldValue = element(FieldNumber, Elem), + ArrayValue = array:get(IX, IndexedFieldValue), + UpdatedArrayValue = lists:foldl(fun apply_op_to/2, ArrayValue, Ops), + UpdatedIndexedFieldValue = + array:set(IX, UpdatedArrayValue, IndexedFieldValue), + + setelement(FieldNumber, Elem, UpdatedIndexedFieldValue). + +-spec apply_add_to_field (#add_to_field{}, any()) -> any(). +apply_add_to_field (Op, Elem) -> + FieldNumber = Op#add_to_field.field, + NewValues = Op#add_to_field.values, + AddToHead = Op#add_to_field.head, + + CurrentValues = element(FieldNumber, Elem), + UpdatedValues = + case AddToHead of + true -> (NewValues ++ CurrentValues); + _ -> (CurrentValues ++ NewValues) + end, + + setelement(FieldNumber, Elem, UpdatedValues). + +-spec apply_set_field (#set_field{}, any()) -> any(). +apply_set_field (Op, Elem) -> + FieldNumber = Op#set_field.field, + NewValue = Op#set_field.value, + + setelement(FieldNumber, Elem, NewValue). + +-spec apply_op_to (db_query_op(), any()) -> any(). +apply_op_to (Op, Elem) when is_record(Op, set_field) -> + apply_set_field(Op, Elem); +apply_op_to (Op, Elem) when is_record(Op, add_to_field) -> + apply_add_to_field(Op, Elem); +apply_op_to (Op, Elem) when is_record(Op, update_indexed) -> + apply_update_indexed(Op, Elem). + +-spec apply_master_op_to + ( + db_query_master_op(), + sh_db_item:type() + ) + -> sh_db_item:type(). +apply_master_op_to (MOp, Elem) when is_record(MOp, set_perm) -> + NewPerm = MOp#set_perm.perm, + + sh_db_item:set_perm(NewPerm, Elem); +apply_master_op_to (MOp, Elem) when is_record(MOp, set_val) -> + NewVal = MOp#set_val.val, + + sh_db_item:set_value(NewVal, Elem); +apply_master_op_to (MOp, Elem) -> + OldValue = sh_db_item:get_value(Elem), + NewValue = apply_op_to(MOp, OldValue), + + sh_db_item:set_value(NewValue, Elem). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -57,3 +189,26 @@ add_to_field (Field, Values) -> -> op(). update_indexed (Field, IX, Updates) -> #update_indexed { field = Field, ix = IX, ops = Updates}. + +-spec get_database (db_query()) -> atom(). +get_database (#db_query{ db = Result }) -> Result. + +-spec get_entry_id (db_query()) -> any(). +get_entry_id (#db_query{ id = Result }) -> Result. + +-spec apply_to + ( + db_query(), + sh_db_item:type() + ) + -> ({'ok', sh_db_item:type()} | 'error'). +apply_to (DBQuery, DBItem) -> + true = + sh_db_user:can_access + ( + sh_db_item:get_permission(DBItem), + get_user(DBQuery) + ), + MOps = DBQuery#db_query.ops, + {ok, lists:foldl(fun apply_master_op_to/2, DBItem, MOps)}. + diff --git a/src/shared/struct/sh_db_user.erl b/src/shared/struct/sh_db_user.erl index 40a46d3..f2d4dfe 100644 --- a/src/shared/struct/sh_db_user.erl +++ b/src/shared/struct/sh_db_user.erl @@ -3,7 +3,10 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --include("../include/db_user.hrl"). +-type db_named_user() :: {'user', any()}. +-type db_user() :: (db_named_user() | 'admin' | 'any'). +-type db_permission() :: (list(db_named_user()) | 'any'). + -type user() :: db_user(). -type permission() :: db_permission(). diff --git a/src/shared/struct/sh_statistics.erl b/src/shared/struct/sh_statistics.erl index 7cf2b06..92cd8d6 100644 --- a/src/shared/struct/sh_statistics.erl +++ b/src/shared/struct/sh_statistics.erl @@ -54,17 +54,14 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec ceil (float()) -> integer(). -ceil (F) -> +-spec float_to_int (float()) -> integer(). +float_to_int (F) -> I = trunc(F), case (F > I) of true -> (I + 1); _ -> I end. --spec float_to_int (float()) -> integer(). -float_to_int (F) -> ceil(F). - -spec min_max (number(), number(), number()) -> number(). min_max (Min, Max, V) -> min(Max, max(Min, V)). @@ -146,21 +143,21 @@ get_damages (Stats) -> -spec new ( - attributes:type(), - {weapon:id(), weapon:id()} + sh_attributes:type(), + {sh_weapon:id(), sh_weapon:id()} ) -> type(). new (BaseAttributes, WeaponIDs) -> {ActiveWeaponID, _} = WeaponIDs, - ActiveWeapon = weapon:from_id(ActiveWeaponID), - {MinDamage, MaxDamage} = weapon:get_damages(ActiveWeapon), - Attributes = weapon:apply_to_attributes(BaseAttributes, ActiveWeapon), - Constitution = attributes:get_constitution(Attributes), - Dexterity = attributes:get_dexterity(Attributes), - Intelligence = attributes:get_intelligence(Attributes), - Mind = attributes:get_mind(Attributes), - Speed = attributes:get_speed(Attributes), - Strength = attributes:get_strength(Attributes), + ActiveWeapon = sh_weapon:from_id(ActiveWeaponID), + {MinDamage, MaxDamage} = sh_weapon:get_damages(ActiveWeapon), + Attributes = sh_weapon:apply_to_attributes(BaseAttributes, ActiveWeapon), + Constitution = sh_attributes:get_constitution(Attributes), + Dexterity = sh_attributes:get_dexterity(Attributes), + Intelligence = sh_attributes:get_intelligence(Attributes), + Mind = sh_attributes:get_mind(Attributes), + Speed = sh_attributes:get_speed(Attributes), + Strength = sh_attributes:get_strength(Attributes), DamageBaseModifier = damage_base_modifier(Strength), #statistics diff --git a/src/shared/struct/sh_weapon.erl b/src/shared/struct/sh_weapon.erl new file mode 100644 index 0000000..30943b9 --- /dev/null +++ b/src/shared/struct/sh_weapon.erl @@ -0,0 +1,360 @@ +-module(sh_weapon). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-opaque id() :: non_neg_integer(). + +-type range_type() :: 'ranged' | 'melee'. +-type range_mod() :: 'long' | 'short'. +-type damage_type() :: 'slash' | 'pierce' | 'blunt'. +-type damage_mod() :: 'heavy' | 'light'. + +-record +( + weapon, + { + id :: id(), + name :: binary(), + range_type :: range_type(), + range_mod :: range_mod(), + damage_type :: damage_type(), + damage_mod :: damage_mod() + } +). + +-opaque type() :: #weapon{}. + +-export_type([type/0, id/0]). +-export_type +( + [ + range_type/0, + range_mod/0, + damage_type/0, + damage_mod/0 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-export +( + [ + get_id/1, + get_range_type/1, + get_ranges/1, + get_damages/1 + ] +). + +-export +( + [ + random_id/0, + from_id/1, + can_parry/1, + apply_to_attributes/2 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec ranges_of_type + ( + range_type(), + range_mod() + ) + -> {non_neg_integer(), non_neg_integer()}. +ranges_of_type (ranged, long) -> {2, 6}; +ranges_of_type (ranged, short) -> {1, 4}; +ranges_of_type (melee, long) -> {0, 2}; +ranges_of_type (melee, short) -> {0, 1}. + +-spec damages_of_type + ( + range_type(), + damage_mod() + ) + -> {non_neg_integer(), non_neg_integer()}. +damages_of_type (ranged, heavy) -> {10, 25}; +damages_of_type (ranged, light) -> {5, 20}; +damages_of_type (melee, heavy) -> {20, 35}; +damages_of_type (melee, light) -> {15, 30}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-spec get_id (type()) -> id(). +get_id (Wp) -> Wp#weapon.id. + +-spec get_range_type (type()) -> range_type(). +get_range_type (Wp) -> Wp#weapon.range_type. + +-spec get_ranges (type()) -> {non_neg_integer(), non_neg_integer()}. +get_ranges (Wp) -> + ranges_of_type(Wp#weapon.range_type, Wp#weapon.range_mod). + +-spec get_damages (type()) -> {non_neg_integer(), non_neg_integer()}. +get_damages (Wp) -> + damages_of_type(Wp#weapon.range_type, Wp#weapon.damage_mod). + +-spec can_parry (type()) -> boolean(). +can_parry (Wp) -> (Wp#weapon.range_type == melee). + +-spec from_id (id()) -> type(). +from_id (0) -> + #weapon{ + id = 0, + name = <<"None">>, + range_type = melee, + range_mod = short, + damage_type = blunt, + damage_mod = light + }; +from_id (1) -> + #weapon{ + id = 1, + name = <<"Dagger">>, + range_type = melee, + range_mod = short, + damage_type = slash, + damage_mod = light + }; +from_id (2) -> + #weapon{ + id = 2, + name = <<"Sword">>, + range_type = melee, + range_mod = short, + damage_type = slash, + damage_mod = heavy + }; +from_id (3) -> + #weapon{ + id = 3, + name = <<"Claymore">>, + range_type = melee, + range_mod = long, + damage_type = slash, + damage_mod = light + }; +from_id (4) -> + #weapon{ + id = 4, + name = <<"Bardiche">>, + range_type = melee, + range_mod = long, + damage_type = slash, + damage_mod = heavy + }; +from_id (5) -> + #weapon{ + id = 5, + name = <<"Stiletto">>, + range_type = melee, + range_mod = short, + damage_type = pierce, + damage_mod = light + }; +from_id (6) -> + #weapon{ + id = 6, + name = <<"Pickaxe">>, + range_type = melee, + range_mod = short, + damage_type = pierce, + damage_mod = heavy + }; +from_id (7) -> + #weapon{ + id = 7, + name = <<"Rapier">>, + range_type = melee, + range_mod = long, + damage_type = pierce, + damage_mod = light + }; +from_id (8) -> + #weapon{ + id = 8, + name = <<"Pike">>, + range_type = melee, + range_mod = long, + damage_type = pierce, + damage_mod = heavy + }; +from_id (9) -> + #weapon{ + id = 9, + name = <<"Club">>, + range_type = melee, + range_mod = short, + damage_type = blunt, + damage_mod = light + }; +from_id (10) -> + #weapon{ + id = 10, + name = <<"Mace">>, + range_type = melee, + range_mod = short, + damage_type = blunt, + damage_mod = heavy + }; +from_id (11) -> + #weapon{ + id = 11, + name = <<"Staff">>, + range_type = melee, + range_mod = long, + damage_type = blunt, + damage_mod = light + }; +from_id (12) -> + #weapon{ + id = 12, + name = <<"War Hammer">>, + range_type = melee, + range_mod = long, + damage_type = blunt, + damage_mod = heavy + }; +from_id (13) -> + #weapon{ + id = 13, + name = <<"Short Bow (Broadhead)">>, + range_type = ranged, + range_mod = short, + damage_type = slash, + damage_mod = light + }; +from_id (14) -> + #weapon{ + id = 14, + name = <<"Short Bow (Blunt)">>, + range_type = ranged, + range_mod = short, + damage_type = blunt, + damage_mod = light + }; +from_id (15) -> + #weapon{ + id = 15, + name = <<"Short Bow (Bodkin Point)">>, + range_type = ranged, + range_mod = short, + damage_type = pierce, + damage_mod = light + }; +from_id (16) -> + #weapon{ + id = 16, + name = <<"Long Bow (Broadhead)">>, + range_type = ranged, + range_mod = long, + damage_type = slash, + damage_mod = light + }; +from_id (17) -> + #weapon{ + id = 17, + name = <<"Long Bow (Blunt)">>, + range_type = ranged, + range_mod = long, + damage_type = blunt, + damage_mod = light + }; +from_id (18) -> + #weapon{ + id = 18, + name = <<"Long Bow (Bodkin Point)">>, + range_type = ranged, + range_mod = long, + damage_type = pierce, + damage_mod = light + }; +from_id (19) -> + #weapon{ + id = 19, + name = <<"Crossbow (Broadhead)">>, + range_type = ranged, + range_mod = short, + damage_type = slash, + damage_mod = heavy + }; +from_id (20) -> + #weapon{ + id = 20, + name = <<"Crossbow (Blunt)">>, + range_type = ranged, + range_mod = short, + damage_type = blunt, + damage_mod = heavy + }; +from_id (21) -> + #weapon{ + id = 21, + name = <<"Crossbow (Bodkin Point)">>, + range_type = ranged, + range_mod = short, + damage_type = pierce, + damage_mod = heavy + }; +from_id (22) -> + #weapon{ + id = 22, + name = <<"Arbalest (Broadhead)">>, + range_type = ranged, + range_mod = long, + damage_type = slash, + damage_mod = heavy + }; +from_id (23) -> + #weapon{ + id = 23, + name = <<"Arbalest (Blunt)">>, + range_type = ranged, + range_mod = long, + damage_type = blunt, + damage_mod = heavy + }; +from_id (24) -> + #weapon{ + id = 24, + name = <<"Arbalest (Bodkin Point)">>, + range_type = ranged, + range_mod = long, + damage_type = pierce, + damage_mod = heavy + }. + +-spec random_id () -> id(). +random_id () -> sh_roll:between(0, 24). + +-spec apply_to_attributes + ( + sh_attributes:type(), + type() + ) + -> sh_attributes:type(). +apply_to_attributes (Attributes, Weapon) -> + Dexterity = sh_attributes:get_dexterity(Attributes), + Speed = sh_attributes:get_speed(Attributes), + RangeModifier = Weapon#weapon.range_mod, + DamageModifier = Weapon#weapon.damage_mod, + WithRangeModifier = + case RangeModifier of + long -> + sh_attributes:set_dexterity(max(0, (Dexterity - 20)), Attributes); + _ -> Attributes + end, + case DamageModifier of + heavy -> sh_attributes:set_speed(max(0, (Speed - 20)), WithRangeModifier); + _ -> WithRangeModifier + end. + -- cgit v1.2.3-70-g09d2