- Hypersomnia एक community-driven मल्टीप्लेयर शूटर है, जो दोस्तों के बीच duel और दो clans के बीच battles को support करता है, और 2017 से online play के लिए उपलब्ध गेम है
- यह Modern C++ में लिखा गया है, बिना किसी game engine के बनाया गया है, और एक free open source game के रूप में उपलब्ध है
- गेम की बनावट Counter-Strike की tactics, Hotline Miami की dynamism, और old-school RPG की pixel art nostalgia का मिश्रण है; इसमें फिलहाल 24 unique guns, 10 community maps, और Bomb defusal व Gun game दो modes उपलब्ध हैं
- वितरण के रास्ते browser play, Steam, Windows, Linux AppImage, और macOS dmg हैं; गेम शुरू होने पर interactive Tutorial चलता है
- सर्वर चलाना Server Docker या Headless AppImage से संभव है, और सभी archives digitally signed हैं तथा signature verification का रास्ता दिया गया है
- बिल्ट-इन map editor 100% WYSIWYG तरीके से सीधे game world में काम करता है, ImGui से बना है, और JSON map format का उपयोग करता है
- अगर map directory में PNG, WAV, OGG folders पेस्ट किए जाएँ, तो गेम उन्हें अपने-आप पहचान लेता है
- किसी GIF को scene में drag-and-drop करने पर वह गेम के अंदर तुरंत animation की तरह काम करने लगता है
- जिस map पर काम चल रहा हो, उसे एक क्लिक में playtest किया जा सकता है, और connected clients मौजूदा version का map और custom resources अपने-आप download कर लेते हैं
- server, game, और editor हर OS पर एक ही executable के अंदर हैं, इसलिए editor से session शुरू करके ESC से रोकने के बाद फिर मूल स्थिति में लौटना संभव है
- networking cross-platform simulation determinism पर आधारित है, और browser client, Windows, Linux, macOS native clients, यहाँ तक कि native ARM builds पर भी 100% deterministic तरीके से काम करती है
- नेटवर्क पर लगातार सभी object states भेजने के बजाय केवल player inputs भेजे जाते हैं, और बाकी सब हर client लोकल में simulate करता है
- floating-point calculation determinism के लिए हर OS पर
clangका उपयोग किया जाता है, Windows builds में/fp:strict, ARM builds में-ffp-model=strictलगाया जाता है, औरstd::sin,std::sqrtजैसे math functions को STREFLOP family implementations से बदला गया है - दो player-controlled characters वाले उदाहरण में, 60Hz tickrate पर traffic लगभग
40 kbit/s (= 5 KB/s)है, और network traffic में केवल player-controlled characters ही योगदान देते हैं
- browser client और native clients libdatachannel और datachannel-wasm की बदौलत एक ही server पर साथ खेल सकते हैं
- browser में server host करके native client से connect किया जा सकता है, और native client में server खोलकर browser access link भी भेजा जा सकता है
- browser version Discord login, ranked matches, और global Leaderboards को support करता है; Discord account और Steam account को link करने पर Steam version और web version एक ही rating साझा करते हैं
- texture packing के लिए लिखा गया rectpack2D, Assassin's Creed: Valhalla, एक drone manufacturer, और 2 scientific papers में इस्तेमाल हुआ है
- memory pool implementation contiguous storage, O(1) allocation, O(1) deallocation, O(1) dereference, auto-expansion, और deterministic behavior देती है; initial world state transfer के समय game object pool की internal state भी शामिल की जाती है, ताकि clients वही object identifiers और memory order को deterministic रूप से simulate कर सकें
- बिल्ट-इन self-updater updates को अपने-आप download और apply करता है,
ssh-keygencall के जरिए यह verify करता है कि update hardcoded developer public key से आया है, और अगर build hosting hack होकर malicious version अपलोड हो जाए तो मौजूदा clients उस update को लागू करने से मना कर देते हैं
1 टिप्पणियां
Hacker News की राय
मैं सोच रहा था कि क्या floating point arithmetic पूरी तरह specified नहीं है, लेकिन पहले search कर लेना चाहिए था: https://stackoverflow.com/questions/49471943/floating-point-...
यह सिर्फ एक
sqrtinstruction से खत्म नहीं होता, बल्कि Taylor approximation से शुरू करके Newton method को कुछ बार चलाकर जवाब refine किया जाता है, इसलिए Taylor series की degree, center point, और iteration count जैसी choices आती हैंIEEE 754 multiplication को define कर सकता है, लेकिन
sqrt,sin,cos,tanके लिए calculation method तय करनी पड़ती है, और आमतौर पर उसका implementation compiler द्वारा दी गई standard library में होता हैऊपर से, floating point में associativity नहीं होती, यानी
(a+b)+c != a+(b+c), इसलिए basic operations का order बदलने भर से भी result अलग हो सकता हैrounding behavior architecture के हिसाब से बदल सकता है, और अगर arm/amd/intel को मिलाया जाए तो nondeterministic behavior आने की संभावना है: https://en.wikipedia.org/wiki/IEEE_754#Reproducibility
लगता है यह game इस समस्या से बचने के लिए software floating point implementation इस्तेमाल करता है, और अगर unified compiler भी जोड़ दिया जाए तो ज़्यादातर समस्याओं से बचा जा सकता है
https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
C सहित कई भाषाओं में आम operators किसी खास floating point operation से explicitly map नहीं होते, इसलिए compiler के पास काफ़ी discretion होता है
और rounding mode जैसी अदृश्य global state भी कुछ हद तक इस्तेमाल होती है; याद पड़ता है कि DirectX पीछे से flags बदल दिया करता था
-marchअलग हो, तो results काफ़ी बदल सकते हैंबस वह open source नहीं था; इसका मतलब यह नहीं कि यह कोई achievement नहीं है। असल में यह बहुत कठिन काम है
[0] https://springrts.com/
यहाँ फर्क यह है कि RTS games deterministic floating point physics इस्तेमाल नहीं करते, इसलिए Hypersomnia को नए समाधान की ज़रूरत है
उसने TA और SupCom के छोड़े खालीपन को भरा, और SupCom 2 अपने आप में काफ़ी अच्छा casual और छोटा RTS था, लेकिन उतना नहीं
और PA की बात न ही करें तो बेहतर
BAR भी काफ़ी promising लगता है: https://www.beyondallreason.info
game खुद AC:Valhalla में नहीं गया था, बल्कि development के दौरान बनाई गई texture packing library गई थी[1]। बेशक, इससे उस उपलब्धि को कम नहीं आँक रहा; वह अपने आप में एक अलग लेख का विषय है
और यह कहना भी थोड़ा बढ़ा-चढ़ाकर लगता है कि यह Unity में इस्तेमाल हुए ECS system का source था। मैंने 2010 से पहले भी ECS इस्तेमाल करने वाले game engines उपयोग किए हैं, और game engine की दुनिया में यह Operation Flashpoint[2] से निकला हुआ लगता है
[1] https://github.com/TeamHypersomnia/rectpack2D
[2] https://t-machine.org/index.php/2007/09/03/entity-systems-ar...
कभी समय मिला, शायद retirement के बाद, तो मैं भी ऐसा कुछ करना चाहूँगा, और ऐसे projects उस दुनिया को सीखने के लिए अच्छे learning material बन सकते हैं
इससे 90s के आख़िरी दौर का ARC, यानी Attack Retrieve Capture, याद आता है, जो अब मुश्किल से Armor Critical के रूप में ज़िंदा है
https://en.wikipedia.org/wiki/Attack_Retrieve_Capture
http://armorcritical.com
project को बनाए रखने के लिए commercial तौर पर और क्या-क्या काम किए गए हैं, क्या Steam release की कोई योजना है, और persistent world gameplay को कैसे प्रभावित करती है—यह जानने की जिज्ञासा है
यह भी जानना है कि जब नया player जुड़ता है तो physics state को reconstruct करने की जो चतुर तकनीक है, वह मौजूदा players को कैसी दिखती है। उदाहरण के लिए, क्या bullets की position हिलती हुई दिखती है
मैंने अपनी savings भी अच्छी तरह invest की थीं, इसलिए Hypersomnia पर पूरी तरह focus कर सका
मैं इसे 2024 से पहले Steam पर लाना चाहता हूँ
अभी कोई persistent world बिल्कुल नहीं है; यह बस एक तरह का teaser था कि अगर गेम सफल हुआ तो आगे किस दिशा में जा सकता है
physics reconstruction में positions बिल्कुल नहीं बदलनी चाहिए। दोबारा बनाया जाने वाला हिस्सा सिर्फ contact या tree जैसी “hot state” है, और यह state सिर्फ उस क्षण मायने रखती है जब simulation को एक state से अगली state तक चलाया जाता है, इसलिए बाद की rendering पर इसका असर नहीं पड़ता
मौजूदा खिलाड़ियों पर इसका एकमात्र असर यही हो सकता है कि अगर reconstruct की जाने वाली physics world बहुत बड़ी हो तो एक बार frame drop हो जाए, लेकिन वास्तव में अभी सभी maps छोटे हैं और 3v3 मैचों के लिए सबसे उपयुक्त हैं
दूसरी बात, मुझे MacOS पर एक बड़ा bug मिला। pause screen/settings में mouse input बहुत ज़्यादा misaligned है, इसलिए main menu के options तक click नहीं हो पा रहे
मैंने screen capture, logs, और system report इकट्ठा कर लिए हैं: https://youtu.be/O4OoMdeFAt0
मैं लगभग हमेशा Windows और Linux पर खेलता हूँ, इसलिए MacOS पर लंबे समय तक चलाकर नहीं देखा, लेकिन देखूँगा कि इसे ठीक किया जा सकता है या नहीं
खासकर ECS और networking से जुड़ी posts
यह देखकर अच्छा लगा कि आपने इतनी प्रगति की है
README में deterministic architecture समझाते समय मैंने Glenn Fiedler की एक महत्वपूर्ण blog post लिंक की थी, लेकिन मैं वह व्यक्ति नहीं हूँ, इसलिए अगर कोई गलतफ़हमी हुई हो तो मेरा वह इरादा नहीं था
https://www.freeinfantry.com/
https://en.m.wikipedia.org/wiki/Infantry_(video_game)