14Aug

Carmack vydává open source Wolfenstein pro iPhone


Následující příspěvek byl sestaven pomocí dvou dokumentů (Carmack_iPhone_development.doc a readme_iWolf.txt) napsal John Carmack a je součástí Zdroj Wolf3D iPhone v1.0. Dokumenty jsou po přestávce vyvěšeny v úplném znění.

Milý deníčku,

Miluji svůj iPhone. Bohužel, věci se spikly proti tomu, abychom byli na platformě brzy. Měl jsem plán na agresivní projekt specifický pro iPhone, do kterého jsme ve skutečnosti začali vkládat nějaké interní zdroje, ale programátor, který tím byl pověřen, nevyšel a byl propuštěn. Zvláštní shodou okolností za námi přišel externí vývojový tým s návrhem a rozhodli jsme se je nechat pracovat na projektu iPhone. Tento projekt bychom měli brzy oznámit a je to skvělé.

Po chvilce rozhlížení jsem našel Wolf3D Redux na http://wolf3dredux.sourceforge.net/. Po všech těch letech mě tato hra stále bavila a začal jsem si myslet, že by mohlo stát za to vyrobit produkt Wolfenstein na iPhonu. Jednoduchá epizodická povaha hry by usnadnila rozdělení na verzi za 0,99 $ pouze s první epizodou. Trochu jsem předbíhal bez zábavné ukázky proveditelnosti na iPhonu, ale myšlenka přesunout celou řadu klasických Id titulů přes --

Wolf, Doom, Quake, Quake 2, a Quake Arena, začínalo to znít jako opravdu dobrý nápad.

Rozhodl jsem se, že bych mohl strávit pár týdnů mimo Rage a pracovat výhradně na iPhonu, ale bylo to poprvé, co jsem po velmi dlouhé době převzal plnou zodpovědnost za celý produkt. Rozhodl jsem se ponechat herní média téměř beze změn, ale trochu upravit hru a vytvořit nový uživatelský rámec kolem základního herního zážitku. Hra je na moderní standardy rozhodně zjednodušená, ale stále má své momenty. Zajít za roh a vybít zbraň na... hrnková rostlina. Simplistic hraje dobře na iPhone.

Nemohu říci, že je zde mnoho opravdu dobrého kódu, ale všechno to dohromady ladí jako docela zábavná hra a dobré testovací prostředí pro různé věci. Každý má právo to udělat, a pokud chce, může se agresivně pokusit původní hru pohřbít. Nicméně si myslím, že je tu vlastně docela dobrá příležitost ke spolupráci. Pokud někdo vyrábí kvalitní produkt a odkazuje na originál Vlk aplikace, můžeme začít mít odkazy na projekty „odvozené od vlka“ nebo „související s vlkem“. Protože není možné, aby uživatelé roztrhli balíček aplikací z App Store, aby se dostali k datům, přidávám je se zdrojovým kódem, aby to bylo snadné. Je pro vás ctí koupit si kopii v App Store před použitím dat. :-)

Vrátím se na chvíli k Rage, ale očekávám Klasický Doom přijde poměrně brzy pro iPhone.

XOXO,
John Carmack
2009/03/20

Carmack_iPhone_development.doc


Vývoj iPhone*
John Carmack, technický ředitel, Id Software

Už více než rok jsem byl frustrovaný skutečností, že jsme neměli žádné vývojové projekty pro iPhone interně ve společnosti Id. Miluji svůj iPhone a myslím, že App Store je extrémně důležitý model pro software podnikání. Bohužel, věci se spikly proti tomu, abychom byli na platformě brzy.

Robert Duffy a já jsme strávili týden dříve, než jsme začali vytvářet kódovou základnu Orcs & Elves DS iPhone, což by byl pěkný projekt na úvodní titul, ale neplánoval by to být žádný slam namočit. Grafický hardware pro iPhone je schopnější nadmnožinou hardwaru DS (režie ovladače je daleko, daleko horší však), ale kódová základna byla poměrně specifická pro DS, se spoustou volání Nintendo API všude. Základy kreslení jsem získal převodem věcí do OpenGL ES, ale stále jsem byl na pochybách, zda je nejlepší zprovoznění všech vybíravých malých speciálních efektů by byla úplná konverze GL nebo emulace grafické knihovny DS vrstva. Ve spojení se skutečností, že celé uživatelské rozhraní bude nutné znovu promyslet a otestovat, bylo jasné že projekt by zabral několik měsíců vývoje a potřeboval umělce a designéry a také kódování práce. Naznačil jsem, že to bude stále dobrý plán, ale tým idMobile se již zavázal k projektu Wolfenstein RPG pro konvenční Javu a UVAŘUJTE mobilní telefony a Anna nechtěla posunout plánovaný milník na zavedených úspěšných směrech vývoje spekulativního iPhonu. projekt.

Poté, co jsem se trochu více zamyslel nad možnostmi platformy, měl jsem plán na agresivní projekt specifický pro iPhone že jsme vlastně začali nasazovat nějaké interní zdroje, ale programátor tím pověřený nevyšel a byl pustit. Zvláštní shodou okolností za námi přišel externí vývojový tým s návrhem podobného projektu na Wii a rozhodli jsme se, že místo toho s námi bude pracovat na projektu iPhone. Tento projekt bychom měli brzy oznámit a je to skvělé. Je to také pozdě, ale to je vývoj softwaru...

Koncem minulého roku mobilní tým dokončil všechny plánované verze Wolfenstein RPG, ale EA navrhlo, že kromě stovek přizpůsobených verze, kterou běžně vyrábějí pro všechny různé mobilní telefony, měli zájem o to, aby na nich jiný tým výrazně zlepšil kvalitu médií pro iPhone. Zatímco Wolf RPG je velmi jemně zpracovaný produkt pro tradiční mobilní telefony, nebyl pro ně určen Rozhraní nebo možnosti iPhone, takže by to nebyl ideální projekt, ale stále by to mělo stát dělá. Když jsme dostali k otestování první sestavení, byl jsem potěšen tím, jak kresba ve vysokém rozlišení vypadala, ale byl jsem zděšen tím, jak pomalu běží. Připadalo mi to jako jedna ze středních Java verzí, ne lepší než high-end BREW, jak jsem očekával. Začal jsem mít pocit potápění. Hledal jsem kolem v úrovni pohled, který by potvrdil mé podezření, a když jsem našel jasno dostatečný pohled na nějakou úhlovou geometrii Viděl jsem výmluvný střed polygonu afinní plavání v textuře, když jsem otočený. Používali softwarový rasterizér na iPhone. Trochu jsem se poplácal po zádech za to, že kombinace mého aktualizovaného mobilního rendereru, inteligentního designu úrovní / omezeného pohybu, a kresba ve vysokém rozlišení způsobila, že softwarový renderer byl vizuálně téměř k nerozeznání od hardwarového rendereru, ale byl jsem z toho velmi nešťastný. implementace.

Řekl jsem EA, že to NEBUDEME dodávat jako první produkt Id Software na iPhone. Použití hardwarové 3D akcelerace iPhonu bylo požadavkem a mělo by to být snadné – když jsem dělal druhou generaci mobilu renderer (napsaný původně v jazyce Java) byl navrstven na třídu, kterou jsem pojmenoval TinyGL a která provedla transformaci / klip / rasterizaci operace poměrně blízké sémantice OpenGL, ale v pevném bodě as možnostmi horizontální i vertikální rastrování korekce perspektivy. Vývojáři se vrátili a řekli, že to bude trvat dva měsíce a překročí jejich rozpočet.

Místo velké konfrontace ohledně problému jsem jim řekl, aby mi ten projekt poslali a já to udělám sám. Cass Everitt dělal na iPhonu nějakou osobní práci, takže mi pomohl vše nastavit místní vývoj iPhone zde, který je mnohem klikatější, než byste od produktu Apple očekávali. Jako obvykle, můj odhad mimo manžetu "dva dny!" byl optimistický, ale zvládl jsem to za čtyři a hra je rozhodně příjemnější při 8x vyšší snímkové frekvenci.
A bavilo mě to.

Vzhledem k tomu, že jsme nyní v kanceláři na iPhonu dělali něco, co se podobalo „skutečné práci“, udržovali jsme to v chodu s nízkou prioritou. Jedním z projektů, se kterými se Cass doma zabýval, byl port Quake 3 a tu a tam jsme mluvili o různých strategiích rozhraní.
Bohužel, když jsme se posadili, abychom vyzkoušeli pár věcí, zjistili jsme, že
Q3 ve skutečnosti neběželo dostatečně rychle na to, aby bylo možné dobře posoudit řídicí systémy iPhone. Hardware by měl být dostatečně výkonný, ale bude vyžadovat určité architektonické změny v kódu vykreslování, abyste z něj dostali maximum.

Právě jsem začínal nastavovat rámec pro významnou revizi Q3, když jsem zvažoval možnost jít na dřívější kódovou základnu a zpočátku experimentovat. Pokud bychom chtěli z rovnice vyjmout výkon, mohli bychom se vrátit až k Wolfenstein 3D, dědečkovi FPS her. Měl základní běh a hru se zbraněmi, na kterých byl postaven už patnáct let, ale původně běžel na 286 počítačích, takže udržet dobrý framerate na iPhonu by mělo být docela triviální.

Wolfenstein byl původně napsán v Borland C a TASM pro DOS, ale kód jsem měl už dávno, jako open source, a bylo několik projektů, které aktualizovaly původní kód, aby fungoval na OpenGL a moderním provozu systémy. Po malém rozkoukání jsem našel Wolf3D Redux na http://wolf3dredux.sourceforge.net/. Jeden z vývojářských komentářů o „odstranění gangrenózního 16bitového kódu“ mě rozesmál.

Bylo hezké a jednoduché stáhnout, vytáhnout data z komerční kopie Wolfensteina a začít hrát na PC ve vysokém rozlišení. Věci nebyly zpočátku tak hladké, jak by měly být, ale dvě malé změny udělaly obrovský rozdíl – přechod na rychlost synchronizovaných aktualizací VBL s jedním tikem za cyklus namísto počítání milisekund, aby odpovídalo 70 Hz herním tikům, a oprava chyby s předčasnou integrací v kódu aktualizace úhlu, která způsobila, že pohyb myši byl horší než on mělo by. Hra byla i po všech těch letech stále zábavná a já jsem si začal myslet, že by stálo za to ji skutečně vytvořit produkt od Wolfenstein na iPhone, spíše než jej používat jako testovací prostředí, za předpokladu, že ovládání fungovalo jako zábava hrát si. Jednoduchá epizodická povaha hry by usnadnila rozdělení na verzi 0,99 $ pouze s prvním epizoda, dražší verze se všemi šedesáti úrovněmi, a mohli bychom vydat Spear of Destiny, kdyby existovala další poptávka. Bez zábavné ukázky proveditelnosti na iPhonu jsem se trochu předbíhal, ale myšlenka přestěhovat se celá řada klasických Id titulů - Wolf, Doom, Quake, Quake 2 a Quake Arena začínala znít jako opravdu dobrý idea.

Poslal jsem e-mail správci projektu Wolf 3D Redux, abych zjistil, zda by mohl mít zájem pracovat na projektu Projekt iPhone s námi, ale od poslední aktualizace uběhl více než rok a musel přejít na jiný věci. Trochu jsem o tom přemýšlel a rozhodl jsem se, že do toho půjdu a udělám projekt sám. „Velké projekty“ v Id jsou vždy nejvyšší prioritou, ale práce na systémovém programování v Rage je z velké části dokončena a tým na mě už nějakou dobu nic netlačí. Dokud nebude odeslána, bude probíhat optimalizace paměti a snímkové frekvence, ale rozhodl jsem se, že bych mohl strávit pár týdnů mimo Rage a pracovat výhradně na iPhonu. Cass nadále pomáhal s problémy se systémem iPhone, navrhl jsem Erica Willa, aby vytvořil několik nových uměleckých děl, a Christiana Antkow udělal audio práci, ale bylo to poprvé, co jsem po dlouhé době převzal plnou zodpovědnost za celý produkt čas.

*Poznámky k designu*

Velkou otázkou bylo, jak „klasicky“ bychom měli hru opustit? Koupil jsem různé inkarnace Super Mario Bros na nejméně čtyřech platformách Nintendo, takže si myslím, že o klasice je co říci, ale bylo tolik možností pro vylepšení. Stěny a skřítci ve hře měli původně všechny barvy 64 x 64 x 8 bitů a zvukové efekty byly buď 8 kHz / 8 bitů mono nebo (někdy opravdu příšerné) zvuky FM syntezátoru. Jejich změna by byla z hlediska kódování triviální. Nakonec jsem se rozhodl ponechat herní média v podstatě beze změn, ale trochu upravit hru a vytvořit nový uživatelský rámec kolem základního herního zážitku. Toto rozhodnutí bylo mnohem snazší díky skutečnosti, že jsme se s převedeným médiem pohybovali těsně kolem 10megového limitu pro stahování bezdrátových aplikací. Pravděpodobně by to byl jediný projekt ID, který kdy byl v dosahu této značky, takže bychom se měli pokusit zapadnout.

Původní zobrazení stavového řádku ve hře muselo zmizet, protože se očekávalo, že palce uživatele pokrývají velkou část této oblasti. Mohli jsme jít jen s plovoucími statistikami, ale myslel jsem, že BJova tvář dodala hře hodně osobnosti, takže jsem to chtěl nechat uprostřed obrazovky. Bohužel způsob kreslení grafiky zbraní, zejména nože, způsoboval problémy, pokud byly pouze nakresleny nad stávající grafikou obličeje. Nechal jsem si vytvořit širší pozadí pro obličej a využil jsem extra prostor pro směrové ukazatele poškození, což bylo příjemné vylepšení hratelnosti. Bylo těžké rozhodnutí zastavit se u zpětné vazby na poškození, protože spousta maličkostí s kopy pohledem a tvarovanou obrazovkou prolnutí a dokonce i dvojité vidění nebo efekty rozmazání, to vše se dá docela snadno přidat a je docela účinné, ale vzdaluje se "klasický".

Začal jsem s výslovným tlačítkem „otevřených dveří“ jako původní hra, ale rychle jsem se rozhodl, že to udělám automaticky. Wolf a Doom měli explicitní tlačítka "použít", ale u Quake jsme je odstranili s aktivací kontaktu nebo blízkosti na všem. Moderní hry obecně přinesly explicitní aktivaci zpět situačně převládajícím útokem, ale honba za tlakovými stěnami ve Wolfovi střílením každé destičky by nevyšla. Existovaly některé bojové taktiky, které zahrnovaly explicitní zavírání dveří, které jsou pryč s automatickým používáním, a některé tajné push wall se triviálně najdou, když před nimi zvednete předmět, ale tohle bylo rozhodně správné rozhodnutí.

Ve Wolfovi jste mohli vyměňovat zbraně, ale ve skutečnosti to neudělal téměř nikdo, kromě občasného šetření munice pomocí řetězové pistole nebo výzev typu „porazit hru pouze nožem“. Tato funkce neospravedlňovala nepořádek rozhraní.

Koncept "životů" byl stále ve vlku, s 1-ups a extras v určitých skóre. To jsme zavrhli v Doomu, který byl v té době vlastně svým způsobem inovativní, protože akční hry na počítačích a konzolích byly stále hodně orientované na arkádové hry. Ve spoustě dnešních her mi chybí koncept „skóre“, ale myslím si, že konečná a granulovaná povaha nepřátel, úkolů a předmětů ve Wolfovi je lepší. hodí se pro statistiky na konci úrovně, takže jsem odstranil životy i skóre, ale přidal trvalá ocenění za par time, 100 % zabití, 100 % tajemství a 100 % poklady. Samotné ocenění nebylo dostatečným podnětem k tomu, aby byly poklady relevantní, a tak jsem je proměnil v nezavíčkované drobky zdraví +1, díky kterým je vždy najdete rádi.

Zvětšil jsem rádius vyzvednutí předmětů, čímž jsem se vyhnul mírné frustraci z toho, že musíte někdy udělat pár průchodů kolem předmětu, když uklízíte místnost plnou věcí.

Při novém startu jsem zdvojnásobil počáteční munici. Pokud byl hráč právě zabit, není dobré ho ještě více frustrovat přísným omezením zachování munice. Proběhla určitá debata o správném způsobu, jak zacházet se smrtí: respawnovat se na úrovni, jaká je (dobré v tom, že můžete pokračovat v pokroku, pokud jen dosáhnete pokaždé o jeden výstřel navíc, špatné v tom, že sběrače zbraní již nejsou k dispozici), respawnujte se, jakmile jste vstoupili do úrovně (dobré – ponechte si kulomet / chaingun, špatný -- můžete mít 1 zdraví), nebo, co jsem zvolil, restartujte mapu se základními statistikami, jako byste mapu spustili z nabídka.

V původním datovém souboru Wolf je 60 úrovní a chtěl jsem, aby lidé měli svobodu snadno přeskakovat mezi různými úrovněmi a dovednostmi, takže není potřeba začít na začátek. Úkolem je /dokončit /úroveň, ne /dostat se na/ úroveň. Je zábavné začít vyplňovat mřížku dokončených úrovní a ocenění a často je lepší zkusit po smrti jinou úroveň. Jedinou výjimkou z možnosti začít kdekoli je, že musíte najít vchod do tajných úrovní, než tam začnete novou hru.

Když jsem sledoval první testery, největší problém jsem viděl v tom, že lidé sklouzli ze dveří, než se otevřely, a museli se vracet, aby prošli. Ve Wolfovi, pokud jde o detekci kolizí, bylo všechno jen dlaždicová mapa 64x64, která byla buď pevná, nebo průchodná.
Dveře změnily stav dlaždic, když se otevřely nebo se začaly zavírat. Diskutovalo se o magnetizaci úhlu pohledu ke dveřím nebo o nějakém zkosení oblastí kolem dveří, ale ukázalo se, že je to docela dobré snadné vyrobit, aby dlaždice dveří měly pouze pevné centrální jádro proti hráči, takže hráči by se zasunuli do „zářezu“ s dveřmi, dokud se otevřel. To přineslo obrovské zlepšení v hratelnosti.

O hře, která se načte během několika sekund, s automatickým uložením vaší pozice při ukončení, je rozhodně co říci. Hodně jsem testoval hraním hry, ukončením, abych si udělal poznámky v poznámkovém bloku pro iPhone, a poté restartováním Wolfa, abych pokračoval ve hře. To, že nemusíte na začátku přeskakovat animovaná loga, je příjemné. Dostali jsme se k tomu docela náhodou s velmi malou a jednoduchou povahou Wolfa, ale myslím, že stojí za to konkrétně optimalizovat pro budoucí tituly.

Původním cílem tohoto projektu bylo prozkoumat schémata ovládání FPS pro iPhone a bylo provedeno mnoho testů s různými schématy a parametry. Trochu jsem doufal, že bude existovat jeden "zjevně správný" způsob, jak to ovládat, ale ukázalo se, že tomu tak není.

Pro příležitostného hráče, který hraje poprvé, je jednoznačně nejlepší mít jednu páku pro ovládání vpřed/vzad/otočení a tlačítko střelby.

Ovládání náklonu je matoucí pro první expozici ve hře, ale myslím, že to přidává na zábavnosti, když ho používáte. Líbí se mi možnost naklonění a pohybu, ale zdá se, že lidé, kteří na iPhonu hrají hodně řidičských her, mají rádi naklonění a otočení, kde projíždíte BJ úrovněmi. Tilt potřebuje slušné pásmo necitlivosti a trocha filtrování je dobrá. Překvapilo mě, že přesnost akcelerometru byla jen několik stupňů, díky čemuž se nehodí pro jakékoli přímé mapované použití, ale funguje dostatečně dobře jako relativní kontrola rychlosti.

Seriózní konzoloví hráči mají tendenci snadno používat režimy ovládání "dual stick", ale umístění tlačítka střelby je problematické. Použití ukazováčku ke střelbě je účinné, ale nepohodlné. Vidím, že mnoho hráčů jen pohne palcem ke střelbě a používá ostrý pohyb pro jemné doladění cíle. Je téměř lákavé pokusit se unést boční přepínač hlasitosti pro oheň, ale ergonomie není úplně správná, a bylo by to velmi nepodobné Applu a nebylo by k dispozici na iPodu touch (a navíc jsem nemohl přijít na to, jak...).

Zkoušeli jsme střelbu nakloněním dopředu, abyste mohli držet palce na dvou ovládacích pákách, ale moc to nefungovalo. Naklonění vpřed/vzad má u čehokoli inherentní problém s proměnným úhlem držení a binární přechodový bod je pro lidi těžké držet bez nepřetržité zpětné vazby. Pomohla by lepší vizuální zpětná vazba na aktuální úhel a bod výletu, ale moc jsme to nesledovali. Pro hru s řekněme raketometem může být zajímavé třesení/strčení do ohně, ale pro vlka to není dobré.

Pro ovládací páky bylo kritické, aby byly analogové, protože digitální směrové podložky se ukázaly jako docela neúčinné na dotykových obrazovkách kvůli postupnému nedostatku registrace během hry. S analogovou pákou má hráč ve většině případů nepřetržitou vizuální zpětnou vazbu o poloze páky, takže se může sám opravit. Důležité je vyladění mrtvého pásma a chování při vyklouznutí.

Kritéria návrhu úrovní od Wolfensteina hodně pokročila, ale nehodlal jsem otevřít možnost úpravy úrovní, i když na začátku první úroveň je pro prvního hráče bolestně špatná, s maličkými, symetrickými místnostmi, aby si narazil nos do zdí a otočil se v. Myšlenka je taková, že jste hru spustili ve vězeňské cele poté, co jste udeřili svého strážce do hlavy, ale i s úplně stejnými herními nástroji bychom nyní hráče provedli zážitkem mnohem lépe. Některé úrovně jsou stále velmi zábavné a je zajímavé číst poznámky Toma Halla a Johna Romera ve starých příručkách, ale pravdou je, že některé úrovně byly vyčištěny za pouhých pár hodin, na rozdíl od dlouhého procesu testování a úprav, který dnes probíhá.

Tim Willits na to upozornil až poté, co jsem si myslel, že jsem se hrou v podstatě skončil slon v herní místnosti -- pro 95 % hráčů není bloudění ztracené v bludišti nic moc zábava.
Implementace automapy byla docela jednoduchá a pravděpodobně přispěla k požitku ze hry víc než cokoli jiného. Než jsem to přidal, myslel jsem si, že všech 60 úrovní ve skutečnosti dokončí jen opravdu zanedbatelné množství lidí, ale teď si myslím, že by mohlo být dost lidí, kteří se přes ně dostali, aby ospravedlnili přenesení úrovní Spear of Destiny později.

Když jsem poprvé přemýšlel o projektu, tak trochu jsem předpokládal, že se s hudbou nebudeme obtěžovat, ale Wolf3D Redux už měl kód, který převedl starý hudební formát id na ogg, takže jsme na začátku souhlasili s podporou a ukázalo se to docela dobrý. Skončili jsme ripováním zvukových stop z červené knihy z jednoho z pozdějších komerčních vydání Wolf a kódováním při jiném datovém toku, ale nebýt počáteční podpory, pravděpodobně bych se neobtěžoval. Bylo by hezké znovu nahrát hudbu pomocí vysoce kvalitního MIDI syntezátoru, ale neměli jsme původní MIDI zdroj a Christian řekl, že převod zpět z hudebního formátu id na midi byl trochu flekatý a zabralo by to dost práce mít pravdu. Poslal jsem e-mail Bobbymu Princeovi, původnímu skladateli, abych zjistil, jestli má ještě nějaké vysoce kvalitní verze, ale neozval se mi.

Hra je na moderní standardy rozhodně zjednodušená, ale stále má své momenty. Dostává kapku na hnědou košili, zrovna když vytahuje pistoli z pouzdra. Přimět SS dělat "trhavý tanec" s vaším kulometem. Zajít za roh a vybít zbraň na... hrnková rostlina. Simplistic hraje dobře na iPhone.

*Poznámky k programování*

Cass a já jsme hru na iPhone zprovoznili velmi rychle, ale trochu mě zklamaly různé problémy kolem grafiky ovladač, zpracování vstupu a plánování procesu znamenaly, že hrát hru s uzamčenou frekvencí 60 Hz na iPhone nebylo ve skutečnosti možný. Doufám, že je někdy v budoucnu proberu s Applem, ale znamenalo to, že Wolf bude hrou zhruba se dvěma tiky. Je to jen „zhruba“, protože neexistuje podpora swapintervalu a plánování časovače má v sobě velkou variabilitu. Zdá se, že na tom tolik nezáleží, hra je stále plynulá a zábavná, ale rád bych ji alespoň postavil do kontrastu s perfektním limitním pouzdrem.

Ukazuje se, že došlo k několika problémům, které vyžadovaly práci i při 30 Hz. Pro hru jako Wolf je každý počítač, který se dnes používá, v podstatě nekonečně rychlý a kód Wolf3D Redux dělal některé věci, které byly pohodlné, ale plýtvání. To je často přesně ta správná věc, ale iPhone není tak nekonečně rychlý jako stolní PC.

Wolfenstein (a Doom) původně kreslil postavy jako řídce roztažené sloupce plných pixelů (svislé místo horizontální pro efektivitu v prokládaném rovinném režimu-X VGA), ale verze OpenGL potřebují generovat čtvercovou texturu průhledné pixely. Typicky je to pak nakresleno buď alfa blendingem, nebo alfa testováním velké čtveřice, která je většinou prázdným prostorem. Můžete hrát několik raných úrovní Vlka, aniž by to byl problém, ale v pozdějších úrovních existují často velká pole s desítkami položek, které se naskládají do dostatečného překreslení, aby bylo možné maximálně využít GPU a snížit snímkovou rychlost na 20 snímků za sekundu. Řešením je svázat pevné pixely v textuře a nakreslit pouze omezenou oblast, což řeší problém s většinou položek, ale Wolf má několik různých silně používaných textur stropních lamp, které mají malou lampu nahoře a tenký, ale po celé šířce stín na dno. Jediná hranice nevylučuje mnoho texelů, takže jsem uzavřel dvě hranice, díky kterým se vykreslovaly mnohonásobně rychleji.

Další problém se týkal CPU. Wolf3d Redux použil původní schéma odlévání paprsků, aby zjistil, které stěny byly viditelné, a poté zavolal rutinu pro kreslení každé dlaždice stěny pomocí volání OpenGL. Kód vypadal asi takto:

DrawWall( int wallNum ) {
název znaku[128];
textura_t *tex;
sprintf( jméno, "stěny/%d.tga", wallNum );
tex = FindTexture( name );
...
}
texture_t FindTexture( const char *name ) {
int i;
pro (i = 0; i < numTextures; i++) {
if ( !strcmp( name, texture[name]->name ) ) {
return texture[name];
}
}
...
}

Trhl jsem sebou, když jsem to viděl v horní části profilu nástrojů, ale zase se dalo hrát na všechny rané úrovně, které měly pouze dvacet nebo třicet viditelných dlaždic najednou, aniž by to ve skutečnosti bylo a problém.
Některé pozdější úrovně s obrovskými otevřenými plochami však mohly mít přes sto viditelných dlaždic a to vedlo opět k 20 Hz. Řešením byla triviální změna na něco podobného:

DrawWall( int wallNum ) {
texture_t *tex = wallTextures[wallNum];
...
}

Wolf3D Redux obsahoval utilitu, která extrahovala různě zabalená média z původních her a přeměnila je na čistší soubory s moderními formáty. Bohužel, pokus o zvýšení kvality původních uměleckých děl pomocí grafického škálování hq2x pro přeměnu umění 64x64 do lépe filtrovaných umění 128x128 způsobilo, že spousta skřítků měla kolem sebe třásně kvůli nesprávné manipulaci s alfa hranic. Nebylo možné to opravit při načítání, takže jsem musel provést správné operace obrysu s barvou, ale s 0-alfa v upravené verzi extraktoru. Také jsem se rozhodl provést veškerou konverzi formátu a generování mip tam, takže během načítání textur jsem nespotřeboval žádný významný čas procesoru, což pomohlo snížit dobu načítání. Experimentoval jsem s formáty PVRTC, ale zatímco pro stěny by to bylo v pořádku, na rozdíl od DXT z toho nemůžete dostat bezeztrátovou masku alfa, takže by to nefungovalo pro skřítky. Kromě toho si opravdu nechcete moc zahrávat s pečlivě vybranými pixely v bloku 64x64, když jej příležitostně zvětšíte na větší než obrazovku.

Také jsem musel na poslední chvíli změnit původní média – organizace Červeného kříže uplatnila svá práva na ochranné známky nad červenými kříži (povzdech) nějakou dobu poté, co jsme vydali původní hru Wolfenstein 3D, a všechna nová vydání nesmí používat červené křížky na bílém pozadí jako zdraví symboly. Pro toto vydání byla upravena jedna jediná grafika skřítka.

Kód uživatelského rozhraní byla první věc, kterou jsem začal dělat od ostatních programátorů v Id, když už jsem nemusel psát každý řádek kódu v projektu, protože mi to obvykle připadá zdlouhavé a neužitečné. Tohle byl tak malý projekt, že jsem do toho šel a udělal to sám a dozvěděl jsem se zajímavou maličkost. Kód uživatelského rozhraní má tradičně samostatný kód pro kreslení a zpracování vstupu, ale na zařízení s dotykovou obrazovkou často dobře funguje kombinované „rozhraní okamžitého režimu“ s kódem, jako je tento:

if ( DrawPicWithTouch( x, y, w, v, name ) ) {
menuState = newState;
}

Udělat to pro plovoucí uživatelské vstupní ovládací prvky hry by zavedlo rámec latence odezvy, ale pro nabídky a podobně to funguje velmi dobře.

Jeden z nejhorších okamžiků během vývoje byl, když jsem se připravoval na připojení automatického ukládání hry při ukončení aplikace. Nebyl tam žádný kód pro uložení hry. Vrátil jsem se a popadl původní 16bitový DOS kód pro načtení/uložení hry, ale při kompilaci jsem zjistil, že kódová základna Wolf3d Redux se změnila mnohem víc než jen problémy s blízkým/vzdáleným ukazatelem, asm kódem a komentáři bloky. Změny byly rozumné věci, jako seskupování více proměnných do struktur a definování výčtů pro více věcí, ale znamenalo to, že jsem se nezabýval komerčně testovaným jádrem, které jsem si myslel byl. Znamenalo to také, že jsem se mnohem více obával o podivného nepřítele, který prolezl světovou chybou, kterou jsem párkrát viděl.

Vážně jsem uvažoval o návratu k původní kódové základně a reimplementaci vykreslování OpenGL od nuly. Další věc, která mi na kódové základně Redux vadila, byla, že se v podstatě jednalo o naroubování kódu Wolf3D doprostřed vykuchané kódové základny Quake 2. To bylo v některých ohledech skvělé, protože nám to poskytlo konzolu, cvary a přenosný rámec systému / OpenGL, a bylo jasné, že původním záměrem bylo posunout se k funkcionalitě pro více hráčů, ale bylo toho hodně udit. Původní vlčí kód obsahoval pouze několik desítek souborů C, zatímco rámec kolem něj byl několikanásobek.

Při prohlížení původního kódu se mi vrátily nějaké vzpomínky. Přestal jsem podepisovat soubory kódu před lety, ale horní část WL_MAIN.C mě rozesmála:

/*

WOLFENSTEIN 3-D

Výroba ID softwaru

od Johna Carmacka


*/

Nebylo to datované, ale bylo to v roce 1991.

Nakonec jsem se rozhodl zůstat u kódové základny Redux, ale dostal jsem mnohem více zdarma, když jsem z ní hacknul velké kusy. Znovu jsem implementoval načítání/ukládání hry (opravil jsem nevyhnutelné chyby ukazatele) a tím, že jsem v kódu zahazoval tvrzení, vysledoval další problém až k problému s podepsaným porovnáním s jedním z nových typů výčtu, které porovnávají jako nepodepsaný. Stále si nejsem jistý, jestli to bylo správné volání, protože kódová základna je trochu nepořádek se spoustou zbytkového kódu, který ve skutečnosti nic nedělá, a já teď nemám čas to všechno vyčistit.

Samozřejmě, že to může udělat někdo jiný. Úplný zdrojový kód komerční aplikace je k dispozici na webových stránkách. Trochu se zamyslelo nad tím, že kdybych se vrátil k původnímu zdroji, projekt by nemusel být pod GPL. Wolf a obchod s aplikacemi představuje jakousi jedinečnou situaci – uživatel si nemůže jednoduše zkompilovat kód a rozhodnout se, že za aplikaci nebude platit, protože většina uživatelů registrovaní vývojáři a data nejsou snadno dostupná, ale ve skutečnosti existuje určitá míra komerčního rizika v rychle se rozvíjejícím vývoji iPhone společenství. Nebude těžké vzít kód, který je už tak zábavné hrát, vytáhnout ze sítě spoustu zábavných věcí z různých projektů lidé s kódem za ta léta skončili, oprášili některé staré editory map a naložili si moderní kvalitní umění a zvuk.

Každý má právo to udělat, a pokud chce, může se agresivně pokusit původní hru pohřbít. Nicméně si myslím, že je tu vlastně docela dobrá příležitost ke spolupráci. Pokud někdo vyrábí kvalitní produkt a odkazuje na původní aplikaci Wolf, můžeme začít mít odkazy na projekty „vlk odvozené“ nebo „související s vlkem“.
To by mělo být výhrou pro všechny.

Vracím se na chvíli k Rage, ale očekávám, že Classic Doom přijde poměrně brzy pro iPhone.

readme_iWolf.txt


Původní Wolfenstein 3D kód byl napsán koncem roku 1991 / začátkem roku 1992 pomocí 16bitového Turbo C a TASM assembler a zacílený na 286 MSDOS systémů s grafikou VGA a ideálně trochu rozšířený nebo rozšířený Paměť.

Původní zdroj pro Wolfenstein 3D jsem vydal před mnoha lety, původně pod licencí pro nekomerční účely, později pod GPL. Starý kód je stále dostupný na různých místech ( http://www.btinternet.com/~belowe/ ), ale na moderních platformách to není příliš užitečné. Existuje několik open source projektů, které modernizovaly kód tak, aby fungoval na 32bitových systémech a mohl využívat akceleraci OpenGL. Verzi pro iphone jsem spustil s kódovou základnou Wolf3D Redux ( http://wolf3dredux.sourceforge.net/ ), který zjevně obsahoval spoustu kódu z NewWolf ( http://newwolf.sourceforge.net/ ).

Nejprve jsem zvažoval, že zkusím postavit verzi pro iphone jako patch, ale když jsem se rozhodl, že to udělám malý výzkumný projekt do komerční verze (a udělejte to ve spěchu), začal jsem vyrábět více velkoobchodně Změny. Kódová základna Redux v podstatě vykuchala kódovou základnu Quake 2 a naroubovala do ní Wolfensteina, který několik pěkných bodů, ale znamenalo to, že systémový kód byl mnohonásobně větší než skutečná hra Wolfenstein kód. Vlastně to ničemu neublížilo a uvažoval jsem o tom, že to všechno nechám, ale byl to takový nepořádek, že jsem nakonec všechno srovnal a vystřihl asi polovinu kódu prostředí. Nebyl učiněn žádný pokus o to, aby byl tento projekt přenosný, i když by nebylo těžké to vyčistit.

V minulosti vydání zdroje ID neobsahovala žádné datové soubory a vy jste museli extrahovat datové soubory z komerčně získané verze hry, pokud jste chtěli experimentovat s původní hrou data. Protože není možné, aby uživatelé roztrhli balíček aplikací z App Store, aby se dostali k datům, přidávám je se zdrojovým kódem, aby to bylo snadné. Je pro vás ctí koupit si kopii v App Store před použitím dat. :-) Zdrojový kód je pod licencí GPL, ale data jsou stále přísně chráněna autorským právem ID softwaru bez udělení licence k distribuci mimo tento balíček vydání kódu nebo k použití pro jakékoli komerční účely. Pokud je kód zpřístupněn pod licencí GPL, můžete zcela jistě volně nahradit všechna data a vytvářet komerční aplikace.

/newCode/wolf 32bitový Wolfenstein kód
/newCode/env Kód odvozený od Quake 2
/newCode/iphone Nově zapsaný kód iphone a soubory projektu xcode
/newCode/Tremor Unodified ogg Tremor kód pro hudbu na pozadí
/base Data hry

Nemohu říci, že je zde mnoho opravdu dobrého kódu -- kód vlka je zmutovaný, kód quake 2 je pozůstatek a nový kód byl napsán ve spěchu, ale vše dohromady ladí jako docela zábavná hra a dobrá testovací platforma pro různé věci.

Pokud někdo vytvoří další kvalitní komerční aplikaci založenou na tomto kódu, dejte nám vědět a pravděpodobně můžeme provést nějaké křížové propojení.

John Carmack
2009/03/20