SmartBattleEffectImportService.kt
package io.github.lishangbu.avalon.game.service.effect
import io.github.lishangbu.avalon.dataset.api.model.AbilityInfo
import io.github.lishangbu.avalon.dataset.api.model.ItemInfo
import io.github.lishangbu.avalon.dataset.api.model.MoveInfo
import io.github.lishangbu.avalon.dataset.api.service.AbilityReader
import io.github.lishangbu.avalon.dataset.api.service.ItemReader
import io.github.lishangbu.avalon.dataset.api.service.MoveReader
import io.github.lishangbu.avalon.game.battle.engine.core.dsl.EffectDefinition
import org.springframework.stereotype.Service
/**
* 基于真实数据源的战斗 effect 智能导入服务。
*/
@Service
class SmartBattleEffectImportService(
private val moveReader: MoveReader,
private val abilityReader: AbilityReader,
private val itemReader: ItemReader,
) {
fun importEffect(effectId: String): EffectDefinition? =
loadMove(effectId)?.let(::toMoveRecord)?.let(SmartBattleEffectAssembler::fromMove)
?: loadAbility(effectId)?.let(::toAbilityRecord)?.let(SmartBattleEffectAssembler::fromAbility)
?: loadItem(effectId)?.let(::toItemRecord)?.let(SmartBattleEffectAssembler::fromItem)
private fun loadMove(internalName: String): MoveInfo? = moveReader.findMoveByInternalName(internalName)
private fun loadAbility(internalName: String): AbilityInfo? = abilityReader.findAbilityByInternalName(internalName)
private fun loadItem(internalName: String): ItemInfo? = itemReader.findItemByInternalName(internalName)
private fun toMoveRecord(move: MoveInfo): MoveImportRecord =
MoveImportRecord(
internalName = move.internalName,
name = move.name,
typeInternalName = move.typeInternalName,
damageClassInternalName = move.damageClassInternalName,
targetInternalName = move.targetInternalName,
accuracy = move.accuracy,
effectChance = move.effectChance,
pp = move.pp,
priority = move.priority,
power = move.power,
shortEffect = move.shortEffect,
effect = move.effect,
ailmentInternalName = move.ailmentInternalName,
ailmentChance = move.ailmentChance,
healing = move.healing,
drain = move.drain,
)
private fun toAbilityRecord(ability: AbilityInfo): AbilityImportRecord =
AbilityImportRecord(
internalName = ability.internalName,
name = ability.name,
effect = ability.effect,
introduction = ability.introduction,
)
private fun toItemRecord(item: ItemInfo): ItemImportRecord =
ItemImportRecord(
internalName = item.internalName,
name = item.name,
shortEffect = item.shortEffect,
effect = item.effect,
text = item.text,
attributeInternalNames = item.attributeInternalNames,
flingEffectInternalName = item.flingEffectInternalName,
)
}