게임중 랜덤 트리거 확률을 자유롭게 변경해 보자

※예제맵 다운로드
1. noname30




안녕하세요? noname01입니다.
오늘은 게임중에 확률을 자유롭게 바꿔보는 방법에 대해
알아 봅시다.

그러니까 이게 무슨 말인가 하면 예를들어
10%의 확률로 당첨되는 복권 트리거를 만든다고 합시다.
그럼 보통 랜덤 스위치를 여러개 돌려서 그걸 2진수로 변환하여
수치화 시킨후 그것의 범위를 인식하여 확률을 만들 것입니다.

그런데 만약 게임 중에 특정한 경우 당첨 확률을 20%로 만들고
싶다면??? 이럴 경우 확률을 수치화시킨뒤 그 수치의 범위를
인식하는 트리거를 하나 더 만들어서 그 트리거에 원하는 특수
상황을 인식 할 수 있는 조건부분을 추가 해 줄 것입니다.

물론 이런 방식을 써도 틀린것은 아니며 오히려 더 쉬운
방법입니다. 그러나 만약 확률을 변경하고 싶은 특수한 상황이
매우 많고 그 확률의 종류도 다양하다면???
그때는 당연히 그 확률의 종류마다 인식하는 트리거를 각각
만들어 줘야 할겁니다. 그러나 여기서 설명하는 기술을 사용하면
게임중에 변수조작 하나만으로 자유롭게 확률을 변경 할 수
있습니다.

단순히 규칙없이 확률을 변경시키거나, 변경하고 싶은 확률의
경우가 적은 경우는 처음에 설명한 방법이 훨씬 편합니다.
그러나 이 기술의 특성상 규칙적으로 확률을 변하게 만들때는
강력한 힘을 발휘합니다. 왜냐하면 확률의 변경 방식이 새로운
트리거 추가가 아닌 트리거를 이용한 변수조작이기 때문이죠.
(변수 조작으로 확률을 변경 할 수 있다는 소리는 Add/Subtract
를 이용하여 확률을 변경 할 수 있다는 소립니다.)

자 그럼 본격적으로 설명에 들어가.... 기 전에 먼저 읽고
오셔야 할 팁이 있습니다. 물론 지난번과 마찬가지로 이미
알고 계시는 분은 그냥 패스해 주시면 됩니다.
링크1의 팁은 필수로 읽어 주셔야 하구요(모르신다면),
만약 랜덤 스위치의 결과를 2진수를 이용하여 수치화 하는 방법을 모르신다면
링크2의 팁도 읽어 주세요.

링크1 : [Archonex]3강 -《스타안의 수학 - 2진법 등분》(수정판)

링크2 : [MS] "분배 합산 값 스위치 트리거 구조"


자 다 읽고 오셨으면 이제 본격적으로 설명에 들어갑니다.
먼저 랜덤 스위치의 결과를 2진법을 이용해 수치로 나타내 그
수치를 저장한 변수를 X라고 정해놓고 설명을 하겠습니다.
우선 기존의 방식을 모식도(?)로 나타내 보면 아래 그림과
같습니다.(그 그림밑의 설명도 읽어주세요.) 여기서는 4가지
사건을 각각 25%의 확률을 가지는 그래프를 만들어 볼겁니다.

30-1

위 그림에서 세로로 그어진 푸른 선들은 고정된 값입니다. 이
값들이 X의 값의 범위를 인식할때 쓰이는 트리거의 조건부에
삽입된 값이라고 보시면 됩니다. 그리고 가로로 그어진 굵고검은
선이 변수X를 나타내는 값입니다. 당연히 랜덤 스위치의 결과에
따라 변하면서 위아래로 움직이겠죠? 값을 대입하여 설명하면
변수X가 0이상 10미만일때(여기서 포함관계는 그냥 넘어갑시다.)
a사건이 일어납니다. 그리고 X가 10이상 20미만일때 b사건이
일어나겠죠. 이런식으로 d사건까지 만들어지게 됩니다. 이때
실제 확률값은, 제일 긴 세로막대의 길이(40) 분의, 각
세로막대와 바로 다음의 세로막대의 길이차가 되는데 안타깝게도
세로막대는 처음부터 트리거의 설정된 값이므로 게임중에 길이
차이를 변경 할 수가 없습니다.

그래서!!! 둘을 완전 뒤바꿔 버리기로 했습니다. ㅇㅅㅇ
그 결과 원하는 사건의 갯수만큼 변수가 필요하게 되어 버렸기
때문에 변수의 낭비가 심하다는 심각한 단점이 생깁니다.
어쨌든 간에 둘을 뒤바꾸고 나면 아래 그림처럼 될 것입니다.

30-2 : 이 그림에서는 푸른 세로막대를 위쪽으로만 이동(더하기)했지만 아래쪽으로 이동(빼기)해도 상관 없으며 실제 이 팁의 예제맵에서는 아래쪽으로 이동하는 것을 사용합니다.

이번에는 반대로 굵고 검은 선이 고정되었고, 푸른 세로막대가
움직이는 형태입니다. 당연히 푸른 세로막대가 움직이는 양은
변수X로 결정합니다. 그러므로 모든 세로막대는 동일한 양만큼
움직이게 됩니다. 이것은 내가 탄 지하철이 가만이 있고, 반대편
의 지하철이 오른쪽으로 움직일때와 내가 탄 지하철이 왼쪽으로
움직이고, 반대편의 지하철이 가만히 있을때 내가 눈으로 보기에
는 차이가 없는것과 마찬가지입니다.(물론 배경은 제외.)
결과적으로 굵고검은 선이 변수X만큼 움직이나, 굵고 검은 선을
제외한 나머지 세로선들이 모두 변수X만큼 움직이나, 결과적
으로는 같은 효과를 낸다는 말입니다.
이때 각 사건의 확률을 나타내는 푸른 세로막대가 모두 각각의
변수로 이루어져 있으므로 이것을 수치상으로 변경하기만 하면
자유롭게 세로막대 길이의 차이를 조절할 수 있어, 결과적으로
확률을 자유롭게 바꿀 수 있게 되는 것입니다.

자 그럼 이론적인 설명은 이정도로 하고 실제로 트리거를 만들어
봅시다. 늘 그러했듯이 예제맵 기준으로 설명합니다.
우선 예제맵에서는 a사건을 P1의 일반 마린을 Create하는것으로
하고 b사건을 P1의 영웅마린(짐레이너)를 Create하는것으로
만들어 볼겁니다. 그러므로 위에서 보여드린 이미지의 푸른 세로
막대기에 해당하는 변수는 2개가 필요하겠군요. 여기서는 그
두개의 변수를 미네랄필드 타이프1과 미네랄필드 타이프2의
데스값을 사용하도록 하겠습니다.
(여기서 사용되는 모든 셋데스나 미네랄은 전부 player1입니다.
물론 필요하신대로 유닛 이나 플레이어를 다른것으로 바꾸셔도
됩니다.)

그런뒤 변수X의 범위를 정해 줍시다. 여기서는 백분율을 충실히
(?) 따르기 위해 0~99까지를 변수X의 범위로 정해 줄 겁니다.
단 랜덤 스위치의 결과로는 2^n-1단위로만 만들 수 있기 때문에
랜덤 스위치의 결과가(변수X의 범위가) 100~127까지 나왔을 경우
스위치를 스위치를 처음부터 다시 돌려서 0~99사이의 값이 나올
때 까지 반복하도록 루프를 짜 주셔야 됩니다. 여기서는 아까도
언급했듯이 0~99까지의 값을 사용할 것이므로 이 범위를 포함
하는 최소의 2^n-1값은 127이 되며 n이 7이 되겠군요.
따라서 스위치를 7개 사용해야 합니다.(이것은 링크2의 팁을
참고해 주세요.)

여기서는 미네랄필드 타이프1과 미네랄필드 타이프2에 미리
적당한 수를 입력해 그 값에서 변수X의 값만큼 빼 주는 방식으로
푸른 세로막대를 움직일 것 입니다. 그러면 그 적당한 값을
구해서 미리 트리거로 입력 시켜놓는게 먼저 해야 할 일이겠죠.
우선 초기 확률은 1:1 즉 일반 마린이 나올 확률이 50%가 되도록
만들 것이므로, X의 값이 0~49일때는 일반 마린이, 50~99일때는
영웅 마린이 생성되도록 만들면 될 것입니다.(물론 반대로 해도
상관 없습니다.)이때 이 값에다가 변수X가 가질 수 있는 최대
경우의 수인 100을 더해 준 값을 각각 미네랄필드 타이프1과
미네랄필드 타이프2에다가 저장해 주면 됩니다.(물론 X의 범위가
달라지면 여기서는 100을 더했지만 이 값도 역시 달라져야
합니다. 여기서 100만큼 더해주는 이유는 스타크래프트의 변수
저장 특성상 음수가 저장되지 않기 때문입니다. 여기서는 100보다
작게 할 경우 일반마린이 나올 확률을 0으로 변경시 음수
처리불가로 인한 오류가 생기게 됩니다.) 그러면 미네랄필드
타이프1의 초기값은 149, 미네랄필드 타이프2의 초기값은 199로
설정해 주시면 됩니다. 그리고 여기서는 현재의 확률 상태를
쉽게 알아보게 하기 위해 미네랄로 일반 마린이 나올 확률을,
가스로 영웅 마린이 나올 확률을 띄워 줄 것이므로 미네랄과
가스 모두 초기값을 50으로 만들어 주는 액션을 만들어 줍시다.
아래는 트리거 입니다.

30-3

이제 초기값도 설정했으니 0~99사이의 값(0, 99포함)인 변수X를
구하는 트리거를 만들어 봅시다. 여기서는 변수X로
베스핀 게이저의 데스값을 이용할 것입니다. 위에서 스위치를
7개 사용할 것이라고 정했으니 그대로 만들어 주시면 됩니다.
아래는 스샷 입니다. (로케이션 설정스샷 포함되어 있습니다.)
(자세한 설명은 링크2의 팁을 참고해 주세요. 트리거가 약간
다를 수 있으나 근본적으로 원리는 같으니까 잘 생각해 보시면
쉽게 이해하실 수 있을 겁니다.)

30-4

변수X의 값을 구해서 베스핀 게이저의 데스값에 저장을 했으면
이제 그 값을 이용해 푸른색 세로막대를 움직여야 하겠죠.
그러기 위해 미네랄필드 타이프1과 미네랄필드 타이프2의 데스
값에다가 베스핀 게이저의 데스값을 빼 줍니다. 아래는 스샷
입니다.(자세한 설명은 링크1의 팁을 참고해 주세요. 여기서는
링크1의 팁을 응용한 트리거가 사용되어서 약간 다를수 있으나
근본적인 원리가 같으므로 잘 생각해 보시면 쉽게 이해 하실수
있습니다. 밑의 트리거에도 링크1의 팁이 많이 사용되었으므로
더 이상 이 설명을 반복하지 않겠습니다. 아래의 트리거에
2^n꼴의 숫자가 많이 들어가 있으면 대부분 링크1의 팁을 이용
했다고 보시면 됩니다.)

30-5

여기서 미네랄필드 타이프3의 데스값에다가 뺀만큼 더해주는 이유
는 나중에 계산을 완료하고 나서 미네랄필드 타이프1과 미네랄
필드 타이프2의 데스값을 원래대로 복원하기 위함입니다.

이제 푸른색 세로막대기를 이동하는 작업을 마쳤으니 이제 인식
을 하여 마린, 또는 영웅마린을 생성하는 트리거를 만들어 줘야
합니다. 베스핀 게이저의 데스값이 0~49일때 일반 마린을
생성하기로 했는데 이 경우, 초기값이 149였던 미네랄필드
타이프1의 데스값에다가 베스핀 게이저의 데스값을 뺀 값의
범위는 100~149(≥100)가 될 것입니다. 또 초기값이 199였던
미네랄필드 타이프2의 데스값에다가 베스핀 게이저의 데스값을
뺀 값의 범위는 150~199(≥100)가 되겠네요.

마찬가지로 영웅 마린도 해 봅시다. 베스핀 게이저의 데스값이
50~99일때는 영웅 마린을 생성하기로 했는데 이 경우, 초기값이
149였던 미네랄필드 타이프1의 데스값에다가 베스핀 게이저의
데스값을 뺀 값의 범위는 50~99(<100)가 될 것입니다. 또
초기값이 199였던 미네랄필드 타이프2의 데스값에다가 베스핀
게이저의 데스값을 뺀 값의 범위는 100~149(≥100)가 되겠네요.

이때 두개의 차이점을 잘 보시면 일반 마린이 나와야 할 경우
에는 미네랄필드 타이프1의 데스값이 100보다 같거나 큽니다.
그러나 영웅 마린이 나와야 할 경우에는 미네랄필드 타이프1의
데스값은 100보다 작고 미네랄필드 타이프2의 데스값은 100보다
같거나 큽니다. 이것을 이용하여 일반 마린을 생성할지, 영웅
마린을 생성할 지를 결정합니다. 아래는 그 트리거 입니다.
긴 설명에 비해 트리거는 간단하죠. ㅇㅅㅇ

30-6 : properties설정은 유혈사태(?)를 막기 위해 마린과 영웅 마린을 무적 상태로 생성하기 위한 것입니다.

이제 계산을 마쳤으면 마지막으로 지속적으로 이 확률 계산이
가능해지도록 미네랄필드 타이프3의 데스값에 저장된 값을 다시
미네랄필드 타이프1과 미네랄필드 타이프2의 데스값에다가 더해
줍니다. 아래는 트리거 입니다.

30-7

이제 마지막으로 확률을 변경하는 트리거를 만들어 봅시다.
여기서는 테란 시민을 왼쪽에 있는 로케이션인 'M+10, G-10'
안에 들어가면 일반 마린이 나올 확률을 10% 상승시키고, 영웅
마린이 나올 확률을 10% 감소시킬겁니다. 반대로 테란 시민을
오른쪽에 있는 로케이션인 'M-10, G+10'안에 들어가면 일반 마린
이 나올 확률을 10% 감소시키고, 영웅 마린이 나올 확률을 10%
증가시킬겁니다. 원래 이 작업을 간단하게 하기 위한 기술이므로
이 부분의 트리거는 별로 복잡한게 없습니다.
단순히 일반 마린이 나올 확률을 10% 증가 시키려면 미네랄필드
타이프1의 데스값에다가 10을 더해 주면 됩니다.
반대로 영웅 마린이 나올 확률을 10% 증가 시키려면 미네랄필드
타이프1의 데스값에다가 10을 빼 주면 됩니다.
여기서는 미네랄과 가스로 일반 마린이 나올 확률과 영웅 마린이
나올 확률을 표시할 것이므로 미네랄과 가스량을 조절해 주는
액션도 삽입했습니다. 아래는 트리거 입니다.

30-8

자 마지막 과정인 미네랄필드 타이프1의 데스값에다가10을
더하거나 뺀 과정에 의해 변경된 그래프의 모양을 살펴봅시다.
먼저 미네랄필드 타이프1의 데스값에다가 10을 더한 경우입니다.

30-9 : 그림이 약간 어설프더라도 이해해 주세요.^^

이렇게 두 세로막대의 길이 차이가 변경되어 확률이 변경 된
것을 볼 수 있습니다. 이번에는 미네랄필드 타이프1의 데스값
에다가 10을 뺀 경우 입니다.

30-10 : 그림이 약간 어설프더라도 이해해 주세요.^^

역시 두 세로막대의 길이 차이가 변경되어 확률이 변경 된 것을
확인 할 수 있습니다.

여기서는 2가지의 사건을 가지고 만들었으나, 미네랄필드
타이프1과 미네랄필드 타이프2의 데스값 역할을 하는 변수를
더 추가하면 추가한만큼의 사건을 더 추가할 수 있습니다.
단 추가한 후 확률을 변경할때 그 변수들중 초기값이 최대인 값
(여기서는 미네랄필드 타이프2)의 값은 변경하시면 절대
안됩니다. 그말은 즉 그보다 작은 변수들의 수치조작만으로도
충분히 확률을 조정 할 수 있다는 소리입니다. 한가지 또 명심
하셔야 할 점은 미네랄필드 타이프1의 데스값과 같은 역할을
하는 변수 조작을 하게 되면 한개의 변수 조작으로 2개 사건의
확률이 동시에 변경
된다는 점입니다. 따라서 사건이 3개 이상
일때는 신중하게 수치 변경을 해 주셔야 합니다.

결과는 백문이 불여일견이라고(약간 다르지만... 그냥인용...)
스크린샷 보다는 예제맵을 실행시켜보는게 더 좋을것 같아서
따로 올리지는 않겠습니다. 예제맵을 실행시켜 보세요.


끝까지 읽어 주셔서 감사합니다.
이상 noname01의 팁이었습니다.


P.S. 인용된 팁(링크걸린팁)의 작성자
링크1 : Archonex
링크2 : jin3


P.S.2 실은 경우의 수가 n이면 푸른 막대에 해당하는 변수는 n-1개가 필요합니다.
즉 경우의 수가 2가지인 경우에 해당하는 여기서
Mineral Field(Type 1)과 Mineral Field(Type 2)두 개가 사용되었는데
Mineral Field(Type 2)는 없어도 상관이 없습니다. 다만 설명에서 쓸데없는 푸른 막대
하나를 더 집어넣은 이유는 설명을 돕기 위해서 입니다. 그점 유의해 주시기 바랍니다.




다른 맵 제작 팁을 보려면 이 이미지를 클릭해 주세요.