summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/battle/query/btl_load.erl21
-rw-r--r--src/battle/struct/btl_battle.erl91
-rw-r--r--src/battle/struct/btl_character.erl39
-rw-r--r--src/battle/struct/btl_character_turn_data.erl58
-rw-r--r--src/shared/reply/shr_add_armor.erl (renamed from src/battle/reply/btl_add_armor.erl)2
-rw-r--r--src/shared/reply/shr_add_portrait.erl (renamed from src/battle/reply/btl_add_portrait.erl)2
-rw-r--r--src/shared/reply/shr_add_weapon.erl (renamed from src/battle/reply/btl_add_weapon.erl)2
-rw-r--r--src/shared/struct/inventory/shr_equipment.erl201
-rw-r--r--src/shared/struct/inventory/shr_inventory.erl237
9 files changed, 527 insertions, 126 deletions
diff --git a/src/battle/query/btl_load.erl b/src/battle/query/btl_load.erl
index 107419f..dae6fbe 100644
--- a/src/battle/query/btl_load.erl
+++ b/src/battle/query/btl_load.erl
@@ -35,6 +35,7 @@
-spec parse_input (shr_query:type()) -> input().
parse_input (Query) ->
JSONReqMap = shr_query:get_params(Query),
+
PlayerID = maps:get(<<"pid">>, JSONReqMap),
SessionToken = maps:get(<<"stk">>, JSONReqMap),
BattleID = maps:get(<<"bid">>, JSONReqMap),
@@ -154,6 +155,24 @@ generate_reply (QueryState, Input) ->
ordsets:to_list(btl_battle:get_used_armor_ids(Battle))
),
+ AddGlyphList =
+ lists:map
+ (
+ fun (GlyphID) ->
+ btl_add_glyph:generate(shr_glyph:from_id(GlyphID))
+ end,
+ ordsets:to_list(btl_battle:get_used_glyph_ids(Battle))
+ ),
+
+ AddGlyphBoardList =
+ lists:map
+ (
+ fun (GlyphBoardID) ->
+ btl_add_glyph_board:generate(shr_glyph_board:from_id(GlyphBoardID))
+ end,
+ ordsets:to_list(btl_battle:get_used_glyph_board_ids(Battle))
+ ),
+
AddTileList =
lists:map
(
@@ -168,6 +187,8 @@ generate_reply (QueryState, Input) ->
AddTileList
++ [SetTimeline, SetMap | AddWeaponList]
++ AddPortraitList
+ ++ AddGlyphList
+ ++ AddGlyphBoardList
++ AddArmorList
++ AddPlayerList
++ AddCharList
diff --git a/src/battle/struct/btl_battle.erl b/src/battle/struct/btl_battle.erl
index 2a09244..a5b5a06 100644
--- a/src/battle/struct/btl_battle.erl
+++ b/src/battle/struct/btl_battle.erl
@@ -9,10 +9,8 @@
(
battle,
{
- used_armor_ids :: ordsets:ordset(shr_armor:id()),
- used_weapon_ids :: ordsets:ordset(shr_weapon:id()),
- used_portrait_ids :: ordsets:ordset(shr_portrait:id()),
- used_tile_ids :: ordsets:ordset(shr_tile:id()),
+ related_inventory :: shr_inventory:type(),
+ related_tile_ids :: ordsets:ordset(shr_tile:id()),
map :: shr_map:type(),
characters :: orddict:orddict(non_neg_integer(), btl_character:type()),
players :: orddict:orddict(non_neg_integer(), btl_player:type()),
@@ -31,10 +29,8 @@
-export
(
[
- get_used_portrait_ids/1,
- get_used_weapon_ids/1,
- get_used_armor_ids/1,
- get_used_tile_ids/1,
+ get_related_inventory/1,
+ get_related_tile_ids/1,
get_map/1,
get_characters/1,
get_character/2,
@@ -44,20 +40,17 @@
get_encoded_last_turns_effects/1,
set_map/2,
- set_used_portrait_ids/2,
- set_used_weapon_ids/2,
- set_used_armor_ids/2,
+ set_related_inventory/2,
set_characters/2,
set_character/3,
set_players/2,
set_player/3,
set_current_player_turn/2,
- get_used_armor_ids_field/0,
- get_used_weapon_ids_field/0,
- get_used_portrait_ids_field/0,
get_characters_field/0,
get_players_field/0,
+ get_related_inventory_field/0,
+ get_related_tile_ids_field/0,
get_current_player_turn_field/0
]
).
@@ -90,17 +83,11 @@ get_all_timelines (Result, CurrentIndex, EndPoint, ArraySize, Players) ->
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Accessors
--spec get_used_portrait_ids (type()) -> ordsets:ordset(shr_portrait:id()).
-get_used_portrait_ids (Battle) -> Battle#battle.used_portrait_ids.
+-spec get_related_inventory (type()) -> shr_inventory:type().
+get_related_inventory (Battle) -> Battle#battle.related_inventory.
--spec get_used_weapon_ids (type()) -> ordsets:ordset(shr_weapon:id()).
-get_used_weapon_ids (Battle) -> Battle#battle.used_weapon_ids.
-
--spec get_used_armor_ids (type()) -> ordsets:ordset(shr_armor:id()).
-get_used_armor_ids (Battle) -> Battle#battle.used_armor_ids.
-
--spec get_used_tile_ids (type()) -> ordsets:ordset(shr_tile:id()).
-get_used_tile_ids (Battle) -> Battle#battle.used_tile_ids.
+-spec get_related_tile_ids (type()) -> ordsets:ordset(shr_tile:id()).
+get_related_tile_ids (Battle) -> Battle#battle.related_tile_ids.
-spec get_map (type()) -> shr_map:type().
get_map (Battle) -> Battle#battle.map.
@@ -146,7 +133,8 @@ get_encoded_last_turns_effects (Battle) ->
set_map (Map, Battle) ->
Battle#battle
{
- map = Map
+ map = Map,
+ related_tile_ids = shr_map:get_related_tile_ids(Map)
}.
-spec set_characters
@@ -180,40 +168,11 @@ set_players (Players, Battle) ->
players = Players
}.
--spec set_used_portrait_ids
- (
- ordsets:ordset(shr_portrait:id()),
- type()
- )
- -> type().
-set_used_portrait_ids (UPIDs, Battle) ->
- Battle#battle
- {
- used_portrait_ids = UPIDs
- }.
-
--spec set_used_weapon_ids
- (
- ordsets:ordset(shr_weapon:id()),
- type()
- )
- -> type().
-set_used_weapon_ids (UPIDs, Battle) ->
- Battle#battle
- {
- used_weapon_ids = UPIDs
- }.
-
--spec set_used_armor_ids
- (
- ordsets:ordset(shr_armor:id()),
- type()
- )
- -> type().
-set_used_armor_ids (UPIDs, Battle) ->
+-spec set_related_inventory ( shr_inventory:type(), type()) -> type().
+set_related_inventory (Inv, Battle) ->
Battle#battle
{
- used_armor_ids = UPIDs
+ related_inventory = Inv
}.
-spec set_player (non_neg_integer(), btl_player:type(), type()) -> type().
@@ -232,15 +191,12 @@ set_current_player_turn (PlayerTurn, Battle) ->
-spec new (shr_map:type()) -> type().
new (Map) ->
- EmptySet = ordsets:new(),
EmptyDict = orddict:new(),
#battle
{
- used_portrait_ids = EmptySet,
- used_weapon_ids = EmptySet,
- used_armor_ids = EmptySet,
- used_tile_ids = shr_map:get_used_tile_ids(Map),
+ related_inventory = shr_inventory:default(),
+ related_tile_ids = shr_map:get_related_tile_ids(Map),
map = Map,
characters = EmptyDict,
players = EmptyDict,
@@ -250,14 +206,11 @@ new (Map) ->
-spec get_characters_field () -> non_neg_integer().
get_characters_field () -> #battle.characters.
--spec get_used_portrait_ids_field () -> non_neg_integer().
-get_used_portrait_ids_field () -> #battle.used_portrait_ids.
-
--spec get_used_weapon_ids_field () -> non_neg_integer().
-get_used_weapon_ids_field () -> #battle.used_weapon_ids.
+-spec get_related_inventory_field () -> non_neg_integer().
+get_related_inventory_field () -> #battle.related_inventory.
--spec get_used_armor_ids_field () -> non_neg_integer().
-get_used_armor_ids_field () -> #battle.used_armor_ids.
+-spec get_related_tile_ids_field () -> non_neg_integer().
+get_related_tile_ids_field () -> #battle.related_tile_ids.
-spec get_players_field () -> non_neg_integer().
get_players_field () -> #battle.players.
diff --git a/src/battle/struct/btl_character.erl b/src/battle/struct/btl_character.erl
index 9194380..1136c8f 100644
--- a/src/battle/struct/btl_character.erl
+++ b/src/battle/struct/btl_character.erl
@@ -1,5 +1,13 @@
-module(btl_character).
+-define(PLAYER_IX_FIELD, <<"pla">>).
+-define(RANK_FIELD, <<"rnk">>).
+-define(LOCATION_FIELD, <<"lc">>).
+-define(CURRENT_HEALTH_FIELD, <<"he">>).
+-define(IS_ACTIVE_FIELD, <<"ena">>).
+-define(IS_DEFEATED_FIELD, <<"dea">>).
+-define(BASE_CHAR_FIELD, <<"bas">>).
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -75,7 +83,9 @@
[
new/4,
resolve/2,
- to_unresolved/1
+ to_unresolved/1,
+ decode/1,
+ encode/1
]
).
@@ -247,3 +257,30 @@ get_is_active_field () -> #btl_char_ref.is_active.
get_is_defeated_field () -> #btl_char_ref.is_defeated.
-spec get_base_character_field() -> non_neg_integer().
get_base_character_field () -> #btl_char_ref.base.
+
+-spec decode (map()) -> unresolved().
+decode (Map) ->
+ #btl_char_ref
+ {
+ player_ix = maps:get(?PLAYER_IX_FIELD, Map),
+ rank = maps:get(?RANK_FIELD, Map),
+ location = shr_location:decode(maps:get(?LOCATION_FIELD, Map)),
+ current_health = maps:get(?CURRENT_HEALTH_FIELD, Map),
+ is_active = maps:get(?IS_ACTIVE_FIELD, Map),
+ is_defeated = maps:get(?IS_DEFEATED_FIELD, Map),
+ base = shr_character:decode(maps:get(?BASE_CHAR_FIELD, Map))
+ }.
+
+-spec encode (unresolved()) -> unresolved().
+encode (CharRef) ->
+ {
+ [
+ {?PLAYER_IX_FIELD, CharRef#btl_char_ref.player_ix},
+ {?RANK_FIELD, CharRef#btl_char_ref.rank},
+ {?LOCATION_FIELD, shr_location:encode(CharRef#btl_char_ref.location)},
+ {?CURRENT_HEALTH_FIELD, CharRef#btl_char_ref.current_health},
+ {?IS_ACTIVE_FIELD, CharRef#btl_char_ref.is_active},
+ {?IS_DEFEATED_FIELD, CharRef#btl_char_ref.is_defeated},
+ {?BASE_CHAR_FIELD, shr_character:encode(CharRef#btl_char_ref.base)}
+ ]
+ }.
diff --git a/src/battle/struct/btl_character_turn_data.erl b/src/battle/struct/btl_character_turn_data.erl
index 6742d1c..5f44f8a 100644
--- a/src/battle/struct/btl_character_turn_data.erl
+++ b/src/battle/struct/btl_character_turn_data.erl
@@ -10,7 +10,6 @@
dirty :: boolean(),
battle :: btl_battle:type(),
character :: btl_character:type(),
- character_current_data :: btl_character_current_data:type(),
character_ix :: non_neg_integer()
}
).
@@ -30,12 +29,10 @@
get_battle_is_dirty/1,
get_battle/1,
get_character/1,
- get_character_current_data/1,
get_character_ix/1,
set_battle/2,
- set_character/2,
- refresh_character_current_data/1
+ set_character/2
]
).
@@ -43,29 +40,43 @@
(
[
clean_battle/1,
- refreshr_character/1
+ refresh_character/1
]
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec resolve_character_at
+ (
+ btl_battle:type(),
+ non_neg_integer()
+ ) -> btl_charater:type().
+resolve_character_at (Battle, CharacterIX) ->
+ CharacterRef = btl_battle:get_character(CharacterIX, Battle),
+ Location = btl_character:get_location(CharacterRef),
+ Map = btl_battle:get_map(Battle),
+
+ TileInstance = shr_map:get_tile_instance(Location, Map),
+ TileClassID = shr_tile_instance:get_tile_id(TileInstance),
+ Tile = shr_tile:from_id(TileClassID),
+ TileOmnimods = shr_tile:get_omnimods(Tile),
+
+ Character = btl_character:resolve(TileOmnimods, CharacterRef),
+
+ Character.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec new (btl_battle:type(), non_neg_integer()) -> type().
new (Battle, CharacterIX) ->
- Character = btl_battle:get_character(CharacterIX, Battle),
- Map = btl_battle:get_map(Battle),
- CharacterCurrentData = btl_character_current_data:new(Character, Map),
#type
{
dirty = false,
battle = Battle,
- character = Character,
- character_current_data = CharacterCurrentData,
+ character = resolve_character_at(Battle, CharacterIX),
character_ix = CharacterIX
}.
@@ -78,9 +89,6 @@ get_battle (Data) -> Data#type.battle.
-spec get_character (type()) -> btl_character:type().
get_character (Data) -> Data#type.character.
--spec get_character_current_data (type()) -> btl_character_current_data:type().
-get_character_current_data (Data) -> Data#type.character_current_data.
-
-spec get_character_ix (type()) -> non_neg_integer().
get_character_ix (Data) -> Data#type.character_ix.
@@ -96,19 +104,6 @@ set_character (Character, Data) ->
character = Character
}.
--spec refresh_character_current_data (type()) -> type().
-refresh_character_current_data (Data) ->
- Battle = Data#type.battle,
- Character = Data#type.character,
- Map = btl_battle:get_map(Battle),
- CharacterCurrentData = btl_character_current_data:new(Character, Map),
-
- Data#type
- {
- character_current_data = CharacterCurrentData
- }.
-
-
-spec clean_battle (type()) -> type().
clean_battle (Data) ->
Data#type
@@ -123,15 +118,10 @@ clean_battle (Data) ->
)
}.
--spec refreshr_character (type()) -> type().
-refreshr_character (Data) ->
+-spec refresh_character (type()) -> type().
+refresh_character (Data) ->
Data#type
{
dirty = false,
- character =
- btl_battle:get_character
- (
- Data#type.character_ix,
- Data#type.battle
- )
+ character = resolve_character_at(Data#type.battle, Data#type.character_ix)
}.
diff --git a/src/battle/reply/btl_add_armor.erl b/src/shared/reply/shr_add_armor.erl
index d78edc5..e4a97b0 100644
--- a/src/battle/reply/btl_add_armor.erl
+++ b/src/shared/reply/shr_add_armor.erl
@@ -1,4 +1,4 @@
--module(btl_add_armor).
+-module(shr_add_armor).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/src/battle/reply/btl_add_portrait.erl b/src/shared/reply/shr_add_portrait.erl
index a634a04..7c031b4 100644
--- a/src/battle/reply/btl_add_portrait.erl
+++ b/src/shared/reply/shr_add_portrait.erl
@@ -1,4 +1,4 @@
--module(btl_add_portrait).
+-module(shr_add_portrait).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/src/battle/reply/btl_add_weapon.erl b/src/shared/reply/shr_add_weapon.erl
index 964c6ef..44a83dd 100644
--- a/src/battle/reply/btl_add_weapon.erl
+++ b/src/shared/reply/shr_add_weapon.erl
@@ -1,4 +1,4 @@
--module(btl_add_weapon).
+-module(shr_add_weapon).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/src/shared/struct/inventory/shr_equipment.erl b/src/shared/struct/inventory/shr_equipment.erl
index f5eba8f..e505d91 100644
--- a/src/shared/struct/inventory/shr_equipment.erl
+++ b/src/shared/struct/inventory/shr_equipment.erl
@@ -56,6 +56,13 @@
set_glyph_board/2,
set_glyphs/2,
+ ataxia_set_primary_weapon/2,
+ ataxia_set_secondary_weapon/2,
+ ataxia_set_armor/2,
+ ataxia_set_portrait/2,
+ ataxia_set_glyph_board/2,
+ ataxia_set_glyphs/2,
+
get_primary_weapon_id/1,
get_secondary_weapon_id/1,
get_armor_id/1,
@@ -68,16 +75,30 @@
set_armor_id/2,
set_portrait_id/2,
set_glyph_board_id/2,
- set_glyph_ids/2
+ set_glyph_ids/2,
+
+ ataxia_set_primary_weapon_id/2,
+ ataxia_set_secondary_weapon_id/2,
+ ataxia_set_armor_id/2,
+ ataxia_set_portrait_id/2,
+ ataxia_set_glyph_board_id/2,
+ ataxia_set_glyph_ids/2
]
).
-%%%% Accessors
+%%%%
-export
(
[
default/0,
- default_unresolved/0
+ default_unresolved/0,
+
+ get_primary_weapon_field/0,
+ get_secondary_weapon_field/0,
+ get_armor_field/0,
+ get_portrait_field/0,
+ get_glyph_board_field/0,
+ get_glyphs_field/0
]
).
@@ -144,6 +165,19 @@ set_primary_weapon (V, Eq) when is_record(Eq, shr_eq) ->
set_primary_weapon (V, Eq) when is_record(Eq, shr_eq_ref) ->
Eq#shr_eq_ref{ primary = shr_weapon:get_id(V) }.
+-spec ataxia_set_primary_weapon
+ (shr_weapon:type(), type()) -> {type(), ataxic:basic()};
+ (shr_weapon:type(), unresolved()) -> {unresolved(), ataxic:basic()}.
+ataxia_set_primary_weapon (V, Eq) ->
+ {
+ set_primary_weapon(V, Eq),
+ ataxic:update_field
+ (
+ get_primary_weapon_field(),
+ ataxic:constant(shr_weapon:get_id(V))
+ )
+ }.
+
-spec set_secondary_weapon
(shr_weapon:type(), type()) -> type();
(shr_weapon:type(), unresolved()) -> unresolved().
@@ -152,6 +186,19 @@ set_secondary_weapon (V, Eq) when is_record(Eq, shr_eq) ->
set_secondary_weapon (V, Eq) when is_record(Eq, shr_eq_ref) ->
Eq#shr_eq_ref{ secondary = shr_weapon:get_id(V) }.
+-spec ataxia_set_secondary_weapon
+ (shr_weapon:type(), type()) -> {type(), ataxic:basic()};
+ (shr_weapon:type(), unresolved()) -> {unresolved(), ataxic:basic()}.
+ataxia_set_secondary_weapon (V, Eq) ->
+ {
+ set_secondary_weapon(V, Eq),
+ ataxic:update_field
+ (
+ get_secondary_weapon_field(),
+ ataxic:constant(shr_weapon:get_id(V))
+ )
+ }.
+
-spec set_armor
(shr_armor:type(), type()) -> type();
(shr_armor:type(), unresolved()) -> unresolved().
@@ -160,6 +207,19 @@ set_armor (V, Eq) when is_record(Eq, shr_eq) ->
set_armor (V, Eq) when is_record(Eq, shr_eq_ref) ->
Eq#shr_eq_ref{ armor = shr_armor:get_id(V) }.
+-spec ataxia_set_armor
+ (shr_armor:type(), type()) -> {type(), ataxic:basic()};
+ (shr_armor:type(), unresolved()) -> {unresolved(), ataxic:basic()}.
+ataxia_set_armor (V, Eq) ->
+ {
+ set_armor(V, Eq),
+ ataxic:update_field
+ (
+ get_armor_field(),
+ ataxic:constant(shr_armor:get_id(V))
+ )
+ }.
+
-spec set_portrait
(shr_portrait:type(), type()) -> type();
(shr_portrait:type(), unresolved()) -> unresolved().
@@ -168,6 +228,19 @@ set_portrait (V, Eq) when is_record(Eq, shr_eq) ->
set_portrait (V, Eq) when is_record(Eq, shr_eq_ref) ->
Eq#shr_eq_ref{ portrait = shr_portrait:get_id(V) }.
+-spec ataxia_set_portrait
+ (shr_portrait:type(), type()) -> {type(), ataxic:basic()};
+ (shr_portrait:type(), unresolved()) -> {unresolved(), ataxic:basic()}.
+ataxia_set_portrait (V, Eq) ->
+ {
+ set_portrait(V, Eq),
+ ataxic:update_field
+ (
+ get_portrait_field(),
+ ataxic:constant(shr_portrait:get_id(V))
+ )
+ }.
+
-spec set_glyph_board
(shr_glyph_board:type(), type()) -> type();
(shr_glyph_board:type(), unresolved()) -> unresolved().
@@ -176,6 +249,19 @@ set_glyph_board (V, Eq) when is_record(Eq, shr_eq) ->
set_glyph_board (V, Eq) when is_record(Eq, shr_eq_ref) ->
Eq#shr_eq_ref{ glyph_board = shr_glyph_board:get_id(V) }.
+-spec ataxia_set_glyph_board
+ (shr_glyph_board:type(), type()) -> {type(), ataxic:basic()};
+ (shr_glyph_board:type(), unresolved()) -> {unresolved(), ataxic:basic()}.
+ataxia_set_glyph_board (V, Eq) ->
+ {
+ set_glyph_board(V, Eq),
+ ataxic:update_field
+ (
+ get_glyph_board_field(),
+ ataxic:constant(shr_glyph_board:get_id(V))
+ )
+ }.
+
-spec set_glyphs
(list(shr_glyph:type()), type()) -> type();
(list(shr_glyph:type()), unresolved()) -> unresolved().
@@ -184,6 +270,19 @@ set_glyphs (V, Eq) when is_record(Eq, shr_eq) ->
set_glyphs (V, Eq) when is_record(Eq, shr_eq_ref) ->
Eq#shr_eq_ref{ glyphs = lists:map(fun shr_glyph:get_id/1, V) }.
+-spec ataxia_set_glyphs
+ (shr_glyph:type(), type()) -> {type(), ataxic:basic()};
+ (shr_glyph:type(), unresolved()) -> {unresolved(), ataxic:basic()}.
+ataxia_set_glyphs (V, Eq) ->
+ {
+ set_glyphs(V, Eq),
+ ataxic:update_field
+ (
+ get_glyphs_field(),
+ ataxic:constant(shr_glyph:get_id(V))
+ )
+ }.
+
-spec set_primary_weapon_id
(shr_weapon:id(), type()) -> type();
(shr_weapon:id(), unresolved()) -> unresolved().
@@ -192,6 +291,19 @@ set_primary_weapon_id (V, Eq) when is_record(Eq, shr_eq_ref) ->
set_primary_weapon_id (V, Eq) when is_record(Eq, shr_eq) ->
Eq#shr_eq{ primary = shr_weapon:from_id(V) }.
+-spec ataxia_set_primary_weapon_id
+ (shr_weapon:id(), type()) -> {type(), ataxic:basic()};
+ (shr_weapon:id(), unresolved()) -> {unresolved(), ataxic:basic()}.
+ataxia_set_primary_weapon_id (V, Eq) ->
+ {
+ set_primary_weapon_id(V, Eq),
+ ataxic:update_field
+ (
+ get_primary_weapon_field(),
+ ataxic:constant(V)
+ )
+ }.
+
-spec set_secondary_weapon_id
(shr_weapon:id(), type()) -> type();
(shr_weapon:id(), unresolved()) -> unresolved().
@@ -200,6 +312,19 @@ set_secondary_weapon_id (V, Eq) when is_record(Eq, shr_eq_ref) ->
set_secondary_weapon_id (V, Eq) when is_record(Eq, shr_eq) ->
Eq#shr_eq{ secondary = shr_weapon:from_id(V) }.
+-spec ataxia_set_secondary_weapon_id
+ (shr_weapon:id(), type()) -> {type(), ataxic:basic()};
+ (shr_weapon:id(), unresolved()) -> {unresolved(), ataxic:basic()}.
+ataxia_set_secondary_weapon_id (V, Eq) ->
+ {
+ set_secondary_weapon_id(V, Eq),
+ ataxic:update_field
+ (
+ get_secondary_weapon_field(),
+ ataxic:constant(V)
+ )
+ }.
+
-spec set_armor_id
(shr_armor:id(), type()) -> type();
(shr_armor:id(), unresolved()) -> unresolved().
@@ -208,6 +333,19 @@ set_armor_id (V, Eq) when is_record(Eq, shr_eq_ref) ->
set_armor_id (V, Eq) when is_record(Eq, shr_eq) ->
Eq#shr_eq{ armor = shr_armor:from_id(V) }.
+-spec ataxia_set_armor_id
+ (shr_armor:id(), type()) -> {type(), ataxic:basic()};
+ (shr_armor:id(), unresolved()) -> {unresolved(), ataxic:basic()}.
+ataxia_set_armor_id (V, Eq) ->
+ {
+ set_armor_id(V, Eq),
+ ataxic:update_field
+ (
+ get_armor_field(),
+ ataxic:constant(V)
+ )
+ }.
+
-spec set_portrait_id
(shr_portrait:id(), type()) -> type();
(shr_portrait:id(), unresolved()) -> unresolved().
@@ -216,6 +354,19 @@ set_portrait_id (V, Eq) when is_record(Eq, shr_eq_ref) ->
set_portrait_id (V, Eq) when is_record(Eq, shr_eq) ->
Eq#shr_eq{ portrait = shr_portrait:from_id(V) }.
+-spec ataxia_set_portrait_id
+ (shr_portrait:id(), type()) -> {type(), ataxic:basic()};
+ (shr_portrait:id(), unresolved()) -> {unresolved(), ataxic:basic()}.
+ataxia_set_portrait_id (V, Eq) ->
+ {
+ set_portrait_id(V, Eq),
+ ataxic:update_field
+ (
+ get_portrait_field(),
+ ataxic:constant(V)
+ )
+ }.
+
-spec set_glyph_board_id
(shr_glyph_board:id(), type()) -> type();
(shr_glyph_board:id(), unresolved()) -> unresolved().
@@ -224,6 +375,19 @@ set_glyph_board_id (V, Eq) when is_record(Eq, shr_eq_ref) ->
set_glyph_board_id (V, Eq) when is_record(Eq, shr_eq) ->
Eq#shr_eq{ glyph_board = shr_glyph_board:from_id(V) }.
+-spec ataxia_set_glyph_board_id
+ (shr_glyph_board:id(), type()) -> {type(), ataxic:basic()};
+ (shr_glyph_board:id(), unresolved()) -> {unresolved(), ataxic:basic()}.
+ataxia_set_glyph_board_id (V, Eq) ->
+ {
+ set_glyph_board_id(V, Eq),
+ ataxic:update_field
+ (
+ get_glyph_board_field(),
+ ataxic:constant(V)
+ )
+ }.
+
-spec set_glyph_ids
(list(shr_glyph:id()), type()) -> type();
(list(shr_glyph:id()), unresolved()) -> unresolved().
@@ -232,6 +396,19 @@ set_glyph_ids (V, Eq) when is_record(Eq, shr_eq_ref) ->
set_glyph_ids (V, Eq) when is_record(Eq, shr_eq) ->
Eq#shr_eq{ glyphs = lists:map(fun shr_glyph:from_id/1, V) }.
+-spec ataxia_set_glyph_ids
+ (shr_glyph:id(), type()) -> {type(), ataxic:basic()};
+ (shr_glyph:id(), unresolved()) -> {unresolved(), ataxic:basic()}.
+ataxia_set_glyph_ids (V, Eq) ->
+ {
+ set_glyph_ids(V, Eq),
+ ataxic:update_field
+ (
+ get_glyphs_field(),
+ ataxic:constant(V)
+ )
+ }.
+
-spec default () -> type().
default () ->
#shr_eq
@@ -255,3 +432,21 @@ default_unresolved () ->
glyph_board = shr_glyph_board:default_id(),
glyphs = []
}.
+
+-spec get_primary_weapon_field () -> non_neg_integer().
+get_primary_weapon_field () -> #shr_eq_ref.primary.
+
+-spec get_secondary_weapon_field () -> non_neg_integer().
+get_secondary_weapon_field () -> #shr_eq_ref.secondary.
+
+-spec get_armor_field () -> non_neg_integer().
+get_armor_field () -> #shr_eq_ref.armor.
+
+-spec get_portrait_field () -> non_neg_integer().
+get_portrait_field () -> #shr_eq_ref.portrait.
+
+-spec get_glyph_board_field () -> non_neg_integer().
+get_glyph_board_field () -> #shr_eq_ref.glyph_board.
+
+-spec get_glyphs_field () -> non_neg_integer().
+get_glyphs_field () -> #shr_eq_ref.glyphs.
diff --git a/src/shared/struct/inventory/shr_inventory.erl b/src/shared/struct/inventory/shr_inventory.erl
index 0670546..4f64f68 100644
--- a/src/shared/struct/inventory/shr_inventory.erl
+++ b/src/shared/struct/inventory/shr_inventory.erl
@@ -32,11 +32,17 @@
get_glyph_boards/1,
get_glyphs/1,
- set_weapons/2,
- set_armors/2,
- set_portraits/2,
- set_glyph_boards/2,
- set_glyphs/2
+ add_weapon/2,
+ add_armor/2,
+ add_portrait/2,
+ add_glyph_board/2,
+ add_glyph/2,
+
+ ataxia_add_armor/2,
+ ataxia_add_weapon/2,
+ ataxia_add_portrait/2,
+ ataxia_add_glyph_board/2,
+ ataxia_add_glyph/2
]
).
@@ -46,7 +52,8 @@
[
default/0,
allows_equipment/2,
- add_equipment/2
+ add_equipment/2,
+ ataxia_add_equipment/2
]
).
@@ -72,20 +79,164 @@ get_glyph_boards (Inv) -> Inv#inventory.glyph_boards.
-spec get_glyphs (type()) -> ordsets:ordset(shr_glyph:id()).
get_glyphs (Inv) -> Inv#inventory.glyphs.
--spec set_weapons (ordsets:ordset(shr_weapon:id()), type()) -> type().
-set_weapons (V, Inv) -> Inv#inventory{ weapons = V }.
--spec set_armors (ordsets:ordset(shr_armor:id()), type()) -> type().
-set_armors (V, Inv) -> Inv#inventory{ armors = V }.
+-spec add_weapon (shr_weapon:id(), type()) -> type().
+add_weapon (V, Inv) -> Inv#inventory{ weapons = V }.
+
+-spec add_armor (shr_armor:id(), type()) -> type().
+add_armor (V, Inv) -> Inv#inventory{ armors = V }.
+
+-spec add_portrait (shr_portrait:id(), type()) -> type().
+add_portrait (V, Inv) -> Inv#inventory{ portraits = V }.
+
+-spec add_glyph_board (shr_glyph_board:id(), type()) -> type().
+add_glyph_board (V, Inv) -> Inv#inventory{ glyph_boards = V }.
+
+-spec add_glyph (shr_glyph:id(), type()) -> type().
+add_glyph (V, Inv) -> Inv#inventory{ glyphs = V }.
+
+
+-spec ataxia_add_weapon
+ (
+ shr_weapon:id(),
+ type()
+ )
+ -> {type(), list(ataxic:basic())}.
+ataxia_add_weapon (V, Inv) ->
+ CurrentWeapons = Inv#inventory.weapons,
--spec set_portraits (ordsets:ordset(shr_portrait:id()), type()) -> type().
-set_portraits (V, Inv) -> Inv#inventory{ portraits = V }.
+ case ordsets:is_element(V, CurrentWeapons) of
+ true -> Inv;
+ false ->
+ {
+ Inv#inventory{ weapons = ordsets:add_element(V, CurrentWeapons) },
+ ataxic:update_field
+ (
+ get_weapons_field(),
+ ataxic:apply_function
+ (
+ ordsets,
+ add_element,
+ [ ataxic:constant(V), ataxic:current_value() ]
+ )
+ )
+ }
+ end.
--spec set_glyph_boards (ordsets:ordset(shr_glyph_board:id()), type()) -> type().
-set_glyph_boards (V, Inv) -> Inv#inventory{ glyph_boards = V }.
+-spec ataxia_add_armor
+ (
+ shr_armor:id(),
+ type()
+ )
+ -> {type(), list(ataxic:basic())}.
+ataxia_add_armor (V, Inv) ->
+ CurrentArmors = Inv#inventory.armors,
+
+ case ordsets:is_element(V, CurrentArmors) of
+ true -> Inv;
+ false ->
+ {
+ Inv#inventory{ armors = ordsets:add_element(V, CurrentArmors) },
+ ataxic:update_field
+ (
+ get_armors_field(),
+ ataxic:apply_function
+ (
+ ordsets,
+ add_element,
+ [ ataxic:constant(V), ataxic:current_value() ]
+ )
+ )
+ }
+ end.
+
+-spec ataxia_add_portrait
+ (
+ shr_portrait:id(),
+ type()
+ )
+ -> {type(), list(ataxic:basic())}.
+ataxia_add_portrait (V, Inv) ->
+ CurrentPortraits = Inv#inventory.portraits,
+
+ case ordsets:is_element(V, CurrentPortraits) of
+ true -> Inv;
+ false ->
+ {
+ Inv#inventory
+ {
+ portraits = ordsets:add_element(V, CurrentPortraits)
+ },
+ ataxic:update_field
+ (
+ get_portraits_field(),
+ ataxic:apply_function
+ (
+ ordsets,
+ add_element,
+ [ ataxic:constant(V), ataxic:current_value() ]
+ )
+ )
+ }
+ end.
+
+-spec ataxia_add_glyph_board
+ (
+ shr_glyph_board:id(),
+ type()
+ )
+ -> {type(), list(ataxic:basic())}.
+ataxia_add_glyph_board (V, Inv) ->
+ CurrentGlyphBoards = Inv#inventory.glyph_boards,
+
+ case ordsets:is_element(V, CurrentGlyphBoards) of
+ true -> Inv;
+ false ->
+ {
+ Inv#inventory
+ {
+ glyph_boards = ordsets:add_element(V, CurrentGlyphBoards)
+ },
+ ataxic:update_field
+ (
+ get_glyph_boards_field(),
+ ataxic:apply_function
+ (
+ ordsets,
+ add_element,
+ [ ataxic:constant(V), ataxic:current_value() ]
+ )
+ )
+ }
+ end.
+
+-spec ataxia_add_glyph
+ (
+ shr_glyph:id(),
+ type()
+ )
+ -> {type(), list(ataxic:basic())}.
+ataxia_add_glyph (V, Inv) ->
+ CurrentGlyphs = Inv#inventory.glyphs,
+
+ case ordsets:is_element(V, CurrentGlyphs) of
+ true -> Inv;
+ false ->
+ {
+ Inv#inventory{ glyphs = ordsets:add_element(V, CurrentGlyphs) },
+ ataxic:update_field
+ (
+ get_glyphs_field(),
+ ataxic:apply_function
+ (
+ ordsets,
+ add_element,
+ [ ataxic:constant(V), ataxic:current_value() ]
+ )
+ )
+ }
+ end.
--spec set_glyphs (ordsets:ordset(shr_glyph:id()), type()) -> type().
-set_glyphs (V, Inv) -> Inv#inventory{ glyphs = V }.
-spec default () -> type().
default () ->
@@ -183,3 +334,57 @@ add_equipment (Eq, Inv) ->
shr_equipment:get_glyph_ids(Eq)
)
}.
+
+-spec ataxia_add_equipment
+ (
+ (shr_equipment:type()|shr_equipment:unresolved()),
+ type()
+ )
+ -> {type(), list(ataxic:basic())}.
+ataxia_add_equipment (Eq, Inv) ->
+ {S0Inv, Ataxic0} =
+ ataxia_add_weapon(shr_equipment:get_primary_weapon_id(Eq), Inv),
+
+ {S1Inv, Ataxic1} =
+ ataxia_add_weapon(shr_equipment:get_secondary_weapon_id(Eq), S0Inv),
+
+ {S2Inv, Ataxic2} = ataxia_add_armor(shr_equipment:get_armor_id(Eq), S1Inv),
+
+ {S3Inv, Ataxic3} =
+ ataxia_add_glyph_board(shr_equipment:get_glyph_board_id(Eq), S2Inv),
+
+ {S4Inv, Ataxic4s} =
+ lists:foldl
+ (
+ fun (GlyphID, {PrevInv, PrevAtaxic}) ->
+ {NewInv, NewAtaxic} = ataxia_add_glyph(GlyphID, PrevInv),
+ {NewInv, [NewAtaxic|PrevAtaxic]}
+ end,
+ {S3Inv, []},
+ shr_equipment:get_glyph_ids(Eq)
+ ),
+
+ {
+ S4Inv,
+ lists:flatten
+ (
+ [Ataxic0, Ataxic1, Ataxic2, Ataxic3],
+ lists:flatten(Ataxic4s)
+ )
+ }.
+
+
+-spec get_weapons_field () -> non_neg_integer().
+get_weapons_field () -> #inventory.weapons.
+
+-spec get_armors_field () -> non_neg_integer().
+get_armors_field () -> #inventory.armors.
+
+-spec get_portraits_field () -> non_neg_integer().
+get_portraits_field () -> #inventory.portraits.
+
+-spec get_glyph_boards_field () -> non_neg_integer().
+get_glyph_boards_field () -> #inventory.glyph_boards.
+
+-spec get_glyphs_field () -> non_neg_integer().
+get_glyphs_field () -> #inventory.glyphs.