summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2019-04-26 17:45:48 +0200
committernsensfel <SpamShield0@noot-noot.org>2019-04-26 17:45:48 +0200
commita7c6455285cfd3a671078be4e58df0afae07bf0c (patch)
treeb06531c2423e0fa6a1f60ace83b5e03a40067262 /src/roster
parentec6eec260d6383ae948505c3d42b3055ae3dd94c (diff)
...
Diffstat (limited to 'src/roster')
-rw-r--r--src/roster/query/rst_update.erl37
-rw-r--r--src/roster/reply/rst_add_char.erl12
-rw-r--r--src/roster/struct/rst_character.erl239
-rw-r--r--src/roster/struct/rst_roster.erl75
4 files changed, 85 insertions, 278 deletions
diff --git a/src/roster/query/rst_update.erl b/src/roster/query/rst_update.erl
index bbae76e..933c52c 100644
--- a/src/roster/query/rst_update.erl
+++ b/src/roster/query/rst_update.erl
@@ -3,7 +3,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--type decoded_character() :: {non_neg_integer(), rst_character:type()}.
+-type decoded_character() :: {non_neg_integer(), shr_character:unresolved()}.
-record
(
@@ -41,7 +41,7 @@ decode_character_list (EncodedCharactersList) ->
lists:map
(
fun (Map) ->
- {maps:get(<<"ix">>, Map), rst_character:decode(Map)}
+ {maps:get(<<"ix">>, Map), shr_character:decode(Map)}
end,
EncodedCharactersList
).
@@ -102,15 +102,19 @@ update_data (QueryState, Input) ->
Inventory = QueryState#query_state.inventory,
Characters = Input#input.characters,
- lists:map
+ %% TODO: Assert true, once inventories are put in place.
+ lists:all
(
fun ({_IX, Character}) ->
- rst_character:validate(Inventory, Character)
+ shr_inventory:allows_equipment
+ (
+ shr_character:get_equipment(Character),
+ Inventory
+ )
end,
Characters
),
- %% TODO [FUNCTION: chr][REQUIRED]: unimplemented.
QueryState.
-spec commit_update (query_state(), input()) -> 'ok'.
@@ -122,21 +126,14 @@ commit_update (QueryState, Input) ->
RosterID = shr_player:get_roster_id(Player),
- {UpdatedRoster, QueryList} =
+ {UpdatedRoster, RosterAtaxiaUpdates} =
lists:foldl
(
fun ({IX, Character}, {CurrentRoster, UpdateList}) ->
- {
- rst_roster:set_character(IX, Character, CurrentRoster),
- [
- ataxic_sugar:update_orddict_element
- (
- IX,
- ataxic:constant(Character)
- )
- | UpdateList
- ]
- }
+ {UpdatedRoster, NewUpdate} =
+ rst_roster:ataxia_set_character(IX, Character, CurrentRoster),
+
+ {UpdatedRoster, [NewUpdate|UpdateList]}
end,
{Roster, []},
Characters
@@ -149,11 +146,7 @@ commit_update (QueryState, Input) ->
ataxia_security:user_from_id(PlayerID),
ataxic:update_value
(
- ataxic:update_field
- (
- rst_roster:get_characters_field(),
- ataxic:sequence(QueryList)
- )
+ ataxic:optimize(ataxic:sequence(RosterAtaxiaUpdates))
),
RosterID
),
diff --git a/src/roster/reply/rst_add_char.erl b/src/roster/reply/rst_add_char.erl
index 0f360ed..d759383 100644
--- a/src/roster/reply/rst_add_char.erl
+++ b/src/roster/reply/rst_add_char.erl
@@ -19,22 +19,14 @@
-spec generate
(
non_neg_integer(),
- rst_character:type()
+ shr_character:unresolved()
)
-> {list(any())}.
generate (IX, Character) ->
- {ActiveWeapon, SecondaryWeapon} = rst_character:get_weapon_ids(Character),
-
{
[
{<<"msg">>, <<"add_char">>},
{<<"ix">>, IX},
- {<<"nam">>, rst_character:get_name(Character)},
- {<<"prt">>, rst_character:get_portrait_id(Character)},
- {<<"awp">>, ActiveWeapon},
- {<<"swp">>, SecondaryWeapon},
- {<<"ar">>, rst_character:get_armor_id(Character)},
- {<<"gls">>, rst_character:get_glyph_ids(Character)},
- {<<"gb">>, rst_character:get_glyph_board_id(Character)}
+ {<<"bas">>, shr_character:encode(Character)}
]
}.
diff --git a/src/roster/struct/rst_character.erl b/src/roster/struct/rst_character.erl
deleted file mode 100644
index 61d7b7e..0000000
--- a/src/roster/struct/rst_character.erl
+++ /dev/null
@@ -1,239 +0,0 @@
--module(rst_character).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--record
-(
- rst_char,
- {
- name :: binary(),
- portrait_id :: shr_portrait:id(),
- weapon_ids :: {shr_weapon:id(), shr_weapon:id()},
- armor_id :: shr_armor:id(),
- glyph_ids :: list(shr_glyph:id()),
- glyph_board_id :: shr_glyph_board:id()
- }
-).
-
--opaque type() :: #rst_char{}.
-
--export_type([type/0]).
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%% Accessors
--export
-(
- [
- get_name/1,
- get_portrait_id/1,
- get_weapon_ids/1,
- get_armor_id/1,
- get_glyph_ids/1,
- get_glyph_board_id/1,
-
- set_name/2,
- set_portrait_id/2,
- set_weapon_ids/2,
- set_armor_id/2,
- set_glyph_ids/2,
- set_glyph_board_id/2,
-
- get_name_field/0,
- get_portrait_id_field/0,
- get_weapon_ids_field/0,
- get_armor_id_field/0,
- get_glyph_ids_field/0,
- get_glyph_board_id_field/0
- ]
-).
-
--export
-(
- [
- decode/1,
- new/0
- ]
-).
-
--export
-(
- [
- validate/2
- ]
-).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec validate_name (binary()) -> ok.
-validate_name (_Name) ->
- % TODO [SECURITY][LOW]: unimplemented
- ok.
-
--spec validate_portrait_id (shr_inventory:type(), shr_portrait:id()) -> ok.
-validate_portrait_id (_Inventory, _Portrait) ->
- % TODO [SECURITY][LOW]: unimplemented
- ok.
-
--spec validate_weapons
- (
- shr_inventory:type(),
- {shr_weapon:id(), shr_weapon:id()}
- )
- -> ok.
-validate_weapons (_Inventory, {_ActiveWeapon, _SecondaryWeapon}) ->
- % TODO [SECURITY][LOW]: unimplemented
- ok.
-
--spec validate_armor (shr_inventory:type(), shr_armor:id()) -> ok.
-validate_armor (_Inventory, _Armor) ->
- % TODO [SECURITY][LOW]: unimplemented
- ok.
-
--spec validate_glyphs (shr_inventory:type(), list(shr_glyph:id())) -> ok.
-validate_glyphs (_Inventory, _Glyphs) ->
- % TODO [SECURITY][LOW]: unimplemented
- ok.
-
--spec validate_glyph_board (shr_inventory:type(), shr_glyph_board:id()) -> ok.
-validate_glyph_board (_Inventory, _GlyphBoard) ->
- % TODO [SECURITY][LOW]: unimplemented
- ok.
-
--spec validate_glyphs_on_board
- (
- list(shr_glyph:id()),
- shr_glyph_board:id()
- )
- -> ok.
-validate_glyphs_on_board (_Glyphs, _GlyphBoard) ->
- % TODO [SECURITY][LOW]: unimplemented
- ok.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%% Accessors
--spec get_name (type()) -> binary().
-get_name (Char) -> Char#rst_char.name.
-
--spec get_portrait_id (type()) -> shr_portrait:id().
-get_portrait_id (Char) -> Char#rst_char.portrait_id.
-
--spec get_weapon_ids (type()) -> {shr_weapon:id(), shr_weapon:id()}.
-get_weapon_ids (Char) -> Char#rst_char.weapon_ids.
-
--spec get_armor_id (type()) -> shr_armor:id().
-get_armor_id (Char) -> Char#rst_char.armor_id.
-
--spec get_glyph_ids (type()) -> list(shr_glyph:id()).
-get_glyph_ids (Char) -> Char#rst_char.glyph_ids.
-
--spec get_glyph_board_id (type()) -> shr_glyph_board:id().
-get_glyph_board_id (Char) -> Char#rst_char.glyph_board_id.
-
-
--spec set_name (binary(), type()) -> type().
-set_name (Name, Char) ->
- Char#rst_char
- {
- name = Name
- }.
-
--spec set_portrait_id (shr_portrait:id(), type()) -> type().
-set_portrait_id (PortraitID, Char) ->
- Char#rst_char
- {
- portrait_id = PortraitID
- }.
-
--spec set_armor_id (shr_armor:id(), type()) -> type().
-set_armor_id (ArmorID, Char) ->
- Char#rst_char
- {
- armor_id = ArmorID
- }.
-
--spec set_weapon_ids ({shr_weapon:id(), shr_weapon:id()}, type()) -> type().
-set_weapon_ids (WeaponIDs, Char) ->
- Char#rst_char
- {
- weapon_ids = WeaponIDs
- }.
-
--spec set_glyph_ids (list(shr_glyph:id()), type()) -> type().
-set_glyph_ids (GlyphIDs, Char) ->
- Char#rst_char
- {
- glyph_ids = GlyphIDs
- }.
-
--spec set_glyph_board_id (shr_glyph_board:id(), type()) -> type().
-set_glyph_board_id (GlyphBoardID, Char) ->
- Char#rst_char
- {
- glyph_board_id = GlyphBoardID
- }.
-
--spec new () -> type().
-new () ->
- UnarmedID = shr_weapon:get_id(shr_weapon:none()),
- #rst_char
- {
- name = <<"Nameless">>,
- portrait_id = shr_portrait:get_id(shr_portrait:default()),
- weapon_ids = {UnarmedID, UnarmedID},
- armor_id = shr_armor:get_id(shr_armor:none()),
- glyph_ids = [],
- glyph_board_id = shr_glyph_board:get_id(shr_glyph_board:none())
- }.
-
--spec get_name_field () -> non_neg_integer().
-get_name_field () -> #rst_char.name.
--spec get_portrait_id_field () -> non_neg_integer().
-get_portrait_id_field () -> #rst_char.portrait_id.
--spec get_armor_id_field () -> non_neg_integer().
-get_armor_id_field () -> #rst_char.armor_id.
--spec get_weapon_ids_field () -> non_neg_integer().
-get_weapon_ids_field () -> #rst_char.weapon_ids.
--spec get_glyph_ids_field () -> non_neg_integer().
-get_glyph_ids_field () -> #rst_char.glyph_ids.
--spec get_glyph_board_id_field () -> non_neg_integer().
-get_glyph_board_id_field () -> #rst_char.glyph_board_id.
-
--spec decode (map()) -> type().
-decode (JSONReqMap) ->
- Name = maps:get(<<"nam">>, JSONReqMap),
- Portrait = maps:get(<<"prt">>, JSONReqMap),
- ActiveWeapon = maps:get(<<"awp">>, JSONReqMap),
- SecondaryWeapon = maps:get(<<"swp">>, JSONReqMap),
- Armor = maps:get(<<"ar">>, JSONReqMap),
- GlyphsList = maps:get(<<"gls">>, JSONReqMap),
- GlyphBoard = maps:get(<<"gb">>, JSONReqMap),
-
- #rst_char
- {
- name = Name,
- portrait_id = Portrait,
- weapon_ids = {ActiveWeapon, SecondaryWeapon},
- armor_id = Armor,
- glyph_ids = GlyphsList,
- glyph_board_id = GlyphBoard
- }.
-
--spec validate (shr_inventory:type(), type()) -> ok.
-validate (Inventory, Character) ->
- Glyphs = Character#rst_char.glyph_ids,
- GlyphBoard = Character#rst_char.glyph_board_id,
-
- validate_name(Character#rst_char.name),
- validate_portrait_id(Inventory, Character#rst_char.portrait_id),
- validate_weapons(Inventory, Character#rst_char.weapon_ids),
- validate_armor(Inventory, Character#rst_char.armor_id),
- validate_glyphs(Inventory, Glyphs),
- validate_glyph_board(Inventory, GlyphBoard),
- validate_glyphs_on_board(Glyphs, GlyphBoard),
-
- ok.
diff --git a/src/roster/struct/rst_roster.erl b/src/roster/struct/rst_roster.erl
index 90b2f98..ec28db0 100644
--- a/src/roster/struct/rst_roster.erl
+++ b/src/roster/struct/rst_roster.erl
@@ -10,7 +10,8 @@
roster,
{
owner :: binary(),
- characters :: orddict:orddict(non_neg_integer(), rst_character:type())
+ characters ::
+ orddict:orddict(non_neg_integer(), shr_character:unresolved())
}
).
@@ -30,7 +31,13 @@
get_character/2,
set_characters/2,
- set_character/3
+ set_character/3,
+
+ ataxia_set_characters/2,
+ ataxia_set_characters/3,
+
+ ataxia_set_character/3,
+ ataxia_set_character/4
]
).
@@ -63,24 +70,50 @@ get_owner (Roster) -> Roster#roster.owner.
(
type()
)
- -> orddict:orddict(non_neg_integer(), rst_character:type()).
+ -> orddict:orddict(non_neg_integer(), shr_character:unresolved()).
get_characters (Roster) -> Roster#roster.characters.
--spec get_character (non_neg_integer(), type()) -> rst_character:type().
+-spec get_character (non_neg_integer(), type()) -> shr_character:unresolved().
get_character (IX, Roster) -> orddict:fetch(IX, Roster#roster.characters).
-spec set_characters
(
- orddict:orddict(non_neg_integer(), rst_character:type()),
+ orddict:orddict(non_neg_integer(), shr_character:unresolved()),
type()
)
-> type().
set_characters (Characters, Roster) -> Roster#roster{ characters = Characters }.
+-spec ataxia_set_characters
+ (
+ orddict:orddict(non_neg_integer(), shr_character:unresolved()),
+ type()
+ )
+ -> {type(), ataxic:basic()}.
+ataxia_set_characters (Characters, Roster) ->
+ ataxia_set_characters(Characters, ataxic:constant(Characters), Roster).
+
+-spec ataxia_set_characters
+ (
+ orddict:orddict(non_neg_integer(), shr_character:unresolved()),
+ ataxic:basic(),
+ type()
+ )
+ -> {type(), ataxic:basic()}.
+ataxia_set_characters (Characters, CharactersAtaxiaUpdate, Roster) ->
+ {
+ set_characters(Characters, Roster),
+ ataxic:update_field
+ (
+ get_characters_field(),
+ CharactersAtaxiaUpdate
+ )
+ }.
+
-spec set_character
(
non_neg_integer(),
- rst_character:type(),
+ shr_character:unresolved(),
type()
)
-> type().
@@ -90,12 +123,40 @@ set_character (IX, Character, Roster) ->
characters = orddict:store(IX, Character, Roster#roster.characters)
}.
+-spec ataxia_set_character
+ (
+ non_neg_integer(),
+ shr_character:unresolved(),
+ type()
+ )
+ -> {type(), ataxic:basic()}.
+ataxia_set_character (IX, Character, Roster) ->
+ ataxia_set_character(IX, Character, ataxic:constant(Character), Roster).
+
+-spec ataxia_set_character
+ (
+ non_neg_integer(),
+ shr_character:unresolved(),
+ ataxic:basic(),
+ type()
+ )
+ -> {type(), ataxic:basic()}.
+ataxia_set_character (IX, Character, CharacterAtaxiaUpdate, Roster) ->
+ {
+ ataxia_set_character(IX, Character, Roster),
+ ataxic:update_field
+ (
+ get_characters_field(),
+ ataxic_sugar:update_orddict_element(IX, CharacterAtaxiaUpdate)
+ )
+ }.
+
-spec get_characters_field () -> non_neg_integer().
get_characters_field () -> #roster.characters.
-spec new (binary()) -> type().
new (Owner) ->
- NewChar = rst_character:new(),
+ NewChar = shr_character:new(),
#roster
{
owner = Owner,