טכניקות מתקדמות

בעמוד זה מפורטות טכניקות מתקדמות במשחק: טכניקות שאינן דרושות כדי לכתוב שורד בסיסי, אך בעלות פוטנציאל לתת יתרון משמעותי למי שיעשה בהן שימוש נבון.

שיתוף פעולה בין שורדים

מנוע המשחק מאפשר לכל צוות להכניס לתחרות שני שורדים שונים בו-זמנית, כך שניקוד הצוות יקבע לניקוד המצטבר של שני השורדים ביחד.

שני השורדים נפרדים לכל דבר ועניין - אוגרים, מחסנית, זמן מעבד - אך מובטח שתמיד יטענו יחדיו לזירה (במקומות אקראיים, כמובן). תוכלו לראות את החלק היחסי של כל שורד בניקוד הצוותי בגרף העמודות של ניקוד הצוותים: עמודת הניקוד של הצוות מחולקת לשני צבעים.

כדי לאפשר לשני השורדים לשתף ביניהם אינפורמציה בצורה חשאית (מבלי ששורדים של צוותים אחרים יוכלו לראות אותה), המנוע מגדיר לכל צוות בלוק זיכרון "צוותי" של 1024 בתים, המתחיל בכתובת ES:0000.

על מנת שמנוע המשחק ידע ששני שורדים שייכים לאותה קבוצה, יש לקרוא להם בשמות מתאימים. לדוגמא: קבוצה בשם rocky תקרא לשורדים בשמות rocky1 ו-rocky2 בהתאמה (אלה יהיו שמות הקבצים של השורדים כפי שיופיעו בספריה survivors, ללא סיומת קובץ!)

האצת השורד

במצב רגיל, מנוע המשחק יריץ בכל סיבוב אופקוד בודד של כל שורד. המנוע מאפשר לשורדים לקבל זמן מעבד רב יותר, ע"י שימוש באופקוד מיוחד.

לכל שורד מוגדר אוגר וירטואלי בשם Energy, בגודל 16 ביט. הערך ההתחלתי של האוגר הוא אפס, ובכל 5 סיבובים מנוע המשחק מחסיר 1 מערכו (אם היה אפס, נשאר אפס).

שורדים יכולים להגדיל את ערך האוגר ע"י שימוש באופקוד ייעודי: קריאה לאופקוד WAIT בדיוק ארבע פעמים ברציפות (ז"א 4 פעמים הבית 09Bh). מנוע המשחק מזהה זאת כאופקוד הוירטואלי NRG ומתייחס אליו כאל אופקוד בודד מבחינת זמן ריצה.

שימו לב שהאופקוד WAIT (המקורי) מוגדר עדיין כאופקוד בלתי נתמך. ז"א, קריאה אליו פעם אחת (או שתיים, או שלוש) תגרום לשורד למות.

כל קריאה לאופקוד NRG תגדיל את ערך האוגר Energy ב-1. "מהירות" השורד מחושבת בתחילת כל סיבוב עפ"י הנוסחא הבאה:

Speed = log2(energy) + 1

אם Energy היה אפס, גם המהירות תהיה אפס. בכל מקרה, המהירות תהיה בטווח 0-16.

עפ"י מהירות השורד, המנוע יקבע האם להריץ אופקוד נוסף שלו: נניח המהירות היא 5, המשמעות היא שבסיכוי 5/16 השורד יקבל אופקוד נוסף באותו סיבוב. ז"א, המנוע יריץ לפחות אופקוד אחד של השורד, ולכל היותר שניים.

פצצות חכמות

מנוע המשחק תומך בשני אופקודים וירטואליים, בנוסף לאופקוד הוירטואלי NRG (שתואר בסעיף הקודם).

האופקוד הראשון הוא INT 0x86 (ז"א רצף הבתים 0CDh 086h), והוא מאפשר "הפצצה כבדה" של איזור בזיכרון. כאשר האופקוד נקרא, מנוע המשחק יכתוב 64 פעמים את DX:AX לכתובת המתחילה ב-ES:DI (ובסה"כ יכתבו 256 בתים). הבתים יכתבו לפי הסדר הבא: AL, אח"כ AH, אח"כ DL ולבסוף DH - וחוזר חלילה. בדומה לאופקוד stosw, כיוון הכתיבה (קדימה או אחורה) נקבע לפי ערך ה-direction flag, וערכם של ES:DI לאחר הקריאה משתנה בהתאם.

האופקוד השני הוא INT 0x87 (ז"א רצף הבתים 0CDh 087h), והוא מאפשר "הפצצה חכמה" של איזור בזיכרון. כאשר האופקוד נקרא, מנוע המשחק מחפש את ההופעה הראשונה בסגמנט של 4 הבתים DX:AX, החל מהכתובת ES:DI (חיפוש הבתים הוא לפי הסדר הבא: AL, אח"כ AH, אח"כ DL ולבסוף DH). במידה והבתים נמצאו, המנוע יכתוב במקומם את 4 הבתים CX:BX. כיוון החיפוש בתוך הסגמנט (קדימה או אחורה) נקבע לפי ערך ה-direction flag, אך ערכם של ES:DI לא משתנה בכל מקרה (כך שלא ניתן לדעת באיזו כתובת נמצאו הבתים, ואפילו האם נמצאו בכלל). כאמור, האופקוד פועל רק על רצף הבתים הראשון שנמצא.

חשוב לציין כי על שני האופקודים חלות אותן מגבלות שחלות על כל גישה לזיכרון, ז"א הקריאה והכתיבה מותרות רק בסגמנט הזירה, במחסנית האישית של השורד או בזיכרון הקבוצתי המשותף.

השימוש בשני האופקודים מוגבל למספר פעמים לכל שורד: כל שורד יכול להשתמש ב-2 הפצצות כבדות ובהפצצה חכמה אחת בכל סיבוב (ההגבלה היא לכל שורד, ולא לכל קבוצה). שימוש באופקוד מעבר לכך אינו עושה דבר - פעולה זו אינה מוגדרת כבלתי חוקית ולכן השורד לא יפסל, אך לקריאה לא תהיה כל השפעה.