이 블로그 검색

2018년 11월 27일 화요일

HOMM3)축복마법과 저주마법에 의한 데미지 기대값 변화

고급 저주마법이 반올림인지 올림인지 내림인지를 몰라서 그냥 내림으로 계산했다. 확인해보고 아닐 수 도 있다. 정말 재미 있는 부분은 저주와 축복이 서로 상쇄 관계에 있다는 것이다. 
  축복마법의 효율이 매우 뛰어나다. LV1-3은 고급축복에 대해서 다 1.5를 넘는다. '슬레이어' 마법이 매우 한정적인 상황에서 공격력을 8을 올려줌으로 인해 최대 1.4의 변화율을 보일 수 있게 된다.  블러드러스트나 정확마법도 최대 1.3까지의 변화율을 가지므로, 공격적으로 사용할 때는 블레스만한 마법이 없다.  
  저주마법의 변화율을 보라. 쉴드마법의 변화율이 잘나가야 0.7이고, 에어쉴드마법은 그나마 0.5이지만, 저주마법만 걸리면 천사를 제외하고는 전부 쉴드보다 강력하다. 사실 지혜 없이 슬로우를 안배운 상황에서는, 불마법도 상대적으로 쓸만하다. 
  
블레스 마법의 효율이 매우 좋다.  물정령도 블레스가 걸린다. 다만 마법의 정령은 걸리지 않는다. 
  저주 마법의 효율이 매우 좋다. 다만 불정령은 이프리트 만들면서 코드를 공유했는지 공격마법을 뺀 나머지 마법도 안 걸린다.  걸리는 친구 기준으로는 고급쉴드보다 좋다. 다만 쉴드에 면역인 유닛은 별로 없어서...

공기의 정령은 고급 축복, 고급 저주를 서로 상쇄 했을 때 효율이 최고이다. 
저주에 걸려있는 상태에서 축복을 걸면 9배 강력해진다. 그 반대도 생각할 수 있다. 
축복은 초반 확장하는데 있어서 있으면 좋은 마법이다. 하지만 없을 확률이 높다. 

저주마법의 효율을 보라.  끝내준다. 왠만하면 방패보다 좋다. 블랙드래곤의 경우는 쉴드가 안걸리니, 드래곤을 아낀다면 저주마법이다. 
순서가 이상하다는 것을 지금에야 알았다. 업그레이드 까지 포함해서 하위 3유닛과 그다음 3유닛이 똑같은 데미지라 그래프가 재미있다. 인퍼노의 희망(?)  고르곤과 와이번 이 두 유닛은 축복의 효율이 그리 좋지 못하다. 어차피 와이번은 성벽에서 쏘는 화살 맞아 죽고 고르곤은 머리수로 싸우니 다른 유닛에게 좋은 마법이니 좋은 마법이다. 
  저주마법에 굉장히 허약하다. 저주마법으로 상대하기도 좋고, 쉴드로 내 방어력을 올리는 방식은 파리들이 날아다니면서 툭툭치는 상황에서는 좋지 못하므로, 둘다 고급이면 포트리스 상대로는 저주를 사용하자. 하지만 보통은 슬로우를 건다.


축복효율이 그리 좋지 못한 종족이다. 개는 빌드오더상 밀려 있고, 
임프는 체약체의 비싸고, 그리고 어차피 마법길드에서 안나온다. 
고레벨 유닛들에게 효율이 고만고만하다. 다만 공격력 상승마법의 최강자는 여전히 축복이다. 
  저주 마법이 최고의 공격력 감소 디퍼프마법이지만, 유난히 똥개에게는 강력한 마법이다. 고급 저주가 있다면 똥개는 바보가 된다. 

안 걸리지만 일괄적으로 해봤다. 걸리기만하면 참 쓸만한 마법이지만, 언데드가 축복을 받는다는것은 좀 이상하다. 
  그냥 상대방에게 저주나 걸자 저주나올 확률이 54%라고 한다. 
고레벨 유닛의 축복 효율이 떨어진다. 초반확장에 있어서 매우 쓸만한 마법이다. 초급으로 엘프에게 1.25 고급으로 1.5이다. 고급 기준으로 2발이 세발되는 것이다. 
   일단 저주마법에 걸린다면, 쉴드보다 효율이 좋은 편이다. 그랜드 엘프 기준으로는 공기방패마법보다 좋다. 초급이어도, 그랜드엘프를 저주하도록 하자. 
비슷한 형상이다. 오크랑 고블린이 축복의 혜택을 많이 받는데, 별론 좋은 구성은 아니다. 울프라이더도, 1.43까지 나오므로, 쓸만하다. 초급은 1.14로, 굉장히 효율이 떨어지는 편.

저주마법의 효율은 고급유닛에게는 대략 0.6 언저리, 초급유닛들은 고블린 빼고 0.3 언저리다. 슬로우걸고 하나씩 때려잡다가 하나남은 오우거 무시하고 정리하다 후회하지말고 걸 수 있으면 걸자. 

축복효율이 극히 떨어지는 편이다. 초반확장시에도 초급축복이 그램린에게 효율이 1.33밖에 안된다. (1.33이면 다른 마법으로는 범접할 수 없이 큰 수이긴하지만 ) 나가는 고급기준으로 1.05, 1.03 상승이다. 그래도 3궁수에게 2.0, 1.25, 1.22라는 좋은 비율의 기대값 상승이 있으니 걸 수 있으면 걸자, 
  저주마법이 공기방패마법보다 못하다. 메이지만 같은 효율이다. 나가말고는 옆에 보호유닛들에게는 그래도 쓸만한 효율이다. 나가에게도 0.75,0.77은 되므로 대전투시에는 쓸만한 마법이다. 3궁수 체제에서 근거리 원거리로 이 정도만 되어도 어디인가.



이전 글에 히어로즈의 전투에서 한스택의 데미지 계산방식을 올렸다. 10기까지는 각각 한개체에 대해서 모두 따로 균일한 분포로 최저에서 최대 데미지뽑기를 한다고 하였다. 그렇기에 가운데가 볼록해져, 데미지의 기대값이 중요하다. 기대값을 기준으로 축복마법의 효율과 저주마법의 효율을 살펴보았고, 축복마법의 강력함과 저주마법의 강력함을 보았다. 

  특별히 방어력 상승용 마법의 대안으로 저주를 자주 살펴보았는데, 왠만한 상황에서는 저주가 좋은 대안이 되는 것을 알 수 있다. 

2018년 11월 16일 금요일

Vim 정규표현식 패턴 이해하기.

패턴. (help pattern 하면 나오는 부분에 대한 해설을 할거다. )


2. The definition of a pattern 패턴의 정의.
초짜는 help usr_27.txt를 찾아보시라 :help usr_27.txt라고 하면 됨.



1. 패턴은 가지의 or 연산 결과를 합한다.
  (한국말로 여러가지패턴을 찾을 수 있다.
  사실 패턴간 연산 순서를 말하는건데 concat이니 branch니 이래서 어려움)

pattern ::= branchA \| branchB \|branchC

A를 만족하거나 B를 만족하거나 C를 만족하거나.

예 이철수 \| 김철수 \| 박철수
라고 하면 이철수 또는 김철수 또는 박철수를 말한다.

2. 접붙이기 (And연산) 이다.  (concat이 식물학에서 뭘 의미하는건가?)
이 번에는 순서가 중요하다.
  branch ::=       concat
               or  concat \& concat
               or  concat \& concat \& concat

foobeep\&...   -> 을 해석하면 foobeep이라는 글자에서 foo 글자를 말한다 .
.*Peter\&.*Bob 는 Peter와 Bob을 모두 포함하는 Line 을 가리킨다.

첫번째 검색은 줄 전체를 검색해서 모든 문자열에서 Peter로 끝나는 문자열을 가리킨다. vim help 문서내에서 테스트 해볼 수 있다.

그 다음, 그 문자열을  다시 두번째 concat으로 검색을 한다. 그러면 라인처음에서 Peter 사이에 Bob로 끝나는 문자열을 내뱉는다.

   sjdklfjaslkj Peter klsjdlkfjs Bob kjdsklfjskdljfkl Peter    -- Matched
   lkjdslfkjsdlkjflk Peter lksdjflkjs Bob sdjflksjdlf klsdjflksj -- Not matched

상당히 요상하다.  Peter와 Bob가 모두 포함된 라인은 다음처럼 검색하면 된다.   .*Peter.*\&.*Bob.*
 Peter가 포함된 줄의 Bob만 찾는 다면 .*Peter.*\&Bob이다.

이 패턴이 찾기에 사용될 때는 커서의 위치가 패턴의 시작으로 가므로 중요할 수 있고,  찾아바꾸기에 사용될 때는 패턴의 끝도 중요해진다.

3. concat은 여러 조각으로 이루어진다.
 이미 쓰고 있었다. foo는 f다음에 o가 오고 또 o가 오는 문자열을 말한다.
  f[0-9]b 이 것은 f다음에 0-9중 하나가 오고 b가 오는 문자열 패턴이다.

4. 조각은 한개의 atom 또는 atom의 시퀀스를 말한다.


 piece   ::=      atom
               or  atom  multi
 예)   a*    "" a aa aaa aaa aaaa 등등

5. atom은 한 문자 또는 패턴이다. (??)
  여기서 부터 재귀라는 것을 알 수 있다. 패턴을 정의하는데 패턴을 알아야하니까 사실 그냥 다 패턴이고, 패턴간 연산순서로 기억하자.  그냥 국어적 의미도 필요없고 각자가 생각하는 패턴이 왠만하면 잘 맞으니까 무시하자. 

그냥 글자를 ordinary-atom이라고 부른다고 한다. 뭐 유니코드 같은건 수바이트가 한개의 atom이니까 ascii문자를 의미하는건 아니니까 오해하지 말자.

\(pattern\) 괄호로 묶으면, 온전한 한개의 패턴이 atom이 된다.
v\(abc\)*z 는  vz -> vabcz -> vabcabcz 뭐 이런 것이 되겠지.

저 atom 과 multi를 정의하는거는 쉽게 공부할 수 있다.



3. Magic

  문자열 내에 문자가 문자그대로가 특수한 역할을 맡을 때가 있다 그것을 Magic이라고 한다.  문자열을 최대한 자연스럽게 표현할 것이냐, 아니면 패턴을 최대한 쉽게 타이핑할 것이냐를 어떻게 설정할 것인지 vim에서는 조절할 수 있다.

after:    \v       \m       \M       \V         matches                'magic' 'nomagic'          $        $        $        \$         matches end-of-line          .        .        \.       \.         matches any character
         *        *        \*       \*         any number of the previous atom
         ~        ~        \~       \~         latest substitute string
         ()       \(\)     \(\)     \(\)       grouping into an atom
         |        \|       \|       \|         separating alternatives
         \a       \a       \a       \a         alphabetic character          \\       \\       \\       \\         literal backslash          \.       \.       .        .          literal dot          \{       {        {        {          literal '{'          a        a        a        a          literal 'a'
설정을 해도 딱히 몇개 바뀌지는 않는다. magic을 어떻게 하는지가 패턴을 많이 쓰는 vim하고 perl이 좀 달라서 혼동스러운데, 그럴때는 그냥 명시적으로 해결해라. perl에도 magic 설정이 가능한지는 모르겠다.



          multi     'magic' 'nomagic'  matches of the preceding atom /star   *       \*      0 or more       as many as possible
/\+     \+      \+      1 or more       as many as possible (*)
/\=     \=      \=      0 or 1          as many as possible (*)
/\?     \?      \?      0 or 1          as many as possible (*)
정규표현식은 cmd 창에서 쓰는 ?*하고는 다르다. 그러나 훨씬 다양한 패턴이 가능하므로 숙지하자. 여기가 가장 기본이다. \+도 사실 잘 안쓰인다. 그냥 글자를 한번더 찍어서 표현하자 . a\+ -> aa* 어차피 타이핑수도 동일하다.
/\{     \{n,m}  \{n,m}  n to m          as many as possible (*)        \{n}    \{n}    n               exactly (*)
       \{n,}   \{n,}   at least n      as many as possible (*)        \{,m}   \{,m}   0 to m          as many as possible (*)        \{}     \{}     0 or more       as many as possible (same as *) (*)
  기억하기 어렵지않다. 요거는 보통 dvc10003.jpg 같이 이미지 파일의 자리수와 관련된 일을 할 때 많이 쓴다.
/\{-    \{-n,m} \{-n,m} n to m          as few as possible (*)        \{-n}   \{-n}   n               exactly (*)
       \{-n,}  \{-n,}  at least n      as few as possible (*)        \{-,m}  \{-,m}  0 to m          as few as possible (*)        \{-}    \{-}    0 or more       as few as possible (*)
   요거 중요하다. 그리고 유용하다. 위에 있는 친구들은 전부다 as many as possible이라서 
 아까 있던 Peter.*Bob이라는 글자 지우려다가 한줄 전체를 날리는 경우가 허다하다. 그럴 때는 u를 누르고 요거를 쓰면 된다. 
  정규표현식 지원해주는 프로그램중에 as few as possible 안되는 친구들도 있다. 구리다. 
                                                       E59

/\@>    \@>     \@>     1, like matching a whole pattern (*)
/\@=    \@=     \@=     nothing, requires a match /zero-width (*)
/\@!    \@!     \@!     nothing, requires NO match /zero-width (*)
/\@<=   \@<=    \@<=    nothing, requires a match behind /zero-width (*)
/\@<!   \@<!    \@<!    nothing, requires NO match behind /zero-width (*)
 이거 좀 재미있다.  \@>는 아직 잘 모르지만, 
\(a*\)ab를 검색하면, 저 그룹에 b앞에 a가 포함되도록 하는것인데, 패턴의 중복을 막는 방법이고, 일상적으로 볼 일이 없다. 

이 zero width는 검색은 하되 패턴에는 포함이 되지 않는 것을 말하는데, 찾아바꾸기나, syntax highlighting에 중요하다. 난 김철수를 박철수를 바꾸고 싶다. 뭐 이런 상황에 사용된다. 찾아바꾸기야 통째로 김철수를 찾아 박철수로 바꾸면 되지만 김씨인 철수만 글자를 밝게 처리한다거나는 어려우니 이런기능이 필요하다. 

이 친구들은 위치가 중요한게 아니라 저거 앞에 있는 atom을 수식해주는 것이라 위치를 잘 파악하자.  김철수에 김을 수식할 때는, 김\(철수\)\@= 로 써야해서 좀 해깔릴 수 있으나 그냥 * 같은거라고 생각해야한다.

      ordinary atom      magic   nomagic   matches /^      ^       ^       start-of-line (at start of pattern) /zero-width /\^     \^      \^      literal '^'
/\_^    \_^     \_^     start-of-line (used anywhere) /zero-width /$      $       $       end-of-line (at end of pattern) /zero-width /\$     \$      \$      literal '$'
/\_$    \_$     \_$     end-of-line (used anywhere) /zero-width /.      .       \.      any single character (not an end-of-line)
/\_.    \_.     \_.     any single character or end-of-line
/\<     \<      \<      beginning of a word /zero-width /\>     \>      \>      end of a word /zero-width /\zs    \zs     \zs     anything, sets start of match
/\ze    \ze     \ze     anything, sets end of match
/\%^    \%^     \%^     beginning of file /zero-width           E71 /\%$    \%$     \%$     end of file /zero-width /\%V    \%V     \%V     inside Visual area /zero-width /\%#    \%#     \%#     cursor position /zero-width /\%'m   \%'m    \%'m    mark m position /zero-width /\%l    \%23l   \%23l   in line 23 /zero-width /\%c    \%23c   \%23c   in column 23 /zero-width /\%v    \%23v   \%23v   in virtual column 23 /zero-width
underbar는 잘 써본적이 없고, 보통 줄의 시작과 줄의 끝을 많이 사용한다. 그리고 c언어 등에서 value이름을 바꿀 때 \< \>를 많이 사용한다. 중복되는 부분들이 많아서 이거 생각없이 쓰면 100%에러가 난다. 
int x; 어쩌고 저쪼고 를 복사해서 int y 에 대해서 똑같이 하고 싶다고 복사한다음에 x를 y로 바꾸면 와장창 에러가 뜬다. \로 쓰면 된다.


Character classes {not in Vi}:                          /character-classes      magic   nomagic   matches /\i     \i      \i      identifier character (see 'isident' option) /\I     \I      \I      like "\i", but excluding digits
/\k     \k      \k      keyword character (see 'iskeyword' option)
/\K     \K      \K      like "\k", but excluding digits
/\f     \f      \f      file name character (see 'isfname' option)
/\F     \F      \F      like "\f", but excluding digits
/\p     \p      \p      printable character (see 'isprint' option)
/\P     \P      \P      like "\p", but excluding digits
/\s     \s      \s      whitespace character: and
/\S     \S      \S      non-whitespace character; opposite of \s
/\d     \d      \d      digit:                          [0-9] /\D     \D      \D      non-digit:                      [^0-9] /\x     \x      \x      hex digit:                      [0-9A-Fa-f] /\X     \X      \X      non-hex digit:                  [^0-9A-Fa-f] /\o     \o      \o      octal digit:                    [0-7] /\O     \O      \O      non-octal digit:                [^0-7] /\w     \w      \w      word character:                 [0-9A-Za-z_] /\W     \W      \W      non-word character:             [^0-9A-Za-z_] /\h     \h      \h      head of word character:         [A-Za-z_] /\H     \H      \H      non-head of word character:     [^A-Za-z_] /\a     \a      \a      alphabetic character:           [A-Za-z] /\A     \A      \A      non-alphabetic character:       [^A-Za-z] /\l     \l      \l      lowercase character:            [a-z] /\L     \L      \L      non-lowercase character:        [^a-z] /\u     \u      \u      uppercase character:            [A-Z] /\U     \U      \U      non-uppercase character         [^A-Z] /\_     \_x     \_x     where x is any of the characters above: character
                       class with end-of-line included


\s를 많이 쓰고 의외로 아래 digit류는 기억이 잘 안나서 오른쪽에 대괄호 형식으로, 풀어서 많이 쓰게 된다. 딱봐도 소문자랑 숫자 섞인것 같은거는 정의 안 되어 있다. 


      magic   nomagic   matches /\e     \e      \e       /\t     \t      \t       /\r     \r      \r       /\b     \b      \b       /\n     \n      \n      end-of-line
/~      ~       \~      last given substitute string
/\1     \1      \1      same string as matched by first \(\) {not in Vi} /\2     \2      \2      Like "\1", but uses second \(\)           ...
/\9     \9      \9      Like "\1", but uses ninth \(\)                                                                E68 /\z1    \z1     \z1     only for syntax highlighting, see :syn-ext-match           ...
/\z1    \z9     \z9     only for syntax highlighting, see :syn-ext-match
       x       x       a character with no special meaning matches itself

/[]     []      \[]     any character specified inside the []
/\%[]   \%[]    \%[]    a sequence of optionally matched atoms

/\c     \c      \c      ignore case, do not use the 'ignorecase' option
/\C     \C      \C      match case, do not use the 'ignorecase' option
/\Z     \Z      \Z      ignore differences in Unicode "combining characters".
                       Useful when searching voweled Hebrew or Arabic text.

\e는 고급사용자면 많이 쓸거다. \1 \9는 a-b를 b-a로 바꾼다거나 할 때 많이 쓴다.  vi에는 \( \) 없다고 한다, 얼마나 힘들겠는가... 그런데 vi에 메뉴얼의 패턴은 정의가 재귀적으로는 되어 있지 않겠다. 

\c는 최근에 쓰기 시작했다. grep은 -i 옵션 find -iname 으로 쓰니까 같이 알아두자. 


2018년 11월 15일 목요일

미디) 신디사이저 용, ts또는 trs 커넥터를 사용하는 페달에 대해 알아보자.



  신디사이저나 마스터키보드 후면에 보면 페달을 꽂을 수 있는 폰잭 암놈 커넥터가 있다.


교회에서 많이 쓴다고 알려진, SP4-8의 경우,  'CC', 'Sustain' 이라고 이름 붙여진 암놈커넥터가 달려 있다.

그리고 진짜 싸구려 제품이나, 미니키보드를 제외하고서는 마스터 키보드의 후면에도 'Sustain'이라 이름 붙여진 포트가 존재한다.



  1. Sustain


여기서 가장 간단한 장치는 'Sustain'이라 이름 붙여진 페달이다. 이 페달은 그랜드피아노는 페달 설명을 들어도 잘 모르겠고, 업라이트 피아노의 맨 오른쪽 페달의 역할을 한다.  밟고 있는 동안, 연주한 건반 모두, 소리가 오래 지속되도록 하는 역할을 맡고 있다. 그렇다 보니, 이 페달은 아주 간단한 형태를 가진다.

그냥 스위치의 역할이다. 밟으면 1, 때면 0 또는 그 반대로 작동할 수 있다. 이건 회사 마다 다르다. 딱히 표준은 없는 듯 하다. 하지만 일단 큰 회사 두개를 따라가고 있다. 그래서 딥스위치로 두 회사의 모드를 다 지원하는 페달을 만들고는 한다.

요즘 악기들은 마이크로프로세서가 좋아진 관계로 여력이 있는지, 기계가 부팅될 때를 밟지 않은 상태로 인식하고 있다.

그렇다보니, 그냥 스위치처럼 input, output 딱 두개의 극만 있으면 된다. 전기공학을 검색하면 이런 간단한 스위치도 종류에 따라 다 이름이 있지만 난 전공자가 아니니 대충 글을 쓴다.
  input으로 정해진(3V) 전위로 연결되고, output쪽이 스위치의 상태에 따라 input과 같은 전위 또는 단락 상태가 되니까 나름 간단한 아날로그 회로이다.

2극이면 되니까 TS 폰잭을 사용한다.


2. CC Pedal(Expression or Volume)

다음은 CC 페달이다. 악기에 따라 Expression 페달이나 Volume 페달이라고 불리기도 한다. 전기기타가 사용하는 Expression, Volume 페달과는 회로가 조금 다르다. 다만 세부적으로만 다르다.

CC 페달은 기본적으로는 가변저항 회로이다.  얼마나 밟았는지에 따라, 가변저항값이 바뀌면서, input1, input2 두개의 입력전압의 사이값으로 신호가 output으로 나가게 된다. 한개는 딱히 Sustain에서 들어오던거랑 다를 이유가 없고, 다른 하나는 ground가 아닐 이유가 없어서, 역시 간단한 아날로그 회로이다.


회로는 간단하나 사람의 발로 연주하는 장치이다보니 밟는 정도를 가변저항노브를 돌리는 것으로 변환하는 기계적인 부분에서 단가가 올라간다.

이것도 밟는 것을 땐 상태 어느쪽을 input1쪽으로 할지를 결정해야 하므로 조금 복잡하다. 하지만 거대 악기 기업들을 대부분 따라가므로 걱정하지말자.

이 장치는 input1(input) input2(ground) output 세개의 극이 필요하다. 그래서 TRS 커넥터를 사용한다.

추가로 가변저항에 종류에 따라 페달의 형태 이외로도 존재할 수 있다.
(센서라고 불리는 친구들이 대부분 가변저항이다.  )

3. Half sustain pedal (Half Damper )

  사실 이 장치 때문에 이 글을 쓰고 있다. 이게 어디에 쓰이는지도 잘 모르기 때문에, 이름은 익히 알았지만, 무시했다. 

  요번에 Half damper 커넥터가 TRS라는 것을 알게되어, 도대체 Volume pedal이랑 무엇이 다를까? 그 둘이 혼용이 가능한가에 대해 관심을 가지게 되어 이리저리 검색을 했다. 일단 한국 사이트들은 내 검색이 문제인건지 관심사가 없는 건지 관련 정보를 찾을 수 없었고, 외국 사이트를 검색해서 답을 얻었다. 

답은 간단하다. 그냥 스테레오선으로 이해하면 된다. left, right 두개의 신호가 오는 것처럼, 이 장치도 두개의 병렬 스위치 신호가 들어온다. 회로도만 볼 때는, 두개의 sustain pedal이 있는 것과 같다.  단지 이유를 알 수 없는 트랜지스터가 포함이 되어 있는데 그것은 이해가 더 필요할 듯 하다. 

그렇다면 페달이 하나밖에 없는데, 어떻게 두개의 스위치를 작동을 시킬것인가? 

이전에 이야기한 Sustain 페달 두 종류를 혼용하면 가능하다. 

밟지 않을 때, 1인 회로가 있다. 페달을 밟는 순간 회로가 단락되어 0인 신호로 바뀔 것인다. 그다음 밟았을 때 '1'인 회로가 있다. 꾹 밟았을 때, 회로가 연결되어 '1'인 신호가 나오게 될 것이다. 

하프댐퍼를 알기전에는 두 종의 서스테인 페달이 연주상의 차이가 있을 것이라 생각지 못했다. 하나는 살짝 밟아도 신호가 변하지만 하나는 꾹 밟아야 신호가 바뀐다. 동일한 발동작으로도 다른 연주가 될 것이다. 클러치를 밟는 것처럼 브레이크를 밟으면 사고가 난다. 다른 페달이란 것은 그런 것이다. 

자 그렇다면 이제 중간만 밟는 신호라는 것이 만들어진다. 완전히 땐 상태는 (1,0)신호가 나가고 있고, 반만 밟은 상태에서는 (0,0)의 신호가 나가고 있으며, 완전히 밟은 상태에서는 (0,1) 신호가 나온다. 그 다음은 기계에 들어가서 알아서 잘 해석이 되어, 세가지 상태를 처리하는 것일 거다. 


장비들을 보면, 가끔 한개의 잭으로 두개의 페달을 작동시키는 물건들도 있고, 디지털피아노로 나무로 잘 씌어서 파는 물건들이 있는데, (페달3개) 이러한 물건들은  이 회로 자체를 병렬로 두개의 페달에 연결하는 제품이다.  그리고 3개짜리는 젝을 하나더 연결함으로서 완성이 된다. 


4. 총론 

  정리하면 간단하다.  서스테인 페달은 2극 커넥터가 필요한,1비트 디지털 신호를 만드는 회로이다. 하프 서스테인(댐퍼)페달은 이 서스테인 페달 회로의 병렬회로이며, 3극 커넥터가 필요한  2비트 신호의 디지털 신호이다.   CC페달은  3극 커넥터가 필요한, 가변저항을 이용한 아날로그 회로이다. CC페달이라고 불리기 때문에, 기계에 들어가서는 보통 7bit신호로 0-127의 값을 가진다. (14bit신호도 가능하다. 아날로그로도 처리될 수 있으나 그럴때는 CC페달이라고 부르지 말자 )
  아날로그 신호를 디지털 신호로 바꿀 때는 선형일지 어떨지는 내부적으로 정해진다.(타블렛 펜 신호등처럼) 

  손연주도 안되는 사람들은 여기까지 이 글을 읽었다면 정말 대단하지만 반성하도록 하자. 
나는 더 반성하겠다. 

  
  그림을 넣어야 사람들이 많이 보는 글이 되겠지만 귀찮다. 

2018년 11월 11일 일요일

HOMM3) 베이스 데미지는 어떻게 선택될까?

http://heroescommunity.com/viewthread.php3?TID=20955
의 글을 참조하였으며, 위글 작성자의 실험의 의한 결과이다.
이 글은 폰으로 작성했다.


히어로즈에서 데미지 계산과 관련된 것은 중요한 이 슈 중 하나다 그 계산법에는 베이스 데미지라는 것이 들어가는데 그 계산은 기본적으로 한스택의 유닛이 가지고 있는 최저 데미지에서 최대데미지 곱하기 유닛의 수로 정해진다고 알려져있다.


그렇다면 도끼 창병 100마리 일 경우 최저 데미지 최대 대미지 그리고 그 숫자를 포함하여 계산해 보면 200--300에 데미지 값을 가질 것이다. 그렇다면 200에서 300 사이 모든 정수가 동등한 확률로 선택 될 것인가 아니면 그 사이에 있는 실수가 선택이 될 것인가 어떻게 선택될 것인가는 중요할 것이다.

   다만 실험의 결과로 계산을 해 볼 시 선택되는 데미지는 일정한 간격을 가지는 것을 확인할 수 있다 그 결과는 다음과 같다 스타 계수가 열기 이하일 경우는 경우는 그 숫자만큼 각각의 대해서 정수 난수 발생기를 통해서 동등하게 골라지도록 고른다.

 그리고 그 값을 더 한다.  쉽게 생각하면 열기의  유닛이 각각 한 대씩 때렸을때 데미지를 생각하면 된다 만약 스택이 열기가 넘을 경우는 여기까지 계산을 하고 유닛에 숫자 n 나누기 10을 곧 방값을 베이스 데미지로 선택한다.

 이 결과가 얘기하는 반은 간단하다 숫자가 많던 적던 평균 데미지는 동일하게 정해지고 그 분포는 10기까지는 다르게 정해 쉬다가 그 이후로는 분포가 고정 된다 이런 식으로 계산한 이유는 이상적ㅇ.로야 각 유닛이 한대씩 때리니까 각각 난수를 돌리면 되지만 천기가 넘아가게 되면 난수 발생기를 돌리는 행위도 컴퓨팅파워를 많이 먹어 충분한 부담이 되기 때문일 것이다.

거기다가 숫자가 커지면 커질수록 편차값이 줄어들어(sqrt(N)이지만 한마리당은 1/sqrt(N)) 져 최대데미지가 선택될 확률이 점점 줄어들게되기 때문이다.

뭐 어떻게 하던간에 기대값은 동일하다.

다만 분포가 달라지고 베이스 데미지가 가질 수 있는 값은 각 유닛의 데미지 범위 내 정수 의 10제곱 값중에 한 값이 정해지는갓은 확실하다.


실습을 좀 해보도록하자

일단 마스터 그렘인 4기가 누군가를 공격한다면 베이스 데미지는 다음과 같다.
 1-2 1-2 1-2 1-2 4번 돌려서 정한다.
최소 데미지가 나올 확률은 (1/2)^4 = 1/16이다.
최대도 그러하다.
그리고 모두 고려하면
데미지 4     5        6               7    8
         1/16  4/16   6/16    4/16 1/16
이다. 이런식으로 10기까지만  계산하고 그 이상은 그냥 곱한다. 그렇기에 10기 이상의 마스터 그렘린의 최대(최소) 데미지가 선택될 확률은 1/1024로 동일해진다.

드레드 나이트의 경우는 10기 이상일 경우 나가여왕이랑 동일한 데미지가 선택되려면 15-30 총 16개 중에 선택되므로, 1/2^40 즉 하드디스크 계산법을 쓰면(근사지만 많이 날라감 10^3 simeq 2^10) 대략, 1조번 때리시면 한번정도 선택되겠다.

마리당 30의 데미지를 주고 싶으면 그냥 나가여왕 쓰자....

일단 가짓수만 1테라다. 이거 표로만드는 것도 쉽지 않다.

음 이게 시사하는 바는 간단하다. sod에서는 하단에 최저에서 최대 데미지가 뜨고 HotA에서는 죽일 수 있는 유닛의 수가 뜬다. 최대만 보고 다죽을거 생각해서 전투하면 심히 골룸하다. 데미지가 이지선다형인 그렘린도 4기일때 최대 데미지 잘 안나온다.

불확실성에 기대지 말고 축복을 걸자.


그냥 모든유닛의 데미지는 평균값으로 고정됐다고 생각하고, 사는게 편하다. 

도마뱀전사는 3.5이고, 그랜드엘프은 4x2인 것이다. 마스크맨은 3x2인 것이다.

두대 때리는 친구들은 한스탁당 한번 공격소비으로 난수를 20개까지 돌린다. 최대값은 더 안 나온다.


난수를 많이 쓰는갓을 싫어하고, 정수 난수만 쓰는거보면 고르곤도 적당히 계산하다가. 말 것 같은데 이건 문서를 찾아보던가 직접 실험하서 분포를 그려보도록 하자.


2018년 11월 2일 금요일

HOMM3>석갑 스킬의 쓸모에 관한 글

1. 석갑과 관련된 각종 마법들을 먼저 서술하자. 

  • Lv1 Earth. 석갑 초급 방어력 +3, 중급이상 +6  
  • Lv1 Earth 방패 초급 근접데미지 감소 15%, 중급이상 30% (0.85, 0.7) 
  • Lv3 Air 공기방패 초급 원거리데미지 감소 25%, 중급이상 50% 
  • Lv2 Water 약화. 적의 공격력 -3, 중급이상 -6
여기서 석갑과 방패는 각종 자원이 들지 않고 시청트리에 들어가는 마법길드 Lv1에서 등장하는데다가 흙마법이기 때문에 비교를 많이 당한다. 그렇다면 어떤 마법을 사용하는 것이 좋을 것인지 수치로 비교를 해보자 
2. 석갑에 효율 계산을 위해서 HOMM3의 기본 계산기를 가지고 와서 계산하도록 하겠다.  

이 계산에는 많은 것들이 생략되어 있다. 다만 방어술, 원거리 페널티, 성벽페널티 등은 복리연산이므로 별로 중요하지 않다는걸 말하도록 한다. 공격술, 증오, 행운 등은 계산 방식이 유사하므로 공격술  그래프를 참조하면 된다.

기본 계산은 다음과 같다. 기준은 내가 석갑 사용자일 때를 가지고 하도록 한다. <여러가지 모든 계산을 거치고 복리계산에도 한계점이 있지만 무시하자.>

기본 계산식은 기본데미지 =(공)[minDMG,maxDMG]*숫자 * A1*R1*R2

if ( (RDEF=방어력 - 상대공격력) > 0 )
       then
          A1= 1
          R1= MIN(1-0.025*RDEF, 0.3)
        else
                RATT=-RDEF
                A1 = MAX(1+ 0.05*RATT,4)
                R1 = 1
endif.

로 정해진다.
 
쉴드의 계산은 흙마법 중급이상일때 R2=0.7, 초급이하는 R2=0.85로 한다.


석갑의 계산은 중급기준 {A1*R1}(RDEF+3 or 6)/{A1*R1}으로 석갑마법이 걸리기 전과 비교해서 상대적으로 얼마만큼의 데미지가 감소될 것인지에 대해 계산한 양이다. 

이 계산식을 가지고 libreoffice calc를 통해 표를 만들고 차트를 그려보았다.
요 프로그램은 차트를 예쁘게 그리는 방법을 모르므로, 나중에 다시 gnuplot으로 예쁘게 그리도록 하고, 일단 올려보면 
  빨간색 선은 초급 석갑일 때의 그래프이다. 내 상대방어력이 20보다 크기 시작할 때, 초급 쉴드보다 효과가 좋은 것을 알 수 있다. 다만 상대방어력이 20보다 크기는 쉽지 않다. 대천사나, 대사탄으로 양학할 때는 쉴드보다 좋다.
 
노란색 선은 중급이상 석갑일 때 그래프이고, 같이 움직이는 검정선은 상대방이 공격술 고급일 때의 그래프이다. 행운, 중오 등도 동일한 형태로 살짝 이동한 형태로 그려진다.  상대방어력이 -19로 매우 낮은 상태일 때부터 초급 방패보다는 효과가 크게 그려진다. 다만 쉴드도 흙마법이기 때문에 큰 의미는 없다. 

  상대방어력이 0보다 클때는 검정선과 같이 움직이므로 상대방 능력은 석갑의 효율과 별 상관이 없다. 다만 상대방어력의 한계점 근처이다보니 계산식이  미분불가능한 영역이 있다.  상대방어력이 21,22일 때만 쉴드보다 강력한 기능을 발휘 한다.

재미로 Air shield를 포함했다. 가중치가 굉장히 크다보니, 상대방 궁수에게 계속 얻어맞는 상황이라면 어떤 마법보다 강력하다. 고급 공기마법은 근처에 가기도 힘들다.

중급 흙마법이 있고, 초급이하의 공기마법이 있다면 내 상대방어력이 16보다 큰 순간부터 공기방패보다 좋은 가치를 지닌다.

3. 결론. 
 히어로즈에서 궁수를 상대하는 기본 전술은 상대방에게 근접유닛을 붙이는데서 시작한다. 속도가 빠른 유닛이 없어서 화살공격을 맞아야 하거나, 하는 순간이 아니라면, 방패마법이 대부분 효율이 좋다.
(그리고 조금만 넘어가면 효율이 사라지므로(한계점이라) 그냥 방패쓰자)

  몸이 돌이 되지만, 몸으로 맞는거보다, 방패로 막는게 더 좋다. 다만 이미 돌처럼 단단한 자에게는 돌이 철이 되는 기적이 보여진다. 

  다만 보통 일반적인 상황에서 고급석갑 마법은 초급 방패마법 이상의 능력을 보이므로,(복리) 내파나, 연속번개, 메테오 같은 마법이 없다면 고급 석갑을 이어서 또 써주도록 하자. 
  고급 방어술이 15% 감소이므로 무시할만한 양은 아니다.

4. 번외. - 약화 등등 
상대방이 블러드 러스트가 걸렸을 때는 어떤 것이 효율이 좋은가. 
  그래프가 복잡하므로 여기에는 고급만 넣어서 보도록 하자. HoTA에 오우거 세트가 생겼으니 가끔 블러드 러스트를 겪을 수 있다. (??? 정말 가끔)

  약화는 석갑과 마찬가지로 상대방어력으로 계산하는 양이고 값도 동일하다 다만 흙마법이아닌 물마법이다. 요건 X축을 좀 줄였다. (X축이 부호가 이상하네.)
  고급 스톤스킨은 대부분의  고급방어술에 능력치 이상의 능력을 발휘했다.  블러드러스트 마법은 고급 공격술 정도의 가치를 가진다.

일상적인 상황에서 고급 방패보다. 효과가 있으려면 고급석갑과 고급약화가 동시에 필요하다. 그래서 방패 방패 하는 것이다. 하지만 두턴이나 필요하다는 사실을 기억하자. 방패가 없어도 지나가는 드래곤 플라이를 잡아다가 던져주는 방식을 쓰면 방패보다 강력할 수 있다.
  인챈터가 부대에 있어서 석갑이나, 약화를 사용한다면 냉큼 쉴드를 사용하자. 피해감소율이 마법쓰기 전과 비교했을때, 거의 절반에 육박한다.
  마법의 대지가 있다면, 지니 부대를 최대한 분배하자. 약화나 석갑만 나와도 매우 감사하다.
  한턴만에 데미지를 절반으로 감소할 수 있는 것은 쉽지 않다. 공격술과 방어술과 달리 이건 내 선택에 의해서 전투중 변화하는 부분이다. 

진 초록색 그래프는 블러드 러스트가 걸린 적에게 약화마법으로 상쇄시켰을 때의 데미지 변화이다. 
  상대방이 블러드러스트가 걸렸을 때 내가 어떤 마법을 쓸지를 비교하려면, 쉴드와 Blood>Weak를 비교해야 한다. 뭐 대략 일반적인 상황해서 방패보다. 매우 막강하다는 사실을 알 수 있으나 이런 일은 거의 없다. 블러드러스트 마법자체가 똥이다. 그래도 오우거 메이지가 사이클롭스 옆에 붙어 있는 상태로 다른 녀석에게 블러드러스트를 건다면, 냉큼 드래곤플라이 고기방패를 보내자. 

  Blood+Shield는 그냥 데미지가 어느정도 되는지 보기위해 넣었지 내가 방패를 쓸지 말지를 결정하는데는 큰 의미는 없다.

내가 약화 마법이 걸릴일은 없겠지만, 혹시 걸린다면 즉각 블러드러스트로 상쇄를 시켜주자. 저 그래프의 휘황찬란함을 보라. 마법쓰기전에 유닛위에 올려놓을 때 나오는 데미지 계산 범위가 단숨에 뻥튀기가 된다.

헤이스트나 슬로우는 워낙 중요한 마법이니까, 쓰는거지 적이 상쇄하면서 긍적적인 효과를 주는 마법은 HOMM3에서는 최대한 피해야 하는 마법이다.

  저주마법과 축복마법, 블러드러스트와 약화마법, 헤이스트와 슬로우는 상쇄가 되니 조심해서 써야하고,  헤이스트와 슬로우의 관계는 더 효과가 크다.
  이쪽은 그렇게 무섭다는 땅마법과 공기마법이다.



4. 사족. 내가 포트리스 유저라면, 드래곤 플라이를 아끼지 말아야 한다. 남는 칸은 드래곤플라이 1로 채워넣자. 그리고 반드시 가운데 칸은 드래곤플라이로 채워야 한다. 다른 녀석들은  두자리를 차지한다. 이 유닛을 소모해서 다른 유닛을 모으는게 포트리스 전략의 핵심이다. 적당히 줄여놔야, 성전투일 때도, 성이 쏘는 화살을 이 친구가 맞아준다. 





가장 많이 본 글