그냥 공부삼아 대충 읽어만 보는거여서 틀린 부분이나 개소리같은 부분 혹은 보충하고싶은 부분 있으면 편하게 댓글 써주셈


거의 다 지피티 돌려서 읽은거고 그만큼 오류가 많을 수 밖에 없음


코드가 아니라 스크립트이긴한데 걍 코드라고 말함








시작하기 앞서 주구장창 나오는 Goal = 보스의 목표 ex) 플레이어에게 접근, 공격, 회피 등등


sub Goal =  목표를 이루기 위해서 하는 단계 ex) 플레이어를 공격하라면 먼저 플레이어에게 접근 > 공격 모션 > 공격 후 상황 이런 걸 서브 골이라고 함




viewimage.php?id=2bafdf2bf6dd3eb279bec4b0&no=24b0d769e1d32ca73fe884fa1bd625316dd475f54765644d803b78e6f2be0315feb69b20b2b60fd124d3d9a47a233e0b1b6f9573d87bbfb946ffe8998a3edc9ca539594b372c1f

1 ~ 11번째 줄


대충 보스 이름이랑 매칭 시키고


Goal.Activate는 보스전 시작하는 거인듯


그 밑에는 초기화랑 어떤 행동이나 확률을 담을 배열


GOAL은 보스의 행동 패턴 묶음 같은거라고 생각하면 되는 것 같다


12번째 줄도 있는데 그것도 초기화인것같음







viewimage.php?id=2bafdf2bf6dd3eb279bec4b0&no=24b0d769e1d32ca73fe884fa1bd625316dd475f54765644d803b78e6f2be0315feb69b20b2b60fd124d3d9a47a233e0b1b6f9573d87bbfb946ffe8cb8b6dd9cf09e28bd6839df7

13


delete는 보스한테 걸려있는 관찰(Observe)이벤트를 삭제시켜 줌


아마 혹시라도 보방 들어갈 때 컷신이나 그런 곳에서 오류로 플레이어 보스전 시작 전에 인식 할까 봐 초기화 시켜주는 듯?



addObserve는 미켈라단을 관찰하는 거임, 미켈라단에게 어떤 버프(페이즈 전환), 혹은 어떤 패턴(특정 패턴 후에 높은 확률로 후속 패턴이 나오는 등) 상태인지 미켈라단을 관찰하고 감지하는 코드임


그 밑에 DeleteObseve는 관찰을 해제하고 감지를 해제하는 코드




local distance 어쩌구는 플레이어와 미켈라단의 거리를 측정함


밑에 랜덤은 랜덤한 수 생성함, 패턴 랜덤하게 뽑을 때 쓰는 듯











viewimage.php?id=2bafdf2bf6dd3eb279bec4b0&no=24b0d769e1d32ca73fe884fa1bd625316dd475f54765644d803b78e6f2be0315feb69b20b2b60fd124d3d9a47a233e0b1b6f9573d87bbfb946ffe89c8539d8cc4e6df557977b4a

다음은 if 문이 좀 많이 붙어있는 보스 패턴의 확률을 정하는 코드임


21줄부터 201줄 까지임



먼저 제일 밖에 있는 if문

if ai:HasSpecialEffectId(TARGET_SELF, 20011574) then probabilities[31] = 1000


보스한테 붙은 특수 효과 확인인데 이게 정확히 뭘 말하는지 모르겠음


페이즈 전환일 수도 있고 아니면 특정 패턴 후속 패턴일 수도 있고 밑에 코드 읽다가 더 알게되면 추가함


근데 아?마 페이즈 전환 아닐까




아무튼 저 코드를 대충 요약하면


1, Has special effect는 전부 만약 미켈라단에게 특수효과(페이즈 상태?)가 있으면 X번 행동을 해라

이 코드가 1번이 ~상태 일때 그 1번이 또 ~ 상태이면으로 계속 물려있는 거임


2. 그 밑 local 머시기들은 미켈라단이 특수 효과(페이즈)나 특정 상태(특정 패턴 시전)면 변수를 0또는 1로 줘서

50 * f2_local5 << 이런 식으로 나중에 보스 패턴의 확률을 정해주는거임 저렇게 1 X 50해서 50퍼 확률로 만드는 식으로


3. 위에 1번에서 조건 다 뚫고 들어오면 if ai:IsInsideTarget(TARGET_ENE_0, AI_DIR_TYPE_B, 90) then << 이걸로보스가 플레이어 뒷쪽에 있는지 체크하고


4. 3번이 조건 만족하면 또 if distanceEnemy <= 4 then << 으로 플레이어가 보스랑 4미터 거리 안에 있는지 체크함


5. 그것까지 만족하면 probabilities[1] = 10 probabilities[2] = 10 probabilities[3] = 0 probabilities[4] = 10 이런 식으로 패턴마다 확률을 부여해줌


6. else 부분을 보면 else probabilities[43] = 100라고 되어있는데 이건 거리가 4 이상이면 43번 행동을 한다. 아마 거리가 멀면 라단이 뛰어오거나 아니면 뒤 돌거나를 말하는것 같음





 

79f3c028e2f206a26d81f6e445807169

당연히 이런 식으로 만약 조건을 만족하지 못한 상태면 그 때 패턴 확률도 다 부여됨









78f3c028e2f206a26d81f6e74481756bca

202부터 255번째 줄


probabilities[1] = SetCoolTime(ai, goal, 3000, 12, probabilities[1], 1)

<< 이거는 쿨타임임 3000번 모션은 12초의 쿨타임을 가지고 그 쿨타임을 probabilities[1], 1 이걸로 패턴에 반영하여 패턴이 나올 확률을 조정함


근데 이런 쿨타임 보니까 드는 생각인데 미켈라단은 똑같은 패턴을 연속으로 사용하는 상황이 거의 없었나? 구작 보스들이랑 엘 일부 보스들은 있던 것 같았는데




acts[1] = RE1GIST_FUNC(ai, goal, RaduarnOfMicare522000_Act01) << 이런건 미켈라단이 실제로 구체적인 패턴을 수행하는 코드라는데 사실 뭔소린지 잘 모르겠음




local after 어쩌구는 패턴이 끝나고 후속 행동을 정하는 코드, 패턴 끝나고 간격 조정이나 회피 거리 벌리기 등을 넣는다네


마지막 Common_Battle_Activate는 이때까지 설정한 행동을 바탕으로 이제 전투를 시작하는 거임

행동 확률이나 행동 로직 후속 행동 아까 앞에서 확률 조정한다고 언급한 것들을 마침내 적용하여 실행하는 거임






7bf3c028e2f206a26d81f6e24e857365

그 밑은 계속 이런 코드 반복인데

257줄부터 793줄까지 이런 코드가 계속 있음


코드는 죄다 콤보 공격 코드임


적과의 거리를 변수로 주고


적과 어느정도 거리가 되면 멈추고


어느 거리 이하면 뛰기 활성화가 되고


어느 거리 이상이면 무조건 뛰고


가드하면서 접근할 확률


뛰기 유지 시간은 어느정도인지등등


거기다가 Approach_Act_Flex(ai, goal, stopDist, canRunDist, forceRunMinDist, runProbability, guardProbability, walkLife, runLife) 에서 위에서 설정한 어케 걸을지를 다 적용 시키고


그 밑에 local goalLife쪽은


공격 유지 시간, 첫번째 공격 모션이나 두번째 공격 모션, 타겟, 패턴 성공 판정 거리등등이 있고



local random = ai:GetRandam_Int(1, 100)
if random <= 40 then
    animationId_2 = 3003
end << 거기다가 이런 랜덤 함수로 40퍼 확률로 2타 모션이 다른 모션으로 바뀌는 랜덤성 요소도 추가해 놓음


그리고 맨 밑에 goal:add머시기로 콤보 공격을 등록해놓음






7af3c028e2f206a26d81f6e346847365

자세히 설명은 안하겠지만 플레이어와 보스 사이의 거리 보고 회피 우선 순위같은거 정하고 if문은 플레이어 방향에 따라 어느 방향으로 회피 할껀지에 대한 코드임


이런 라단 무브셋이나 공격 콤보같은 코드가 한 500줄 있음








75f3c028e2f206a26d81f6ec4086726b


다음 코드는 보스가 공격 후에 어떤 추가 행동을 하도록 지정함 여기서 공격 후 행동을 담당하는 서브 골을 추가해준 다음


Goal.update 로 보스의 상태를 갱신하고 설정된 서브골이 없으면 기본 업데이트 처리를 함


그 밑 Goal.Terminate는 암것도 안넣어둔듯


(잘알들 있으면 이게 진짜 구현을 안한건지 아니면 나중에 일단 기본 생성자 느낌으로 만들고 어디서 호출해서 쓰는건지 알려주셈 잘 모르겠음;;)






그 다음으로 Interrupt는 특정 조건(회피등)을 만족할 때 미켈라단의 행동을 바꾸는 거임


이제 807줄부터 마지막 1400줄쯤까지 전부 이 코드임



첫번째 if문에서 보스에게 특정 이벤트가 있는지 체크하고


두번째 if문에서 첫번째가 맞다면 보스가 특수 효과 ID를 가지고 있는지 체크하고 원래는 보스의 이러한 효과를 감지하고 있었는데 ID확인하면 그 감지를 꺼버리고나서 


local distanceEnemy = ai:GetDist(TARGET_ENE_0)로 플레이어와의 거리를 측정하고 랜덤값 2개를 생성함


세번째 if문은 이제 근거리인지 확인하는거임, 근거리면 밑에 있는 콤보 공격을 등록하고 실행함, 앞과 마찬가지로 첫 공격 후 두번째 공격은 확률을 부여해서 패턴에 랜덤성을 넣음


goal:AddSubGoal(GOAL_COMMON_ComboRepeat_SuccessAngle180, goalLife, animationId, target, successDist, upAngleThreshold, downAngleThreshold, f36_local13, f36_local14)
                if random_2 <= 40 then
                    goal:AddSubGoal(GOAL_COMMON_ComboRepeat_SuccessAngle180, goalLife, animationId_2, target, successDist_2, upAngleThreshold, downAngleThreshold, f36_local13, f36_local14)
                end

<< 세번째 if문 코드




한마디로 여기 if문은 앞에서는 그냥 가만히 있었을 때 어떤 패턴이 나올지에 대한 코드였고 이 코드는 회피같은 특수한 상황이 플레이어에게 적용 되었을 때 어떤 패턴이 나올지에 대한 코드인듯



그 이후로는 끝까지 이런 코드 반복임 







74f3c028e2f206a26d81f6e44788716c7c



하나 더 해보면 이거도 마찬가지임


특수 효과 체크하고, 특수 효과 감시 삭제하고, 플레이어랑 거리 체크하고, 랜덤값으로 어떤 공격 쓸지 결정하고 


if ai:HasSpecialEffectId(TARGET_SELF, 20011599) and distanceEnemy <= 13 

<< 여기는 이런 식으로 콤보에 적이 가까이 있을 때만 특수 콤보 발동하는 식의 코드도 있는 듯



그 밑 if 문들은 70퍼 확률로 1번 패턴 15퍼 확률로 2번 패턴 나머지 15퍼 확률로 3번 패턴이 실행되는 구조임





7ced9e36ebd518986abce8954486726401



Re1gisterTableGoal(GOAL_RaduarnOfMicare522000_AfterAttackAct, "RaduarnOfMicare522000_AfterAttackAct")
RE1GISTER_GOAL_NO_SUB_GOAL(GOAL_RaduarnOfMicare522000_AfterAttackAct, true)


서브 골을 설정한다와 서브골 안에는 추가 서브 골을 넣지 않겠다는 코드


Activate는 또 암것도 없음, 진짜 없는건지 내가 모르는 무언가가 있는건지 모르겠는데 잘알들이 설명해주셈, 잘 모르겠음;;



Update는 위에서 한번 사용 됐을텐데 그 코드임




AI의 상태를 계속 체크하고 서브골이 하나도 없으면 기본 처리 흐름을 따라가라


=


보스 행동 보고 더 할 패턴 없으면 상위 패턴으로 돌아가 버리라는 거임, 남아있으면 그거 마저 실행하고


한마디로 미켈라단 운석 - 분신 패턴을 예로 들면


운석 < 분신 < 하늘에서 내려와서 찍기 < 땅 뒤짚기 순서로 출력되어야하는데


운석 분신 하늘은 진행중이면 뒤에꺼나 마저 패턴 나오고 땅 뒤짚기가 나오면 이제 패턴 끝난거니까 맨 처음 상태로 돌아가서 새로운 패턴 시전해라 같음









심심하고 흥미롭기도하고 한번쯤 이런거 읽어보고 싶어서 읽어봤는데 생각보다 되게 재밌었음


행동[30]이런 식으로 나와있어서 이게 어떤 패턴인지는 모르지만


그거 알면 결국 패턴이 어떤 식으로 어떤 확률로 어케 동작하는지 알 수 있을것같음


아마 미켈라단 약속의 왕 패턴 때 코옵하면 지 좆대로 끊고 다른 패턴 시전하는 것도 여기 코드 안에 숨어있지 않을까?


암튼 굉장히 재밌었음 이거 뜯어준 갤럼에게 감사