미드나잇 블루는 적도 스킬 수의 제한 (카드 장수 형식) 을 가지고 있으므로
적이 만약 스킬을 사용할 수 없게 된 경우에는 일반공격 혹은 방어를 선택해야 합니다.
그리고 기본 공격/방어 역시 스킬 카드의 모양을 보여주어야 하므로
다음과 같은 루프문을 짜서 적용시켰습니다.
알고리즘 적으로 정리되지 못하고 좀 조잡한 느낌이 있긴 하지만
실행 시간에는 큰 영향을 미치지 않더군요.
( 사실 이건 나중에 고쳤다가 잘못되버릴 경우를 대비한 백업 )
# 우선 루프는 적의 행동이 결정될때까지 반복되어야 하므로 loop 반복문을 사용
loop do
# 처리시간 존재하는 loop 문 내에서 그래픽은 update 하지 않으면 안되더라
Graphics.update
Input.update
# available_actions 배열은 루프문 앞에서 make_action 메소드 내부에 정의 되어 있다.
if available_actions.size == 0
# 만약 사용 가능 스킬이 하나도 없을 경우, 크기 2의 난수를 활용해서
random_num = rand(2)
# 50% 확률로 공격과 방어 구분
if random_num % 2 == 0
# kind 가 0이면 skill 이외의 행동을 의미
self.current_action.kind = 0
# basic 이 0이면 공격, 1이면 방어
self.current_action.basic = 0
# skill_id는 사실상 카드를 표현하는데 쓰인다. 998 과 999는 실질적으로 사용되는 스킬이 아닌 카드 표시용 이미지만 가진 스킬
self.current_action.skill_id = 999
# 공격시 랜덤타겟을 뜻한다.
self.current_action.decide_random_target_for_enemy
# 리턴은 루프를 끝내기 위해 필요
return
# 솔직히 브레이크는 필요없다. 무한루프 방지용 안전빵이라는 것으로.
break
# 이거슨 방어. (kind 0, basic 1) 바로 위의 공격 부분과 동일
elsif random_num % 2 == 1
self.current_action.kind = 0
self.current_action.basic = 1
self.current_action.skill_id = 998
self.current_action.decide_random_target_for_enemy
return
break
end
end
# avaiable_actions 는 배열이다. action 은 앞의 배열 중에서 한 element를 뽑기 위한 index로 사용
action = available_actions[i]
# action의 rating은 3이상 차이나게 하지 말자.
if action.rating > rating_max - 3
if value < action.rating - (rating_max - 3)
# 랜덤 변수 value가 rating 범위 내에 들었을 경우,
# 해당 스킬을 current_action에 대입 (kind는 1, basic은 상관없음, skill_id는 해당 skill의 id
self.current_action.kind = action.kind
self.current_action.basic = action.basic
self.current_action.skill_id = action.skill_id
# 이 부분은 미드나잇 블루만의 스킬 데이터베이스에 속한
#has라는 자기참조 메소드. has[i] 는 id " i " 의 값을 가진 액터가 가진 스킬의 수를 의미.
# 액터가 적일 경우, id 에 100을 더한 값의 index에 값을 저장한다.
# 이 경우, 해당 스킬의 스킬카드의 장수가 0 이하일 경우
if $data_skills[self.current_action.skill_id].has[self.id + 100] <= 0
# 유효 액션에서 해당 스킬을 지운다.
# 세이브/로드 시 이 정보는 기록되지 않으므로 전투 1회에 한정된다.
available_actions.delete(action)
# 루프 테스트용 윈도우 출력 구문.
# p available_actions
# 루프 진행용 변수 i. 만약 유효액션보다 i가 커지면 i값 초기화
i += 1
if i >= available_actions.size
i -= available_actions.size
end
#만약 원하는 스킬을 얻지 못했을 경우 루프를 종결시키지 않고 진행시킨다.
next
end
# 만약 스킬의 내용이 정해졌다면 타겟을 정하고 return 한다.
self.current_action.decide_random_target_for_enemy
return
break
else
value -= action.rating - (rating_max - 3)
end
end
# 역시 루프 진행용 변수 i.
i += 1
if i >= available_actions.size
i -= available_actions.size
end
end