Damage - noonmaru/psychics GitHub Wiki

๊ฐœ์š”

๊ฐœ์ฒด์—๊ฒŒ EsperAttribute์˜ ์ˆ˜์น˜๋ฅผ ์ด์šฉํ•ด ํ”ผํ•ด๋ฅผ ์ž…ํžˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

LivingEntity์˜ ํ™•์žฅํ•จ์ˆ˜๋กœ ๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ ๋ฐฉ์–ด๋ ฅ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ํ”ผํ•ด๋ฅผ ์ž…ํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ

LivingEntity.psychicDamage (com.github.noonmaru.psychics.DamageSupport.kt์— ์ •์˜๋˜์–ด์žˆ๋Š” ํ™•์žฅํ•จ์ˆ˜)

์ง์ ‘ Esper๋กœ๋ถ€ํ„ฐ EsperStatistics๋ฅผ ์ด์šฉํ•ด ๋Šฅ๋ ฅ์น˜๋ฅผ ๊ฐ€์ ธ์˜จ ์ˆ˜์น˜๋งŒํผ ํ”ผํ•ด๋ฅผ ์ž…ํžˆ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

class MyAbility : ActiveAbility<AbilityConcept>() {
    init {
        targeter = {
            val eyeLocation = esper.player.eyeLocation
            val direction = eyeLocation.direction

            eyeLocation.world.rayTraceEntities(
                    eyeLocation,
                    direction, 64.0,
                    1.0
            )
        }
    }

    override fun onCast(target: Any?) {
        // target = targetEntity
        val targetEntity = target as LivingEntity
        val stats = EsperStatistic.of(EsperAttribute.ATTACK_DAMAGE to 1.0)

        val damageType = DamageType.RANGED
        val damageAmount = esper.getStatistic(stats)

        targetEntity.psychicDamage(
                this, // ๊ณต๊ฒฉ์ž์˜ Ability
                damageType, // ๋ฐ๋ฏธ์ง€ ํƒ€์ž…
                damageAmount, // ๋ฐ๋ฏธ์ง€๋Ÿ‰
                esper.player, // ๊ณต๊ฒฉ์ž ํ”Œ๋ ˆ์ด์–ด
                esper.player.location, // ๋„‰๋ฐฑ ๊ธฐ์ค€ ์ขŒํ‘œ
                1.0) // ๋„‰๋ฐฑ ๊ฐ•๋„
    }
}

LivingEntity.psychicDamage (com.github.noonmaru.psychics.Ability์— ์ •์˜๋˜์–ด์žˆ๋Š” ๋‚ด๋ถ€ ํ™•์žฅํ•จ์ˆ˜)

์œ„ ํ™•์žฅํ•จ์ˆ˜๋ฅผ com.github.noonmaru.damage.Damage ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ์กฐ๊ธˆ ๋” ๋งˆ๋ฒ•์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

Ability๋‚ด์— ์„ ์–ธ๋˜์–ด์žˆ๋Š” ํ™•์žฅํ•จ์ˆ˜์ด๋ฏ€๋กœ ๋‚ด๋ถ€ ์†์„ฑ์„ ์ด์šฉํ•ด ๋Šฅ๋ ฅ ์‚ฌ์šฉ์ž์˜ ๋Šฅ๋ ฅ์น˜๋ฅผ ๊ฐ€์ ธ์™€ ํ”ผํ•ด๋Ÿ‰์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

class MyAbility : ActiveAbility<AbilityConcept>() {
    init {
        targeter = {
            val eyeLocation = esper.player.eyeLocation
            val direction = eyeLocation.direction

            eyeLocation.world.rayTraceEntities(
                    eyeLocation,
                    direction, 64.0,
                    1.0
            )
        }
    }

    override fun onCast(target: Any?) {
        // target = targetEntity
        val targetEntity = target as LivingEntity
        val damage = Damage(DamageType.RANGED, EsperStatistic.of(EsperAttribute.ATTACK_DAMAGE to 1.0))

        targetEntity.psychicDamage(damage, esper.player.eyeLocation, 1.0)
    }
}

AbilityConcept์—๋Š” damage์†์„ฑ์ด ์ •์˜๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

damage์†์„ฑ์ด null์ด ์•„๋‹๊ฒฝ์šฐ ์ด๋ฅผ ์ด์šฉํ•ด ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class MyAbility : ActiveAbility<AbilityConcept>() {
    init {
        targeter = {
            val eyeLocation = esper.player.eyeLocation
            val direction = eyeLocation.direction

            eyeLocation.world.rayTraceEntities(
                    eyeLocation,
                    direction, 64.0,
                    1.0
            )
        }
    }

    override fun onCast(target: Any?) {
        // target = targetEntity
        val targetEntity = target as LivingEntity

        concept.damage?.let { targetEntity.psychicDamage(it) }
    }
}