システムショックのソースコードはGPLで公開されています

画像



非常に良いニュース:象徴的なシステムショックゲーム(PowerMacバージョン)のソースコードは、GNU General Public License v3.0の下で公式にアップロードされています 。 このゲームは1994年にリリースされ、Cで作成されました。



ご存知のように、元のゲーム「Looking Glass Studios」の作者は、出版社のエイドスインタラクティブの危機により、2000年に存在しなくなりました。 システムショックシリーズの権利は、現在、オリジナルのリメイク( 1か月前に開発が凍結され、 Kickstarterが成功して135万ドルを調達したにもかかわらず2020年にリリースが遅れた)のリメイクとシステムショック3の完全な継続に従事しているNight Dive Studiosによって購入されました、元の作者であるウォーレン・スペクターが参加して開発を行いました。ウォーレン・スペクターはゲーム業界に戻りました。



Githubのリンクからソースコード取得できます。 コンパイルを成功させるには、PowerMacまたはそのエミュレーター(例: SheepShaver )、 Metrowerks CodeWarrior 10 Tools 、および元のゲームのゲームデータが必要です。



いつものように、いくつかの興味深い発見がありました。たとえば、Looking Glass Studiosで働いていたゲームデザイナーのSeamus Blackleyは、すでに参照を見つけていました。



// *******************HACK*HACK*HACK*HACK*****************************+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // uchar EDMS_Seamus_is_an_asshole[12000]; // *******************HACK*HACK*HACK*HACK*****************************+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      
      





おそらく、ほぼ12 KBのメモリの「隠された」割り当てがありました-リリースに近いものが計画どおりに行かず、追加のメモリが緊急に必要な場合-最適化を行うよりも1行コメントを外す方がはるかに高速です。



次は、ソースコードから取られたもっと面白いコメントです。



 // limit framerate while scrolling to avoid flicker? // should really do something real about flicker anyway. #define SCROLL_FRATE 90
      
      





 // default units per second // in defiance of Rob, I use the number 13. #define MAP_SCROLL_SPEED 13
      
      





 // why!!!! why at the end, why randomly, hate hate hate // Clear out requests for (i=open_track; i < MLIMBS_MAX_CHANNELS -1; i++) current_request[i].pieceID = 255; // was -1
      
      





 #define ULTRA_GROSS_JOHN_MILES_HACK #ifdef ULTRA_GROSS_JOHN_MILES_HACK { #include <conio.h> if ((dev_info[MIDI_CARD]==GENMIDI)&&(dev_info[DIGI_CARD]==SOUNDBLASTERPRO2)) { int mod_loc=dev_info[DIGI_IO]; // loc, the io port to send too if (mod_loc==-1) mod_loc=0x220; // i know much secretness of destruction outp(mod_loc+4,0x83); // such that def io is 220, which AIL wont outp(mod_loc+5,0xb); // tell me till later, when we init it } // which we are not allowed to do yet } #endif
      
      





 // wow is this a total mess, goddamn #define is_solid() \ ((_face_topedge[(me_tiletype(cv->mptr)<<2)]==0xff)|| \ (me_clearsolid(cv->mptr)&_face_topmask)|| \ (me_subclip(cv->mptr)&_face_topmask)|| \ (_face_botedge[(me_tiletype((cv->mptr+y_map_step))<<2)]==0xff)|| \ (me_clearsolid((cv->mptr+y_map_step))&_face_botmask)|| \ (me_subclip(cv->mptr+y_map_step)==SUBCLIP_OUT_OF_CONE)) // note how pretty this looks till you look at the is_solid macro bool _fr_skip_solid_right_n_back(FrClipVec *cv, fix max_loc, int y_map_step) { if (is_solid()) { cv->loc[0]&=0xffff0000; cv->loc[0]+=_fixp1; cv->mptr+=1; while (is_solid()&&(cv->loc[0]<max_loc)) { cv->loc[0]+=_fixp1; cv->mptr+=1; } } return (cv->loc[0]>=max_loc); }
      
      





 ///// AAHRRHRHGGHGHG switch to secondary data cache!!! (...) // oh oh oh baby oh baby oh self modify height delta step baby now baby please // really, this wants to become the threaded nightmare assembler point coder from hell
      
      





元のソースコードは、改行のため読みにくくなっています(バージョン9より前のMac OSシステムでは、より馴染みのあるLF / CR + LFの代わりにCRシンボルを使用していました)。 修正可能な読みやすいフォークはこちらから入手できます



All Articles