bool RunSingleStatement(SingleStatement singleStatement, ItemId itemId, StateValue signal, out string updatedKey)
        {
            var target        = singleStatement.TargetState;
            var parameterType = target.ParameterType;

            updatedKey = GetStateKey(target.Target, target.Key, itemId);
            if (parameterType == ParameterType.Signal)
            {
                var conditionSatisfied = singleStatement.Expression == null || EvaluateExpression(singleStatement.Expression, itemId).ToBool();
                if (conditionSatisfied)
                {
                    roomStateRepository.Update(updatedKey, signal);
                }
                return(conditionSatisfied);
            }
            else
            {
                var value = Cast(parameterType, EvaluateExpression(singleStatement.Expression, itemId));
                roomStateRepository.Update(updatedKey, value);
                return(true);
            }
        }
        void UpdateState(IReadOnlyCollection <KeyValuePair <string, StateValue> > stateChange)
        {
            if (stateChange.Count == 0)
            {
                return;
            }
            foreach (var state in stateChange)
            {
                roomStateRepository.Update(state.Key, state.Value);
            }

            gimmickManager.OnStateUpdated(stateChange.Select(s => s.Key));
        }
        void OnTriggered(object sender, TriggerEventArgs args)
        {
            var senderTrigger = (IItemTrigger)sender;
            var senderItem    = senderTrigger.Item;

            if (!TryGetKey(args.Target, senderItem, args.SpecifiedTargetItem, args.CollidedObject, args.Key, out var key))
            {
                return;
            }
            var gimmickValue = GetGimmickValue(args.Type, args.Value);

            roomStateRepository.Update(key, gimmickValue);
            gimmickManager.Invoke(key, gimmickValue);
        }