executeEvent method

List<LifeStageEntity> executeEvent (
  1. LifeEventEntity<LifeEventParams> lifeEvent,
  2. List<LifeStageEntity> lifeStages
)

指定の lifeStage を対象に LifeVent の処理を適用する

Implementation

List<LifeStageEntity> executeEvent(LifeEventEntity lifeEvent, List<LifeStageEntity> lifeStages) {
  switch (lifeEvent.type) {
    case LifeEventType.nothing:
    case LifeEventType.start:
      break; // 何もすることない
    case LifeEventType.goal:
      break; // TODO: 実装
    case LifeEventType.selectDirection:
      break; // TODO: 実装
    case LifeEventType.selectDirectionPerDiceRoll:
      break; // TODO: 実装
    case LifeEventType.selectDirectionPerLifeItem:
      break; // TODO: 実装
    case LifeEventType.gainLifeItems:
      final params = lifeEvent.params as GainLifeItemsParams;
      return lifeStages.map<LifeStageEntity>((lifeStage) {
        final items = {...lifeStage.items};
        for (final target in params.targetItems) {
          final targetItem = LifeItemEntity(key: target.key, type: target.type, amount: target.amount);
          final existingItem = items.firstWhere((el) => el.equalToTarget(target), orElse: () => null);
          if (existingItem != null) {
            /// 同一のものがある場合は削除しつつ加算
            items
              ..removeWhere((el) => el.equalToTarget(target))
              ..add(existingItem.copyWith(amount: existingItem.amount + targetItem.amount)); // 加算
          } else {
            items.add(targetItem);
          }
        }
        return lifeStage.copyWith(items: UnmodifiableSetView<LifeItemEntity>(items));
      }).toList();
    case LifeEventType.gainLifeItemsPerOtherLifeItem:
      break; // TODO: 実装
    case LifeEventType.gainLifeItemsPerDiceRoll:
      break; // TODO: 実装
    case LifeEventType.gainLifeItemsIfExistOtherLifeItem:
      break; // TODO: 実装
    case LifeEventType.gainLifeItemsIfNotExistOtherLifeItem:
      break; // TODO: 実装
    case LifeEventType.exchangeLifeItems:
      final params = lifeEvent.params as ExchangeLifeItemsParams;
      return lifeStages
          .map<LifeStageEntity>((lifeStage) => lifeStage.copyWith(
                items: UnmodifiableSetView<LifeItemEntity>(_exchangeLifeItems(lifeStage.items, params)),
              ))
          .toList();
    case LifeEventType.exchangeLifeItemsWithDiceRoll:
      break; // TODO: 実装
    case LifeEventType.loseLifeItems:
      final params = lifeEvent.params as LoseLifeItemsParams;
      return lifeStages.map<LifeStageEntity>((lifeStage) {
        final items = {...lifeStage.items};
        for (final target in params.targetItems) {
          final targetItem = LifeItemEntity(key: target.key, type: target.type, amount: target.amount);
          final existingItem = items.firstWhere((el) => el.equalToTarget(target), orElse: () => null);
          if (existingItem != null) {
            /// 同一のものがある場合は削除しつつ減算
            items
              ..removeWhere((el) => el.equalToTarget(target))
              ..add(existingItem.copyWith(amount: existingItem.amount - targetItem.amount)); // 減算
          } else {
            items.add(targetItem);
          }
        }
        return lifeStage.copyWith(items: UnmodifiableSetView<LifeItemEntity>(items));
      }).toList();
    case LifeEventType.loseLifeItemsPerDiceRoll:
      break; // TODO: 実装
    case LifeEventType.loseLifeItemsPerOtherLifeItem:
      break; // TODO: 実装
    case LifeEventType.loseLifeItemsIfExistOtherLifeItem:
      break; // TODO: 実装
    case LifeEventType.loseLifeItemsIfNotExistOtherLifeItem:
      break; // TODO: 実装
  }
  return lifeStages.map<LifeStageEntity>((lifeStage) => lifeStage.copyWith()).toList();
}