최근 수정 시각 : 2024-04-09 10:22:47

파일런의 건물 소환 가능 범위는 대칭이 아니야

파일:디시인사이드 심볼.svg
{{{#!wiki style="margin:0 -10px -5px; min-height:calc(1.5em + 5px); word-break:keep-all"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin:-6px -1px -11px"
밈 모음 (야갤 · 여연갤 · 연뮤갤 · 해야갤) · 디시콘 모음 (기적의 블루아카콘! · 만두콘 · 둘리콘 · 좋은말콘 · 쭐어콘 · 케장콘) · 꾸준글
<colbgcolor=#4a56a8><colcolor=#fff>
영어숫자
Emiya Mulzomdao · GOAT 드립 · HAPPILy 시리즈 · MC무현 · MH세대 · XX는 신이야 XX는 무적이고 · .jpg · 1. ○○○를 들어올린다 · 2번남 · XX 되는 상상함 · ○○가 ○○하다 · YOU JUST ACTIVATED MY TRAP CARD · 1557
~가놈 · 가성비 댓글 · 가즈아 · 갈드컵 · · 갓(유행어) · 갓플란트 · 거기 내 자리 · 거북유방단 · 결혼하지마 · 개같이 XX · 개고기 탕후루 · 개꿀잼 몰카 · ○○○ 개새끼 해봐 · 갤러리 순회열차 · 갤주 · 게이 · 고로시 · 공중제비 · 광인의 천옷 · 국뽕 · 군지 · 그게 무슨 소리니 · 굉장히 귀엽지. 나도 좋아해 · 그 긴거 · 그건 니가 · 그런건 없다 게이야 · 그뭔씹 · 근첩 · 근데 어쩔건데? · 근데 이제 뭐함? · 근본론 · 근왜주 · 금사빠 · 김헌곤 유니버스 · ○까흥 · ○빨망 · 꺼어억 · 꼭 해라 두 번 해라
난 경기도 안양의 이준영이다 · 내가 고자라니 · 너굴맨 · 너 고소 · 네덕 · 노잼 (꿀잼) · 노괴 · 농ㅋㅋ · 뇌절 · · 누칼협?
다들 ○○○ 좋아하면 개추좀 눌러볼까? · 단또단또 · 동탄 · 닥눈삼 · 담당일진 · 담요단 · 대륙의 기상 · ~도르 · 돈이 복사가 된다고 · 두창 · 드립 (고인드립 · 개드립 · 패드립) · 따갚되 · 또 이러신다 밥이나 드세요 · 똥송합니다
라고 할 뻔 · ~라는 내용의 애니 없냐? · 람쥐썬더 · 레알
마따끄 · ○○마렵다 · 만두조공 · 멘탈붕괴 · 모든 스타팬들의 꿈과 염원 · 몰?루 · 문어가 죽었슴다..ㅡㅡ; · 물로켓 · 물리치료사 드립 · 미안하다 이거 보여주려고 어그로끌었다 · 민주평통 연설 (부끄러운 줄 알아야지 · 이기야 · 응딩이) · 민지 뿌우
박보검~나 웃겨 · 반갈죽 · 방구석 여포 · 베트남론 · 병림픽 · 병맛 · 병신력 · 보내드렸습니다^^ · 부들부들 · 비틱질 · 부적 · ~붕이 · 뷰지 · 비둘기야 먹자 · 비추실명제 · 빵셔틀
사실이 아닙니다! · 사이버 유격 · 사탄드립 · 새삼 XXX가 대단하다고 느껴지네(기습숭배 드립) · 설거지론 · 설명충 · 세계 최악의 게임회사 · 세 줄 요약 · 센송 · 속보) · 수갤 전사 · 식객민우 · 신박하다 · 실시간 X붕이 좆됐다 · 싱글벙글 · 싱하형 · 씨발련아 · 씹선비 · 스타벅스 입장권 · 슨상님 · 솔직히 야겜 안하는 애들이 사랑이 뭔지나 알겠냐
아시발꿈 · 아햏햏 · 안아줘요 · 알바(디시인사이드) · 알빠노 · 앙망 · 야 기분 좋다 · 야민정음 · 야스 · 야카오톡 · 야코드립 · 야 XX · 어 맞아맞아 놀랍지만 그건 사실이야 · 엄근진 · 어둠에다크에서 죽음의데스를 느끼며 · 여자가⋯ 말대꾸⁈ · 역사상 최고, GOAT · 얘갈 · 예토전생 · 왤케 왤케임 · 와바박 · 우리○ · 우하하하 팡파레 (X하하하) · 우효 · 우흥 · 운지 · 응 더 XX 해 봐 · 응 아니야 · 응애 나 아기 XX · 응우옌 · 이거 보고 이재명 뽑기로 했다이분 배우신 분 · 이왜진 · 인생 하드모드 · 인증 없으면 뭐다? · 입갤 · 와 젖탱이보소 · 의문의 1승
자강두천 · 자짤 · 자 드가자 · 자택에서 검거 · 작명 및 국적변경 드립 · 정말 고민이 있습니다 · 정신나갈것같애 · 정ㅋ벅ㅋ · 제기랄, 또 ~~~야! · 제너럴 조 · 주먹왕 윤프 · 주모드립 · 죽창드립 · 중계 · 쥬지 · 지듣노 · 지역드립 (경상도 · 전라도) · 좋아 빠르게 가 · 지구 온라인 · 지금부터 여기는 맨체스터 유나이티드 갤러리다 · 진보의 거인 (문크 예거) · 질럿은 야마토 한방에 안죽어 · 짤방 · 짱구야 아빠를 속인거니?
참피(실장석) · 축대남 · 치킨을 시켰는데 여고생이 배달
케이크처럼 쉽게 먹는 법 · 큰거온다 · 크아아악! XX아! · 키보드 워리어
퇴갤
파일런의 건물 소환 가능 범위는 대칭이 아니야 · 판사드립 · 팩폭 · 페리시치 · 페미니즘을 알기 전까지는 에브리데이가 드림이었다 이기야 · · ○평 · 폰은정 · 퐁퐁단 · 퐁퐁시티 · 필수요소 (고갤) · 폐인의 세계
할카스 · 해줘 · 해병문학 (황근출) · 헬조선 · 헬창 · 햇살무늬 발작증 · 호감 고닉 · 화살표글 · 확실히 아이폰을 사고 나서 내 인생이 달라졌다. · 호성드립 · 흠좀무 · 히트다 히트}}}}}}}}}


1. 개요2. 원인 추정3. 진짜 좌빨인가?4. 여담5. 관련 문서

1. 개요

파일:attachment/파일런의 건물 소환 가능 범위는 대칭이 아니야/pylon_left_1.jpg
파일:attachment/파일런의 건물 소환 가능 범위는 대칭이 아니야/pylon_left_2.jpg
해당 게시물의 사용되는 사진
잘봐
첫번째 사진에서는 파일런의 좌측 상단에 게이트웨이를 지을수있지만
대칭의 같은부분에는 게이트웨이가 지어지지 않아
여기서 우리는 파일런 건물 소환 가능 범위의 좌편향을 통해 프로토스좌빨이란걸알수있어

디시인사이드 스타크래프트 갤러리에서 새로운 태양으로 떠올랐던 꾸준글. yeoni라는 유저가 올렸던 꾸준글로 게이트웨이파일런의 건설범위로 소환하려 할 때 왼편이 같은 범위 안에 지을 수 있는 건물 수가 더 많다고 설명한 글이다. 위 그림처럼 파일런 서쪽의 동력망 가장자리에 걸치는 위치에는 건물을 소환할 수 있지만 동쪽의 대칭되는 위치에는 소환할 수 없는 것을 볼 수 있다.

사실 이대로 끝나면 평범한 꾸준글로 잊혔겠지만 "프로토스는 좌빨"이라는 기적의 논리 때문에 스갤 밖에서도 이 꾸준글은 유명했다. 온게임넷의 방송 '용선생의 매너파일런'에서도 이 건설 범위 비대칭을 말한 바 있을 정도.

2. 원인 추정

원래 기능했어야 할 수정탑 동력망 범위
실제로 동작하는 수정탑 동력망 범위
들어가기에 앞서, 이 내용은 OpenBW라는 브루드 워 역설계 오픈 소스를 기반으로 작성되었다. 스타크래프트 게임 자체의 소스 코드는 비공개되어 있으며 뜯는 것도 불법이다. 해당 프로젝트는 버그와 에러를 포함한 브루드 워의 역설계를 목적으로 했으며 이 과정에서 파일런이 비대칭인 원인도 되짚어 추정된 것으로, 콕 집어 '이것 때문이다'라고 말할 수는 없음을 먼저 서술한다. 다만 위에 작성된 표 자체는 인게임에서 실험하면 나오는 것이므로 확실하다.

이런 현상이 발생한 논지만 간단히 요약하자면 스타크래프트의 최소 단위 체계를 정수로 사용하기 때문에 생긴 오류이다.

우선 스타크래프트의 그래픽 단위에 대해 이야기해야 한다. 스타크래프트는 그래픽 최소 단위이자 동시에 코드를 처리하는 좌표 단위로는 '픽셀'을 사용하지만, 실제로 건물 및 오브젝트의 크기, 로케이션 범위 등을 32 x 32 픽셀로 이루어진 '칸'을 기본 단위로 사용한다. 하지만 칸의 픽셀 단위가 짝수이기 때문에 건물의 크기는 무조건 가로세로 길이가 짝수 픽셀일 수밖에 없고, 이 때문에 어떤 오브젝트의 '중심점'은 픽셀 단위로 구분할 경우 정확히 중간에 해당하는 픽셀이란 존재하지 않는다.

이 때문에 어떤 건물 오브젝트의 '중심점 = 오브젝트의 위치 좌표'는 실제 중심점으로부터 우측 하단에 위치한다. 그런데 코딩 상 중심점이 실제 중심점으로 벗어났기 때문에 생기는 오류를 방지하기 위해서 바운더리를 체크할 때는 의도적으로 우측과 하단으로는 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"
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 }
};
→ {{{#!wiki style="display:inline-flex; font-size:0.3em; vertical-align:middle"
}}}}}}||

그런데 앞서 이야기했듯 스타크래프트는 엔진의 한계로 인해 우측과 하단으로는 1픽셀 더 가까운 것으로 판정한다. 일너 상태에서 동력장 유무 판별을 건물"을" 중심으로 파일런"의" 위치를 파악하는 함수다. 그 때문에 건물이 파일런보다 좌측이거나 상단에 위치할 경우, 그 건물 입장에서는 파일런은 우측이거나 하단에 위치한 셈이다. 그리고 앞서 말했듯 우측하단은 1픽셀 덜 판정하는 시스템 특성 상, 건물이 파일런의 좌측이나 상단에 있을 경우 파일런에 1픽셀 더 가깝다고 판정하게 된다.

그리고 앞서 말했듯 어떤 값을 unsinged int 32로 나눌 경우, 그 값이 32의 배수에서 1이라도 적으면 소숫점은 모조리 제거된다. 즉 8칸 = 256이 오른쪽 거리일 경우 32u로 나누면 8칸이 되지만, 왼쪽 거리 8칸은 -255로 입력되고, 절댓값 255를 32u로 나누면 7.96875 = 7칸으로 판정하는 것이다. 따라서 건물이 왼쪽이나 위에 있을 경우에는 파일런에 1칸 더 가까운 것으로 취급하게 된다.

그래서 얼핏 보면 동력망은 점대칭 선대칭으로 보이지만, 실제 동력망은 상단의 표와 같이 좌상단에 편향되어 동작하는 것이다. 실제로 포토 캐논을 지어보면 좌상단으로는 어느 정도 벗어난 곳까지 지어지지만 우하단으로는 칼같다는 것을 볼 수 있다.

결론만 요약하자면 정수 단위 픽셀 문제다. 에디터를 통해 칸이 아닌 픽셀 단위로 파일런을 아주 살짝 오른쪽 아래로 당겨주면 좌우대칭 파일런을 만들 수 있다. 또한 스타크래프트 2에서는 대다수 건물의 크기가 3×3이며 동력망 판정 거리값을 정수 단위가 아닌 실수 단위로 사용하므로 이런 문제가 발생하지 않는다.

3. 진짜 좌빨인가?

농담으로 나온 비약적인 결론이지만, 설정상 프로토스는 좌익이라기보다 오히려 매우 보수적으로 우익에 더 가깝다. 프로토스는 기본적으로 이미 발전할 대로 발전해서 더 이상의 진보란 없고 옛것을 따라야 한다는 입장이 강하다.[1] 차별은 두드러지지 않는다 해도[2] 확고하게 나뉜 계급 역시 평등을 중시하는 좌익과는 잘 맞지 않는다.

사실 프로토스 사회는 현대 좌우 대립이 나타나기 이전 시대의 봉건제신정정치의 색이 강하게 나타내기 때문에 애당초 좌익인지 우익인지를 따지기 어렵다. 또한 스타크래프트 시리즈에서는 좌우를 나누는 중요한 기준 중 한 가지인 경제관 묘사가 부족하기 때문에 프로토스의 정치관을 확신할 순 없다. 애당초 화폐로 거래하는 시장이라는 개념이 있는지조차도 묘사된 적이 없다. 만약 프로토스에게 물질재조합장치 같은 게 있어서 물질적 가치가 전혀 중요하지 않다고 한다면 현 지구에서 나타나는 자본에 대한 관점에 따라 나타나는 사회 이념은 프로토스에게 아무 의미가 없을 것이다. 다만 설정상으론 사업가와 노동자 둘 다 존재한다고 한다.

4. 여담

질럿은 야마토 한방에 안죽어처럼 속편인 스타크래프트 2에서도 수정탑의 건물 소환 가능 범위는 대칭인데 이제는 좌우만 말고 위아래도 대칭인 발전된 모습을 보여준다. 카메라 각도가 스1에서는 프론트 뷰인 35도 기울어진 환경에서 완전 3D인 스2로 넘어가면서 생긴 변화.

스타크래프트: 리마스터가 발매되면서 이 꾸준글도 리마스터됐다. 그 와중에 미니맵까지 재현한 게 소름 끼친다. 6, 9, 12시 저그에 오버로드 위치까지 그대로다.
파일:ㄷㅊ1.jpg파일:Screenshot_20210504-101527_Chrome.jpg
스타크래프트 관련 에피소드에서도 나온다.

5. 관련 문서



[1] 기술적인 측면에서는 확실히 그러하다. 가령 스타크래프트 2에서 등장한 신무기인 거신이나 아둔의 창은 이제 와서 새로 개발한 무기가 아니라 예전 전성기 때 만든 것을 다시 꺼내온 것들이다. 프로토스 사회를 크게 규정짓는 칼라 역시 등장 시점을 따지기 어려울 정도로 매우 예전에 나타난 것이다.[2] 다만 심판관, 기사단 계급이 기술자 계급보다 다소 우위에 있다는 묘사는 종종 나타난다. 카락스가 전사로서 인정을 받는 부분은 흡사 '그 전까지와는 달리 이젠 더 이상 무시할 수 없다'처럼도 보인다. 또한 기사단 역시 심판관의 명령에 기본적으로 복종하게 되어있다.