#--------------------------------------------------------------------------
# ● 통상 공격의 효과 적용
# attacker : 공격자 (버틀러)
#--------------------------------------------------------------------------
def attack_effect(attacker)
# 위기 플래그를 클리어
self.critical = false
# 제일 명중 판정
hit_result = (rand(100) < attacker.hit)
# 명중의 경우
if hit_result == true
# 기본 데미지를 계산
atk = [attacker.atk - self.pdef / 2, 0].max
self.damage = atk * (20 + attacker.str) / 20
# 속성 수정
self.damage *= elements_correct(attacker.element_set)
self.damage /= 100
# 데미지의 부호가 정의 경우
if self.damage > 0
# 위기 수정
if rand(100) < 4 * attacker.dex / self.agi
self.damage *= 2
self.critical = true
end
# 방어 수정
if self.guarding?
self.damage /= 2
end
end
# 분산
if self.damage.abs > 0
amp = [self.damage.abs * 15 / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# 제2 명중 판정
eva = 8 * self.agi / attacker.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
end
# 명중의 경우
if hit_result == true
# 스테이트 충격 해제
remove_states_shock
# HP 로부터 데미지를 감산
self.hp -= self.damage
# 스테이트 변화
@state_changed = false
states_plus(attacker.plus_state_set)
states_minus(attacker.minus_state_set)
# 미스의 경우
else
# 데미지에 "Miss" 를 설정
self.damage = "Miss"
# 위기 플래그를 클리어
self.critical = false
end
# 메소드 종료
return true
end
이것이 전투에서 기본 공격의 데미지 수치를 결정하는 부분입니다.
이부분 아래에는 스킬, 아이템, 속성등에 대한 설정들이 있습니다.
# 기본 데미지를 계산
atk = [attacker.atk - self.pdef / 2, 0].max
self.damage = atk * (20 + attacker.str) / 20
여기가 가장 핵심적인 부분인데 잘 살펴보면
'atk(공격력)=[공격자의 공격력-피격자의 물리방어력/2, 0].최대치'라고 해석할 수 있습니다.
저도 스크립트 초짜라 잘은 모르겠지만 콤마 앞의 것이 최대치, 0이 최소치라고 생각됩니다.
그러니까 공격력은 최소치와 최대치 사이에 속해있는 숫자가 되는 것입니다.
그리고 두번째 줄을 보면
'self.damage(피격자의 데미지) = 공격력(위에서 정의한 공식)*(20+공격자의 완력) / 20 이라고 되어 있습니다.
한마디로 피격자가 받는 데미지는 위에서 정의한 공식에 따라 나온 공격력에 (공격자의 완력+20)을 곱한 다음 20으로 나눈 것이 되는 것입니다.
이것으로 공식 해석은 되었지만 속성이나 상태 같은 것이 들어가면 더 복잡해집니다;;
허접한 답변 읽어주셔서 감사합니다.