| summaryrefslogtreecommitdiff | 
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2019-04-25 17:26:34 +0200 | 
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2019-04-25 17:26:34 +0200 | 
| commit | fa540d6d07e430789809435741e6cd1d98111c50 (patch) | |
| tree | 890c376b5684593f972ec81cf8c4fbf9455b8342 /src | |
| parent | 4fb024b4ee52ccbb9f25b17eaa606ce0b5e0296a (diff) | |
...
Diffstat (limited to 'src')
| -rw-r--r-- | src/battle/mechanic/btl_turn_actions_management.erl | 75 | ||||
| -rw-r--r-- | src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl | 47 | ||||
| -rw-r--r-- | src/battle/query/btl_character_turn.erl | 115 | ||||
| -rw-r--r-- | src/battle/struct/btl_character.erl | 37 | ||||
| -rw-r--r-- | src/battle/struct/btl_character_turn_update.erl | 10 | ||||
| -rw-r--r-- | src/shared/struct/shr_character.erl | 154 | 
6 files changed, 234 insertions, 204 deletions
| diff --git a/src/battle/mechanic/btl_turn_actions_management.erl b/src/battle/mechanic/btl_turn_actions_management.erl index 41d9821..d3a84bd 100644 --- a/src/battle/mechanic/btl_turn_actions_management.erl +++ b/src/battle/mechanic/btl_turn_actions_management.erl @@ -22,31 +22,19 @@     )     -> btl_character_turn_update:type().  deactivate_character (Update) -> -   Data = btl_character_turn_update:get_data(Update), -   Character = btl_character_turn_data:get_character(Data), +   {S0Update, Character} = btl_character_turn_update:get_character(Update), -   DisabledCharacter = btl_character:set_is_active(false, Character), -   UpdatedData = btl_character_turn_data:set_character(DisabledCharacter, Data), -   FinalizedData = btl_character_turn_data:clean_battle(UpdatedData), +   {UpdatedCharacter, CharacterAtaxiaUpdate} = +      btl_character:ataxia_set_is_active(false, Character), -   DBQuery = -      ataxic:update_field +   S1Update = +      btl_character_turn_update:ataxia_set_character        ( -         btl_battle:get_characters_field(), -         ataxic_sugar:update_orddict_element -         ( -            btl_character_turn_data:get_character_ix(Data), -            ataxic:update_field -            ( -               btl_character:get_is_active_field(), -               ataxic:constant(false) -            ) -         ) +         UpdatedCharacter, +         CharacterAtaxiaUpdate, +         S0Update        ), -   S0Update = btl_character_turn_update:set_data(FinalizedData, Update), -   S1Update = btl_character_turn_update:add_to_db(DBQuery, S0Update), -     S1Update.  -spec handle_action @@ -62,19 +50,56 @@ handle_action (BattleAction, Update) ->        attack -> btl_turn_actions_attack:handle(BattleAction, Update)     end. +-spec update_timeline +   ( +      btl_character_turn_update:type() +   ) +   -> btl_character_turn_update:type(). +update_timeline (Update) -> +   NewTimelineElements = btl_character_turn_update:get_timeline(Update), +   {S0Update, Battle} = btl_character_turn_update:get_battle(Update), +   PlayerTurn = btl_battle:get_current_player_turn(Battle), +   PlayerIX = btl_player_turn:get_player_ix(PlayerTurn), +   Player = btl_battle:get_player(PlayerIX, Battle), + +   {UpdatedPlayer, PlayerAtaxiaUpdate} = +      btl_player:ataxia_add_to_timeline(NewTimelineElements, Player), + +   {UpdatedBattle, BattleAtaxiaUpdate} = +      btl_battle:ataxia_set_player +      ( +         PlayerIX, +         UpdatedPlayer, +         PlayerAtaxiaUpdate, +         Battle +      ), + +   S1Update = +      btl_character_turn_update:ataxia_set_battle +      ( +         UpdatedBattle, +         BattleAtaxiaUpdate, +         S0Update +      ), + +   S1Update. + +  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec handle     ( -      btl_character_turn_data:type(), +      btl_character_turn_update:type(),        btl_character_turn_request:type()     )     -> btl_character_turn_update:type(). -handle (Data, Request) -> +handle (Update, Request) ->     Actions = btl_character_turn_request:get_actions(Request), -   EmptyUpdate = btl_character_turn_update:new(Data), -   PostActionsUpdate = lists:foldl(fun handle_action/2, EmptyUpdate, Actions), +   S0Update = lists:foldl(fun handle_action/2, Update, Actions), +   S1Update = deactivate_character(S0Update), +   S2Update = update_timeline(S1Update), +   S3Update = btl_turn_progression:handle(S2Update), -   deactivate_character(PostActionsUpdate). +   S3Update. diff --git a/src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl b/src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl index 119dbe7..24b361a 100644 --- a/src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl +++ b/src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl @@ -26,43 +26,30 @@     )     -> btl_character_turn_update:type().  handle (Update) -> -   Data = btl_character_turn_update:get_data(Update), -   Character = btl_character_turn_data:get_character(Data), -   CharacterCurrentData = -      btl_character_turn_data:get_character_current_data(Data), -   CharacterIX = btl_character_turn_data:get_character_ix(Data), +   {S0Update, Character} = btl_character_turn_update:get_character(Update), +   CharacterIX = btl_character_turn_update:get_character_ix(S0Update), +   BaseCharacter = btl_character:get_base_character(Character), -   {PrimaryWeaponID, SecondaryWeaponID} = btl_character:get_weapon_ids(Character), +   {UpdatedBaseCharacter, BaseCharacterAtaxiaUpdate} = +      shr_character:ataxia_switch_weapons(BaseCharacter), -   UpdatedWeaponIDs = {SecondaryWeaponID, PrimaryWeaponID}, -   UpdatedCharacter = btl_character:set_weapon_ids(UpdatedWeaponIDs, Character), - -   S0Data = btl_character_turn_data:set_character(UpdatedCharacter, Data), -   S1Data = btl_character_turn_data:refresh_character_current_data(S0Data), - -   S0Update = btl_character_turn_update:set_data(S1Data, Update), -   S1Update = -      btl_turn_actions_stats_change:handle_max_health_changes +   {UpdatedCharacter, CharacterAtaxiaUpdate} = +      btl_character:ataxia_set_base_character        ( -         CharacterCurrentData, -         S0Update +         UpdatedBaseCharacter, +         BaseCharacterAtaxiaUpdate, +         Character        ),     TimelineItem = btl_turn_result:new_character_switched_weapons(CharacterIX), -   DBQuery = -      ataxic:update_field +   S1Update = btl_character_turn_update:add_to_timeline(TimelineItem, S0Update), +   S2Update = +      btl_character_turn_update:ataxia_set_character        ( -         btl_battle:get_characters_field(), -         ataxic_sugar:update_orddict_element -         ( -            CharacterIX, -            ataxic:update_field -            ( -               btl_character:get_weapons_field(), -               ataxic:constant(UpdatedWeaponIDs) -            ) -         ) +         UpdatedCharacter, +         CharacterAtaxiaUpdate, +         S1Update        ), -   btl_character_turn_update:add_to_timeline(TimelineItem, DBQuery, S1Update). +   S2Update. diff --git a/src/battle/query/btl_character_turn.erl b/src/battle/query/btl_character_turn.erl index b911ae9..455dd13 100644 --- a/src/battle/query/btl_character_turn.erl +++ b/src/battle/query/btl_character_turn.erl @@ -37,7 +37,7 @@ authenticate_user (Request) ->     (        btl_character_turn_request:type()     ) -   -> btl_character_turn_data:type(). +   -> btl_character_turn_update:type().  fetch_data (Request) ->     PlayerID = btl_character_turn_request:get_player_id(Request),     BattleID = btl_character_turn_request:get_battle_id(Request), @@ -50,17 +50,17 @@ fetch_data (Request) ->           BattleID        ), -   btl_character_turn_data:new(Battle, CharacterIX). +   btl_character_turn_update:new(Battle, CharacterIX).  %%%% ASSERTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec assert_user_is_current_player     ( -      btl_character_turn_data:type(), +      btl_character_turn_update:type(),        btl_character_turn_request:type()     ) -> 'ok'. -assert_user_is_current_player (Data, Request) -> +assert_user_is_current_player (Update, Request) ->     PlayerID = btl_character_turn_request:get_player_id(Request), -   Battle = btl_character_turn_data:get_battle(Data), +   {_SameUpdate, Battle} = btl_character_turn_update:get_battle(Update),     CurrentPlayerTurn = btl_battle:get_current_player_turn(Battle),     CurrentPlayerIX = btl_player_turn:get_player_ix(CurrentPlayerTurn),     CurrentPlayer = btl_battle:get_player(CurrentPlayerIX, Battle), @@ -71,25 +71,24 @@ assert_user_is_current_player (Data, Request) ->  -spec assert_user_owns_played_character     ( -      btl_character_turn_data:type(), +      btl_character_turn_update:type(),        btl_character_turn_request:type()     ) -> 'ok'. -assert_user_owns_played_character (Data, Request) -> +assert_user_owns_played_character (Update, Request) ->     PlayerID = btl_character_turn_request:get_player_id(Request), -   Battle = btl_character_turn_data:get_battle(Data), -   Players = btl_battle:get_players(Battle), -   Character = btl_character_turn_data:get_character(Data), +   {_SameUpdateA, Battle} = btl_character_turn_update:get_battle(Update), +   {_SameUpdateB, Character} = btl_character_turn_update:get_character(Update),     CharacterPlayerIX = btl_character:get_player_index(Character), -   CharacterPlayer = orddict:fetch(CharacterPlayerIX, Players), +   CharacterPlayer = btl_battle:get_player(CharacterPlayerIX, Battle),     CharacterPlayerID = btl_player:get_id(CharacterPlayer),     true = (PlayerID == CharacterPlayerID),     ok. --spec assert_character_can_be_played (btl_character_turn_data:type()) -> 'ok'. -assert_character_can_be_played (Data) -> -   Character = btl_character_turn_data:get_character(Data), +-spec assert_character_can_be_played (btl_character_turn_update:type()) -> 'ok'. +assert_character_can_be_played (Update) -> +   {_SameUpdate, Character} = btl_character_turn_update:get_character(Update),     true = btl_character:get_is_active(Character), @@ -97,77 +96,16 @@ assert_character_can_be_played (Data) ->  -spec assert_user_permissions     ( -      btl_character_turn_data:type(), +      btl_character_turn_update:type(),        btl_character_turn_request:type()     ) -> 'ok'. -assert_user_permissions (Data, Request) -> -   assert_user_is_current_player(Data, Request), -   assert_user_owns_played_character(Data, Request), -   assert_character_can_be_played(Data), +assert_user_permissions (Update, Request) -> +   assert_user_is_current_player(Update, Request), +   assert_user_owns_played_character(Update, Request), +   assert_character_can_be_played(Update),     ok. -%%%% QUERY LOGIC HANDLING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%% TODO: move this elsewhere --spec update_timeline -   ( -      btl_character_turn_update:type() -   ) -   -> btl_character_turn_update:type(). -update_timeline (Update) -> -   NewTimelineElements = btl_character_turn_update:get_timeline(Update), -   Data = btl_character_turn_update:get_data(Update), -   Battle = btl_character_turn_data:get_battle(Data), -   PlayerTurn = btl_battle:get_current_player_turn(Battle), -   PlayerIX = btl_player_turn:get_player_ix(PlayerTurn), -   Player = btl_battle:get_player(PlayerIX, Battle), - -   UpdatedPlayer = btl_player:add_to_timeline(NewTimelineElements, Player), -   UpdatedBattle = btl_battle:set_player(PlayerIX, UpdatedPlayer, Battle), -   UpdatedData = btl_character_turn_data:set_battle(UpdatedBattle, Data), - -   DBQuery = -      ataxic:update_field -      ( -         btl_battle:get_players_field(), -         ataxic_sugar:update_orddict_element -         ( -            PlayerIX, -            ataxic:update_field -            ( -               btl_player:get_timeline_field(), -               ataxic:apply_function -               ( -                  lists, -                  append, -                  [ -                     ataxic:constant(NewTimelineElements), -                     ataxic:current_value() -                  ] -               ) -            ) -         ) -      ), - -   S0Update = btl_character_turn_update:set_data(UpdatedData, Update), -   S1Update = btl_character_turn_update:add_to_db(DBQuery, S0Update), - -   S1Update. - - --spec update_data -   ( -      btl_character_turn_data:type(), -      btl_character_turn_request:type() -   ) -   -> btl_character_turn_update:type(). -update_data (Data, Request) -> -   PostActionsUpdate = btl_turn_actions:apply_requested_actions(Data, Request), -   PostCharacterTurnUpdate = update_timeline(PostActionsUpdate), - -   btl_next_turn:update_if_needed(PostCharacterTurnUpdate). -  %%%% DATABASE UPDATES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec send_to_database     ( @@ -178,14 +116,14 @@ update_data (Data, Request) ->  send_to_database (Update, Request) ->     PlayerID = btl_character_turn_request:get_player_id(Request),     BattleID = btl_character_turn_request:get_battle_id(Request), -   Ops = btl_character_turn_update:get_db(Update), +   BattleAtaxicUpdate = btl_character_turn_update:get_battle_update(Update),     ok =        ataxia_client:update        (           battle_db,           ataxia_security:user_from_id(PlayerID), -         ataxic:update_value(ataxic:sequence(Ops)), +         ataxic:update_value(ataxic:optimize(BattleAtaxicUpdate)),           BattleID        ), @@ -200,8 +138,7 @@ send_to_database (Update, Request) ->  send_to_cache (Update, Request) ->     PlayerID = btl_character_turn_request:get_player_id(Request),     BattleID = btl_character_turn_request:get_battle_id(Request), -   Data = btl_character_turn_update:get_data(Update), -   Battle = btl_character_turn_data:get_battle(Data), +   {_SameUpdate, Battle} = btl_character_turn_update:get_battle(Update),     shr_timed_cache:update     ( @@ -244,14 +181,14 @@ handle (Query) ->           shr_security:lock_queries(PlayerID), -         Data = fetch_data(Request), -         assert_user_permissions(Data, Request), -         Update = update_data(Data, Request), -         commit_update(Update, Request), +         S0Update = fetch_data(Request), +         assert_user_permissions(S0Update, Request), +         S1Update = btl_turn_actions:apply_requested_actions(S0Update, Request), +         commit_update(S1Update, Request),           shr_security:unlock_queries(PlayerID), -         generate_reply(Update); +         generate_reply(S1Update);        error -> jiffy:encode([shr_disconnected:generate()])     end. diff --git a/src/battle/struct/btl_character.erl b/src/battle/struct/btl_character.erl index 69904c6..ce0b3aa 100644 --- a/src/battle/struct/btl_character.erl +++ b/src/battle/struct/btl_character.erl @@ -69,6 +69,15 @@        set_is_defeated/2,        set_base_character/2, +      ataxia_set_rank/2, +      ataxia_set_location/2, +      ataxia_set_current_health/2, +      ataxia_set_is_active/2, +      ataxia_set_is_defeated/2, +      ataxia_set_base_character/2, + +      ataxia_set_base_character/3, +        get_rank_field/0,        get_current_health_field/0,        get_is_active_field/0, @@ -119,7 +128,6 @@ get_is_alive (#btl_char{ current_health = H, is_defeated = D }) ->  get_is_alive (#btl_char_ref{ current_health = H, is_defeated = D }) ->     ((not D) and (H > 0)). -  -spec get_is_active (either()) -> boolean().  get_is_active  ( @@ -150,13 +158,23 @@ set_rank (Rank, Char) when is_record(Char, btl_char) ->  set_rank (Rank, Char) when is_record(Char, btl_char_ref) ->     Char#btl_char_ref{ rank = Rank }. +% TODO: This can change current_health. +% FIXME: Can't do this without giving the new tile omnimods.  -spec set_location -   ({non_neg_integer(), non_neg_integer()}, type()) -> type(); -   ({non_neg_integer(), non_neg_integer()}, unresolved()) -> unresolved(). -set_location (Location, Char) when is_record(Char, btl_char) -> -   Char#btl_char{ location = Location }; -set_location (Location, Char) when is_record(Char, btl_char_ref) -> -   Char#btl_char_ref{ location = Location }. +   ( +      {non_neg_integer(), non_neg_integer()}, +      shr_omnimods:type(), +      type() +   ) +   -> type(); +set_location (Location, LocOmnimods, Char) -> +   BaseCharacter =  +   CurrentMaxHealth = +      shr_statistics:get_health +      ( +         shr_character:get_statistics +      ) +   Char#btl_char{ location = Location }.  -spec set_current_health     (integer(), type()) -> type(); @@ -182,13 +200,14 @@ set_is_defeated (Defeated, Char) when is_record(Char, btl_char) ->  set_is_defeated (Defeated, Char) when is_record(Char, btl_char_ref) ->     Char#btl_char_ref{ is_defeated = Defeated }. +% TODO: This can change current_health.  -spec set_base_character     (shr_character:type(), type()) -> type();     (shr_character:unresolved(), unresolved()) -> unresolved().  set_base_character (Base, Char) when is_record(Char, btl_char) -> -   Char#btl_char{ base = Base}; +   Char#btl_char{ base = Base };  set_base_character (Base, Char) when is_record(Char, btl_char_ref) -> -   Char#btl_char_ref{ base = Base}. +   Char#btl_char_ref{ base = Base }.  %%%% Utils  -spec new diff --git a/src/battle/struct/btl_character_turn_update.erl b/src/battle/struct/btl_character_turn_update.erl index 6649eb2..601f314 100644 --- a/src/battle/struct/btl_character_turn_update.erl +++ b/src/battle/struct/btl_character_turn_update.erl @@ -18,7 +18,7 @@        character_ix :: non_neg_integer(), -      reversed_timeline :: list(any()) +      timeline :: list(any())     }  ). @@ -92,7 +92,7 @@ new (Battle, CharacterIX) ->        character_ix = CharacterIX, -      reversed_timeline = [] +      timeline = []     }.  -spec get_battle (type()) -> {type(), btl_battle:type()}. @@ -203,12 +203,12 @@ ataxia_set_character (Character, CharacterUpdate, Data) ->  add_to_timeline (Item, Data) ->     Data#type     { -      reversed_timeline = -         [btl_turn_result:encode(Item)|Data#type.reversed_timeline] +      timeline = +         [btl_turn_result:encode(Item)|Data#type.timeline]     }.  -spec get_timeline (type()) -> list(any()). -get_timeline (Data) -> lists:reverse(Data#type.reversed_timeline). +get_timeline (Data) -> Data#type.timeline.  -spec get_battle_update (type()) -> ataxic:basic().  get_battle_update (Data) -> diff --git a/src/shared/struct/shr_character.erl b/src/shared/struct/shr_character.erl index 09ad10b..939b502 100644 --- a/src/shared/struct/shr_character.erl +++ b/src/shared/struct/shr_character.erl @@ -26,9 +26,10 @@        is_using_secondary :: boolean(),        statistics :: shr_statistics:type(),        attributes :: shr_attributes:type(), +      equipment_but_weapons_omnimods :: shr_omnimods:type(), +      % TODO: move this to btl_character instead.        extra_omnimods :: shr_omnimods:type(), -      omnimods :: shr_omnimods:type(), -      dirty :: boolean() +      omnimods :: shr_omnimods:type()     }  ). @@ -62,10 +63,7 @@        set_extra_omnimods/2,        switch_weapons/1, -      ataxia_switch_weapons/1, - -      clean/1, -      is_dirty/1 +      ataxia_switch_weapons/1     ]  ). @@ -91,6 +89,21 @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_equipment_but_weapons_omnimods +   ( +      shr_equipment:either() +   ) +   -> shr_omnimods:type(). +get_equipment_but_weapons_omnimods (Equipment) -> +   shr_omnimods:merge +   ( +      shr_glyph_board:get_omnimods_with_glyphs +      ( +         shr_equipment:get_glyphs(Equipment), +         shr_equipment:get_glyph_board(Equipment) +      ), +      shr_armor:get_omnimods(shr_equipment:get_armor(Equipment)) +   ).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -131,10 +144,45 @@ get_equipment (#shr_char_ref{ equipment = R }) -> R.     (shr_equipment:type(), type()) -> type();     (shr_equipment:unresolved(), unresolved()) -> unresolved().  set_equipment (Eq, Char) when is_record(Char, shr_char) -> +   EquipmentButWeaponsOmnimods = get_equipment_but_weapons_omnimods(Eq), +   ActiveWeaponOmnimods = +      case Char#shr_char.is_using_secondary of +         false -> shr_weapon:get_omnimods(shr_equipment:get_primary_weapon(Eq)); +         _ -> shr_weapon:get_omnimods(shr_equipment:get_secondary_weapon(Eq)) +      end, + +   NewOmnimods = +      shr_omnimods:merge +      ( +         shr_omnimods:merge +         ( +            EquipmentButWeaponsOmnimods, +            ActiveWeaponOmnimods +         ), +         Char#shr_char.extra_omnimods +      ), + +   NewAttributes = +      shr_omnimods:apply_to_attributes +      ( +         shr_attributes:default(), +         NewOmnimods +      ), + +   NewStatistics = +      shr_omnimods:apply_to_statistics +      ( +         shr_statistics:new_raw(NewAttributes), +         NewOmnimods +      ), +     Char#shr_char     {        equipment = Eq, -      dirty = true +      equipment_but_weapons_omnimods = EquipmentButWeaponsOmnimods, +      omnimods = NewOmnimods, +      attributes = NewAttributes, +      statistics = NewStatistics     };  set_equipment (EqRef, CharRef) when is_record(CharRef, shr_char_ref) ->     CharRef#shr_char_ref{ equipment = EqRef }. @@ -170,10 +218,45 @@ ataxia_set_equipment (Eq, EqUpdate, Char) ->     (type()) -> type();     (unresolved()) -> unresolved().  switch_weapons (Char) when is_record(Char, shr_char) -> +   Eq = Char#shr_char.equipment, + +   ActiveWeaponOmnimods = +      case Char#shr_char.is_using_secondary of +         true -> shr_weapon:get_omnimods(shr_equipment:get_primary_weapon(Eq)); +         _ -> shr_weapon:get_omnimods(shr_equipment:get_secondary_weapon(Eq)) +      end, + +   NewOmnimods = +      shr_omnimods:merge +      ( +         shr_omnimods:merge +         ( +            Char#shr_char.equipment_but_weapons_omnimods, +            Char#shr_char.extra_omnimods +         ), +         ActiveWeaponOmnimods +      ), + +   NewAttributes = +      shr_omnimods:apply_to_attributes +      ( +         shr_attributes:default(), +         NewOmnimods +      ), + +   NewStatistics = +      shr_omnimods:apply_to_statistics +      ( +         shr_statistics:new_raw(NewAttributes), +         NewOmnimods +      ), +     Char#shr_char     {        is_using_secondary = (not Char#shr_char.is_using_secondary), -      dirty = true +      omnimods = NewOmnimods, +      attributes = NewAttributes, +      statistics = NewStatistics     };  switch_weapons (Char) when is_record(Char, shr_char_ref) ->     Char#shr_char_ref @@ -229,70 +312,49 @@ get_omnimods (Char) -> Char#shr_char.omnimods.  -spec set_extra_omnimods (shr_omnimods:type(), type()) -> type().  set_extra_omnimods (O, Char) -> -   Char#shr_char -   { -      extra_omnimods = O, -      dirty = true -   }. - --spec clean (type()) -> type(). -clean (Char) when Char#shr_char.dirty -> -   Equipment = Char#shr_char.equipment, - -   Omnimods = +   NewOmnimods =        shr_omnimods:merge        (           shr_omnimods:merge           ( -            shr_glyph_board:get_omnimods_with_glyphs -            ( -               shr_equipment:get_glyphs(Equipment), -               shr_equipment:get_glyph_board(Equipment) -            ), -            shr_armor:get_omnimods(shr_equipment:get_armor(Equipment)) +            Char#shr_char.equipment_but_weapons_omnimods, +            shr_weapon:get_omnimods(get_active_weapon(Char))           ), -         shr_omnimods:merge -         ( -            shr_weapon:get_omnimods(get_active_weapon(Char)), -            Char#shr_char.extra_omnimods -         ) +         O        ), -   Attributes = +   NewAttributes =        shr_omnimods:apply_to_attributes        (           shr_attributes:default(), -         Omnimods +         NewOmnimods        ), -   Statistics = +   NewStatistics =        shr_omnimods:apply_to_statistics        ( -         shr_statistics:new_raw(Attributes), -         Omnimods +         shr_statistics:new_raw(NewAttributes), +         NewOmnimods        ),     Char#shr_char     { -      dirty = false, -      attributes = Attributes, -      statistics = Statistics, -      omnimods = Omnimods -   }; -clean (Char) -> Char. - --spec is_dirty (type()) -> boolean(). -is_dirty (Char) -> Char#shr_char.dirty. +      extra_omnimods = O, +      omnimods = NewOmnimods, +      attributes = NewAttributes, +      statistics = NewStatistics +   }.  -spec resolve (shr_omnimods:type(), unresolved()) -> type().  resolve (LocalOmnimods, CharRef) ->     Attributes = shr_attributes:default(), +   Eq = shr_equipment:resolve(CharRef#shr_char_ref.equipment),     #shr_char     {        name = CharRef#shr_char_ref.name, -      dirty = true, -      equipment = shr_equipment:resolve(CharRef#shr_char_ref.equipment), +      equipment_but_weapons_omnimods = get_equipment_but_weapons_omnimods(Eq), +      equipment = Eq,        is_using_secondary = CharRef#shr_char_ref.is_using_secondary,        statistics = shr_statistics:new_raw(Attributes),        attributes = Attributes, | 


