תגובה ל: פרוייקט סיום - שיבת ציון - תיעוד שנכתבה ב20:21:26 29.06.2005
המשחק "שיבת ציון" מתנהל על-פני שטחים גדולים בארץ יהודה. כדי לממש משחק זה, אי אפשר להסתפק בעמוד אחד, ולכן המשחק כולל עמודים רבים - 23 עמודים (המקסימום הוא 25). לכל עמוד יש שם מהצורה "x y" (מילה עם רווח באמצע), כאשר x ו-y הם שני מספרים - מספר העמודה ומספר השורה של העמוד במפת המשחק.
המפה מבוססת, באופן סכימטי ביותר , על מפת ארץ ישראל בזמן שיבת ציון (ע"פ פירוש "דעת מקרא" לספר עזרא). מפת המשחק היא בגודל 5X5. כל משבצת בטבלה למטה מייצגת עמוד (page):
|
|
9 |
8 |
7 |
6 |
5 |
|
9 |
|
ש |
רמה |
ש |
גבעון |
|
8 |
ענתות |
ש |
ש |
ש |
ש |
|
7 |
הר הזיתים
|
ש |
ירושלים |
ש |
ש |
|
6 |
|
ש |
|
ש | |
|
5 |
ש |
ש |
בית לחם |
ש |
התחלה |
כפי שניתן לראות בטבלה, רוב העמודים הם מסוג "ש" כלומר "שביל". בעמודים אלה מצויירים שבילים שמובילים מעיר לעיר. חלק מהעמודים מייצגים ערים או איזורים גיאוגרפיים, וגם בהן יש אנשים שאפשר לדבר איתם. למשל, העמוד ששמו "7 9" מתאים למשבצת בטור 7 ובעמודה 9 במפה, שמייצג את העיר "רמה" (בעמוד זה יש ציור של עיר).
המשבצות הריקות מייצגות עמודים שאינם קיימים (למשל, אין עמוד שנקרא "8 6"). במשחק, הן מייצגות הרים בלתי-עבירים, שהמשתמש אינו יכול להגיע אליהם.
הקואורדינטות של העמוד הנוכחי, שבו נמצא השחקן, נשמרות במשתנים גלובליים - current_pagex , current_pagey .
בכל עמוד יש שתי תיבות-טקסט נסתרות שנקראות onenter ו- onexit . בתיבות אלה יכול המתכנת להכניס פקודות, שיתבצעו באופן אוטומטי בכל פעם שהשחקן ייכנס לעמוד (onenter) או ייצא ממנו (onexit). חלק מהתיבות ריקות - אך הן נמצאות בכל עמוד, כך שיהיה אפשר לשנות את המשחק בקלות בעתיד. דוגמה לשימוש בתיבות אלה: בעמוד שנמצא בטור 6, שורה 5, יש ציפור. בתיבה onenter בעמוד זה כתוב "bird, clickon" ובתיבה onexit כתוב "bird, clickoff". לכן, בכל פעם שנכנסים לעמוד זה, הציפור מתחילה לצייץ, ובכל פעם שיוצאים - הציוצים מפסיקים.
בנוסף לכך, בכל עמוד יש תיבת טקסט הנקראת voice . תיבה זו משמשת להצגת המילים של האנשים שמדברים במהלך המשחק; בכל פעם שדמות כלשהי אומרת משפט כלשהו - המשפט נכתב בתיבת-הטקסט voice, והתיבה זזה ומופיעה מעל ראשה של הדמות שאמרה את המשפט (זה מתבצע ע"י ההליך say - ע' תיעוד בהמשך).
בכל עמוד במפה יש צב שנקרא player , המייצג את השחקן; כאשר השחקן נכנס לעמוד חדש, מופעל הצב שנקרא "player" בעמוד החדש; עבור השחקן, זה נראה כאילו הוא עצמו עבר מעמוד לעמוד.
בכל עמוד יש ציור אחר - הציורים נועדו ליופי, וגם כדי לרמוז לשחקן לאן כדאי לו ללכת (בדרך-כלל כדאי ללכת על השבילים), אך הם אינם משפיעים על התנהלות המשחק בכל צורה שהיא. כלומר, באופן תיאורטי, השחקן לא חייב ללכת על השבילים - הוא יכול ללכת גם על קירות. אולם, בדרך-כלל, כשיש קיר או הר באחד הקצוות של המסך, הוא מציין שאי-אפשר לעבור את קצה המסך לעמוד אחר, כי אין שום עמוד במפה בכיוון זה. אם השחקן ינסה ללכת לשם, הוא ישמע צליל ויראה הודעה bump, ויחשוב שהוא התנגש בקיר - אך למעשה ההתנגשות לא נבעה מכך שמצוייר שם קיר, אלא בגלל שאין עמוד שאליו הוא יכול להגיע (מסקנה: אם המתכנת טועה ושוכח לצייר קיר במקום שבו צריך להיות קיר - השחקן עדיין לא יוכל לעבור לעמוד הסמוך; ואם המתכנת טועה ומצייג קיר במקום שבו לא צריך להיות קיר - השחקן עדיין יוכל לעבור לעמוד הסמוך דרך הקיר).
עץ-הקריאות של ההליכים הקשורים לתנועה:
move_by_key - קורא מקש מהמשתמש ומזיז את הצב בהתאם, בעזרת ההליכים הבאים:
השחקן, הדמויות שהוא פוגש, והחפצים שהוא נתקל בהם, מיוצגים ע"י צבים:
הליכים הקשורים לזיהוי סוג הצב:
olive? - מחזיר "אמת" אם הצב הנוכחי הוא זית, כלומר - שהוראת-העכבר שלו היא "take "olive".
deaf? - מחזיר "אמת" אם הצב הנוכחי הוא דמות חרשת, כלומר - שהוראת-העכבר שלה כוללת deaf_text.
בנוסף לכך, לכל צב יש משתנה-מצב (שנוצר ע"י turtlseown) בשם changed? . משתנה זה מאותחל בתחילת המשחק ל-false, והוא משתנה ל-true אם יש שינוי כלשהו שקשור לצב זה. דמויות אנושיות יכולות להשתנות, במקרים מסויימים, בעקבות שיחה עם השחקן - אם השחקן עזר להם לפתור בעיה כלשהי, אז ערך changed? שלהם ישתנה ל-true (בעזרת הפקודה setchanged? "true), וכך הם "יזכרו" שהם צריכים להתייחס אל השחקן יפה יותר בפעם הבאה שידברו איתו. גם חפצים יכולים להשתנות - למשל, במקרים מסויימים, הם יכולים להישבר, ואז הם מפסיקים לתפקד.
עץ-הקריאות של ההליכים הקשורים לשיחה:
converse :conversation :first_sentence_prefix - נהל שיחה בין הדמות הנוכחית לבין השחקן. לפני תחילת השיחה, ההליך בודק האם המרחק בין השחקן לבין הדמות הוא מספיק קטן כך שהדמות תשמע את השחקן (מרחק זה נמצא בקבוע הגלובלי :CONVERSATION_DISTANCE). אם המרחק גדול מדי - תוצג הודעה האומרת שהדמות לא יכולה לשמוע את השחקן - "too far to hear". אם המרחק מספיק קטן, השיחה מתנהלת בהתאם למבנה-השיחה המועבר בפרמטר :conversation. השיחה מתחילה בתת-השיחה, שהמשפט הראשון שלה מתחיל במחרוזת המועברת בפרמטר :first_sentence_prefix. אם אין תת-שיחה מתאימה - ההליך רק יציג את המחרוזת first_sentence_prefix ויסתיים.
textheight :text - הליך שמחשב את גובה הטקסט :text. משמש לחישוב המיקום שבו יש לשים את התיבה voice כך שהטקסט ייראה בדיוק מעל ראשה של הדמות המדברת.
show_talk_help - הליך שנקרא כאשר השחקן כותב, כתגובה לדמות, את האות "h" (קיצור של help). ההליך מציג עזרה שקשורה לשיחה - איזה מילים כדאי לנסות להגיד לדמות (העזרה מועתקת מתיבת-הטקסט שנקראת talk_help, שנמצאת בעמוד ההתחלתי - "5 5").
greet :text - הדמות הנוכחית אומרת משפט אחד קצר, וגם זזה במקום. הליך זה משמש כהוראת-עכבר עבור דמויות שאין להן תפקיד משמעותי בעלילה, ואין להן טקסט-שיחה מלא (לדוגמה: ראשי הערים, החיות).
think - הליך שמשמש להצגת הודעות. ההודעות מוצגות בצבע קבוע (MESSAGE_color) מעל לראשו של השחקן. הליך זה נקרא במקומות רבים, למשל - כשהשחקן מבקש לראות את רשימת החפצים שלו (inventory), לאחר שהשחקן לוקח חפץ (takeMany), כאשר השחקן לא יכול לקנות חפץ כי אין לו מספיק כסף (buy), או כאשר המשתמש מנסה לעבור לעמוד שאינו קיים (bump). משתמש בהליך:
say - ע' למעלה.
רשימת החפצים שנמצאים ברשותו של השחקן נשמרת במשתנה הגלובלי inventory. בתחילת המשחק הוא מאותחל לרשימה ריקה; במהלך המשחק הוא יכול להשתנות בכמה דרכים:
א.
take :item - הליך שנקרא כאשר השחקן מקליק על חפצים מסויימים. ההליך בודק האם המרחק בין השחקן לבין החפץ הוא מספיק קטן (נקבע ע"י הקבוע הגלובלי
TAKE_DISTANCE); אם המרחק גדול מדי, תודפס הודעה מתאימה מעל לראשו של השחקן (
too far to take); אם המרחק מספיק קטן, אז החפץ הנוכחי ייעלם מהמסך (ht) כך שהשחקן לא יוכל לקחת אותו שוב, והמחרוזת המועברת כפרמטר תתווסף פעם אחת למשתנה inventory, בעזרת ההליך -
* takeMany :item :count - הליך שמוסיף את המחרוזת :item לרשימת החפצים :inventory, מספר פעמים השווה לפרמטר :count. למשל: takeMany "shekel 5 מוסיף לרשימה inventory 5 איברים: shekel shekel shekel shekel shekel.
ב.
drop :item :count - הליך שנקרא כאשר השחקן זורק או נותן חפץ מסויים (בדרך-כלל משתמשים בו בתוך שיחות, כאשר השחקן מסכים לתת חפץ מסויים לדמות מסויימת). ההליך מוריד את המחרוזת :item מרשימת החפצים :inventory, מספר פעמים השווה לפרמטר :count, ומחזיר ערך בוליאני true כדי לציין שהפעולה הצליחה. אם החפץ אינו נמצא ברשימת-החפצים מספיק פעמים - הרשימה לא תשתנה כלל, ההליך יציג הודעה מתאימה מעל ראשו של השחקן ("I dont have enough..."), ויחזיר ערך false. הליך זה משתמש בשני הליכי-עזר כלליים לטיפול ברשימות:
* itemCount :x :list - מחזיר את מספר הפעמים שהאיבר :x מופיע ברשימה :list
* itemRemove :x :count :list - מוציא עד :count מופעים של האיבר :x מהרשימה :list.
ג. buy :item :price - הליך שנקרא כאשר השחקן קונה חפץ מסויים (בדרך-כלל משתמשים בו בתוך שיחות עם סוחרים). ההליך קורא להליך drop (שהוסבר למעלה) כדי להוריד מרשימת החפצים של השחקן את הסכום המתאים - :price מופעים של המטבע הרשמי "shekel". אם הפעולה מצליחה (drop מחזירה true), אז ההליך מוסיף את העצם :item לרשימת החפצים של השחקן, בעזרת ההליך takeMany שנזכר למעלה.
ד. sell :item :price - הליך שנקרא כאשר השחקן מוכר חפץ מסויים (בדרך-כלל משתמשים בו בתוך שיחות עם סוחרים). אופן הפעולה דומה ל-buy.
ה. makeOil :olivecount :price :oilcount - הליך מיוחד, נקרא רק בשיחה עם בעל בית-הבד בעיר ענתות, שמייצר שמן מזיתים. הסיבה שצריך הליך מיוחד היא, שכדי ליצור שמן צריך שני דברים - גם חומר-גלם (olivecount זיתים), וגם כסף כדי לשלם לבעל בית-הבד (price שקלים); לכן, לפני תחילת הפעולה, ההליך בודק אם יש לשחקן מספיק זיתים וגם מספיק כסף, ורק אם אכן יש לו מספיק - ההליך ממשיך ומוסיף לרשימת החפצים שלו בקבוק אחד של שמן (oil).
start - התחלת המשחק (הליך זה נקרא כאשר השחקן לוחץ על כפתור "start").
show_move_help - הליך שנקרא כאשר השחקן לוחץ על "h" (קיצור של help). ההליך מציג עזרה שקשורה לתנועה - על איזה מקשים אפשר ללחוץ (העזרה מועתקת מתיבת-הטקסט שנקראת move_help, שנמצאת בעמוד ההתחלתי - "5 5").
inventory - הליך שנקרא כאשר השחקן לוחץ על "i"; מציג את רשימת החפצים שברשותו של השחקן (ע' בסעיף "ד. חפצים ומסחר" למעלה). הרשימה מוצגת ע"י ההליך -
ניתן להרחיב את המשחק ע"י הוספת עמודים חדשים. ראשית יש להחליט, איפה רוצים שהעמוד יהיה במפת המשחק. למשל, נניח שרוצים להוסיף עמוד שמייצג את העיר בית-שמש, 3 משבצות ממערב לירושלים. המקום המתאים במפה הוא טור 4, שורה 7. כדי ליצור עמוד זה, יש להריץ את הפעולה create_page 4 7. העמוד החדש יופיע, ובתוכו מלבן המייצג את הגודל הפעיל של המסך (האיזור שבו השחקן יכול להסתובב). לאחר מכן אפשר:
עץ הקריאות:
create_page :pagex :pagey - יצירת עמוד חדש. אם העמוד כבר קיים, תוצג הודעת שגיאה מתאימה, והעמוד הקיים יוצג על המסך.
קוד
כדי לקרוא את הקוד של המשחק, יש ללחוץ בעזרת הכפתור הימני על הקישור הזה ולבחור "Save Target As", ואז לפתוח את הקובץ בסביבת "microworlds".