1. 개요
해당 게시물의 사용되는 사진 |
잘봐
첫번째 사진에서는 파일런의 좌측 상단에 게이트웨이를 지을수있지만
대칭의 같은부분에는 게이트웨이가 지어지지 않아
여기서 우리는 파일런 건물 소환 가능 범위의 좌편향을 통해 프로토스가 좌빨이란걸알수있어
첫번째 사진에서는 파일런의 좌측 상단에 게이트웨이를 지을수있지만
대칭의 같은부분에는 게이트웨이가 지어지지 않아
여기서 우리는 파일런 건물 소환 가능 범위의 좌편향을 통해 프로토스가 좌빨이란걸알수있어
디시인사이드 스타크래프트 갤러리에서 새로운 태양으로 떠올랐던 꾸준글. yeoni라는 유저가 올렸던 꾸준글로 게이트웨이를 파일런의 건설범위로 소환하려 할 때 왼편이 같은 범위 안에 지을 수 있는 건물 수가 더 많다고 설명한 글이다. 위 그림처럼 파일런 서쪽의 동력망 가장자리에 걸치는 위치에는 건물을 소환할 수 있지만 동쪽의 대칭되는 위치에는 소환할 수 없는 것을 볼 수 있다.
사실 이대로 끝나면 평범한 꾸준글로 잊혔겠지만 "프로토스는 좌빨"이라는 기적의 논리 때문에 스갤 밖에서도 이 꾸준글은 유명했다. 온게임넷의 방송 '용선생의 매너파일런'에서도 이 건설 범위 비대칭을 말한 바 있을 정도. 다만 좌익 빨갱이라는 문제시 되는 단어 때문에 인지도와 별개로 원문 전체가 인용되는 일은 별로 없다.
2. 원인
- [ 실제 동력원 범위를 정리한 표. 펼치기 · 접기 ]
- ||<height=20px><tablebgcolor=blue><rowbgcolor=#000><width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||<width=20px> ||
원래 기능했어야 할 수정탑 동력망 범위 실제로 동작하는 수정탑 동력망 범위 비교: 청록색은 의도를 벗어난 범위 해당 짤방의 게이트웨이 위치를 붉은색으로 표현한 표.
좌측은 중심이 동력망에 걸쳐있지만 우측은 그렇지 않다.
논지만 간단히 요약하자면, 실제로 수정탑의 범위는 좌상단으로 편향되어 있으며, 원인은 스타크래프트의 최소 단위 체계를 정수로 사용하기 때문에 생긴 오류이다.
스타크래프트의 그래픽 단위는 그래픽 최소 단위이자 동시에 코드를 처리하는 좌표 단위로 '픽셀'을 사용하지만, 실제로 건물 및 오브젝트의 크기, 로케이션 범위 등을 32 x 32 픽셀로 이루어진 '칸'을 기본 단위로 사용한다. 그리고 픽셀을 칸으로 바꾸는 함수는 Unsigned Int로 처리하기 때문에 소숫점 이하(31칸 이하)는 내림된다. 이런 이유로 인해 우측 하단은 본래 의도한 대로 동력망이 동작하지만, 우측 상단과 좌측 하단은 의도보다 1칸 더 넓게 동작하며, 좌측 상단은 3칸이나 더 넓게 동작한다. 건물을 동력망의 좌측 상단에 아슬아슬하게 걸쳐 지을 수 있지만 대칭의 같은 위치에는 지을 수 없는 현상은 좌측 상단의 더 넓게 동작하는 범위에 절묘하게 걸치기 때문에 발생하는 현상이다.
이 내림 처리 때문에 스타크래프트에는 파일런 좌우대칭 뿐 아니라 여러가지 오류가 발생한다. 예를 들어서 사거리가 6칸인 드라군이 똑같은 6칸 거리의 적을 공격하는데도 오른쪽에 붙어서 공격하면 사거리가 안 되는데 왼쪽에 붙어서 공격하면 사거리가 돼서 공격이 된다든지. 현실의 래더에서는 보기 힘들지만 정말 드라군 - 대상 간의 거리를 픽셀 단위로 촘촘하게 계산해서 타일을 배치하면 이런 상황을 발생시킬 수 있다.
즉 파일런 좌우비대칭도 픽셀 내림 문제로 생기는 현상이며 희귀한 현상은 아니다. 단지 픽셀 단위로 계산해줘야 의도적으로 발생하는 타 현상과 달리 실전에서 매우 쉽게 찾아볼 수 있는 문제라는 것, 그리고 스타크래프트가 나온지 30년이 되어가는 고전 게임이라 뜯길 대로 뜯기고 개발자 단위에서나 얻을 수 있는 정보가 범용화된 2020년대와 달리, 아직 2000년대 중반이라 게임의 세부적인 부분이 잘 알려지지 않았기에 생긴 혼선이 원인이다.
에디터를 통해 칸이 아닌 픽셀 단위로 파일런을 아주 살짝 오른쪽 아래로 당겨주면 좌우대칭 파일런을 만들 수 있다. 또한 스타크래프트 2에서는 대다수 건물의 크기가 3×3이며 동력망 판정 거리값을 정수 단위가 아닌 실수 단위로 사용하므로 이런 문제가 발생하지 않는다.
이하의 내용은 OpenBW라는 브루드 워 역설계 프로젝트에 기반한 설명이며, 공식 자료는 아니다. 다만 역설계 과정을 보면 이런 오류가 왜 발생했구나 하고 추측되는 정도.
- [ OpenBW 기반 서술 펼치기 / 접기 ]
- 어떤 건물 오브젝트의 '중심점 = 오브젝트의 위치 좌표'는 실제 중심점으로부터 우측 하단에 위치한다. 그런데 코딩 상 중심점이 실제 중심점으로 벗어났기 때문에 생기는 오류를 방지하기 위해서 바운더리를 체크할 때는 의도적으로 우측과 하단으로는 1픽셀 덜 체크한다. 예를 들어서 기준점 주위 256 x 256 픽셀을 체크하는 알고리즘의 경우 좌측 상단으로는 128픽셀씩 체크하는데, 우측 하단으로는 127픽셀만 체크한다. 이게 문제의 핵심이다.
bool is_in_psionic_matrix_range(xy rel) const { unsigned x = std::abs(rel.x); unsigned y = std::abs(rel.y); if (x >= 256) return false; if (y >= 160) return false; if (rel.x < 0) --x; if (rel.y < 0) --y; return psi_field_mask[y / 32u][x / 32u]; }
그 다음 문제는 코드 내부에서 픽셀 단위를 칸 단위로 바꿀 때 생기는 문제인데, 픽셀 값을 Unsigned Int 32로 나누면 칸수로 변환된다. 문제는 uint로 나누는 과정은 반올림이 아니라 버림이기 때문에 나머지가 0이든 1이든 31이든 모조리 버린다. 다시 말해 픽셀이 32의 배수일 때는 문제가 없으나, 32의 배수 픽셀에서 1픽셀만 빼도 1칸이 줄어든 것으로 취급한다. 이것이 두 번째 문제다.bool is_in_psionic_matrix(int owner, xy pos) const { for (const unit_t* u : ptr(st.psionic_matrix_units)) { if (u->owner != owner) continue; if (is_in_psionic_matrix_range(pos - u->sprite->position)) return true; } return false; }
[세로 차이][가로 차이]
값을 다음과 같은 boolean 표에다가 집어넣어서 1일 경우 동력이 활성화된 것으로 친다.{{{#!wiki style="margin:-5px -10px; vertical-align:middle" → {{{#!wiki style="display:inline-flex; font-size:0.3em; vertical-align:middle"static const bool psi_field_mask[5][8] = { { 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 0 }, { 1, 1, 1, 1, 1, 1, 0, 0 }, { 1, 1, 1, 0, 0, 0, 0, 0 } };
그런데 앞서 이야기했듯 스타크래프트는 엔진의 한계로 인해 우측과 하단으로는 1픽셀 더 가까운 것으로 판정한다. 일너 상태에서 동력장 유무 판별을 건물"을" 중심으로 파일런"의" 위치를 파악하는 함수다. 그 때문에 건물이 파일런보다 좌측이거나 상단에 위치할 경우, 그 건물 입장에서는 파일런은 우측이거나 하단에 위치한 셈이다. 그리고 앞서 말했듯 우측하단은 1픽셀 덜 판정하는 시스템 특성 상, 건물이 파일런의 좌측이나 상단에 있을 경우 파일런에 1픽셀 더 가깝다고 판정하게 된다.
그리고 앞서 말했듯 어떤 값을 unsinged int 32로 나눌 경우, 그 값이 32의 배수에서 1이라도 적으면 소숫점은 모조리 제거된다. 즉 8칸 = 256이 오른쪽 거리일 경우 32u로 나누면 8칸이 되지만, 왼쪽 거리 8칸은 -255로 입력되고, 절댓값 255를 32u로 나누면 7.96875= 7칸으로 판정하는 것이다. 따라서 건물이 왼쪽이나 위에 있을 경우에는 파일런에 1칸 더 가까운 것으로 취급하게 된다.
3. 진짜 좌빨인가?
농담으로 나온 비약적인 결론이지만, 설정상 프로토스는 좌익이라기보다 오히려 매우 보수적으로 우익에 더 가깝다. 프로토스는 기본적으로 이미 발전할 대로 발전해서 더 이상의 진보란 없고 옛것을 따라야 한다는 입장이 강하다.[1] 차별은 두드러지지 않는다 해도[2] 확고하게 나뉜 계급 역시 평등을 중시하는 좌익과는 잘 맞지 않는다.사실 프로토스 사회는 현대 좌우 대립이 나타나기 이전 시대의 봉건제와 신정정치의 색이 강하게 나타내기 때문에 애당초 좌익인지 우익인지를 따지기 어렵다. 또한 스타크래프트 시리즈에서는 좌우를 나누는 중요한 기준 중 한 가지인 경제관 묘사가 부족하기 때문에 프로토스의 정치관을 확신할 순 없다. 애당초 화폐로 거래하는 시장이라는 개념이 있는지조차도 묘사된 적이 없다. 만약 프로토스에게 물질재조합장치 같은 게 있어서 물질적 가치가 전혀 중요하지 않다고 한다면 현 지구에서 나타나는 자본에 대한 관점에 따라 나타나는 사회 이념은 프로토스에게 아무 의미가 없을 것이다. 다만 설정상으론 사업가와 노동자 둘 다 존재한다고 한다.
4. 여담
질럿은 야마토 한방에 안죽어처럼 속편인 스타크래프트 2에서도 수정탑의 건물 소환 가능 범위는 대칭인데 이제는 좌우만 말고 위아래도 대칭인 발전된 모습을 보여준다. 카메라 각도가 스1에서는 프론트 뷰인 35도 기울어진 환경에서 완전 3D인 스2로 넘어가면서 생긴 변화.스타크래프트: 리마스터가 발매되면서 이 꾸준글도 리마스터됐다. 그 와중에 미니맵까지 재현한 게 소름 끼친다. 6, 9, 12시 저그에 오버로드 위치까지 그대로다.
5. 관련 문서
[1] 기술적인 측면에서는 확실히 그러하다. 가령 스타크래프트 2에서 등장한 신무기인 거신이나 아둔의 창은 이제 와서 새로 개발한 무기가 아니라 예전 전성기 때 만든 것을 다시 꺼내온 것들이다. 프로토스 사회를 크게 규정짓는 칼라 역시 등장 시점을 따지기 어려울 정도로 매우 예전에 나타난 것이다.[2] 다만 심판관, 기사단 계급이 기술자 계급보다 다소 우위에 있다는 묘사는 종종 나타난다. 카락스가 전사로서 인정을 받는 부분은 흡사 '그 전까지와는 달리 이젠 더 이상 무시할 수 없다'처럼도 보인다. 또한 기사단 역시 심판관의 명령에 기본적으로 복종하게 되어있다.