From b1880964faad779a8f31656e63ebf10668517841 Mon Sep 17 00:00:00 2001 From: FishyClockwork Date: Fri, 28 Oct 2016 13:42:37 +0200 Subject: [PATCH 01/11] Added two new sub-blocks for Choice blocks Added two new sub-blocks for Choice blocks: Require and Exclude. The syntax for both is the same as Cost blocks. Require defines what item must be present in your inventory in order to show this choice/reply. Exclude defines what item must not be present in your inventory in order to show this choice/reply. If any Require/Exclude blocks are defined then this choice/reply will be hidden until all blocks of both types are satisfied. --- src/namedef.h | 2 ++ src/p_conversation.cpp | 65 ++++++++++++++++++++++++++++++++++++++---- src/p_conversation.h | 2 ++ src/p_usdf.cpp | 15 +++++++--- 4 files changed, 75 insertions(+), 9 deletions(-) diff --git a/src/namedef.h b/src/namedef.h index eab87c503b..8def090fa4 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -585,6 +585,8 @@ xx(Ifitem) xx(Choice) xx(Link) xx(Goodbye) +xx(Require) +xx(Exclude) // Special menus xx(Mainmenu) diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index f216d9d78a..0bc2b98a87 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -516,6 +516,8 @@ static void ParseReplies (FStrifeDialogueReply **replyptr, Response *responses) reply->ItemCheck[k].Item = dyn_cast(GetStrifeType(rsp->Item[k])); reply->ItemCheck[k].Amount = rsp->Count[k]; } + reply->ItemCheckRequire.Clear(); + reply->ItemCheckExclude.Clear(); // If the first item check has a positive amount required, then // add that to the reply string. Otherwise, use the reply as-is. @@ -656,6 +658,38 @@ CUSTOM_CVAR(Float, dlg_musicvolume, 1.0f, CVAR_ARCHIVE) else if (self > 1.f) self = 1.f; } +//============================================================================ +// +// ShouldSkipReply +// +// Determines whether this reply should be skipped or not. +// +//============================================================================ + +static bool ShouldSkipReply(FStrifeDialogueReply *reply, player_t *player) +{ + if (reply->Reply == nullptr) + return true; + + int i; + for (i = 0; i < (int)reply->ItemCheckRequire.Size(); ++i) + { + if (!CheckStrifeItem(player, reply->ItemCheckRequire[i].Item, reply->ItemCheckRequire[i].Amount)) + { + return true; + } + } + + for (i = 0; i < (int)reply->ItemCheckExclude.Size(); ++i) + { + if (CheckStrifeItem(player, reply->ItemCheckExclude[i].Item, reply->ItemCheckExclude[i].Amount)) + { + return true; + } + } + return false; +} + //============================================================================ // // The conversation menu @@ -673,6 +707,7 @@ class DConversationMenu : public DMenu bool mShowGold; FStrifeDialogueNode *mCurNode; int mYpos; + player_t *mPlayer; public: static int mSelection; @@ -683,9 +718,10 @@ public: // //============================================================================= - DConversationMenu(FStrifeDialogueNode *CurNode) + DConversationMenu(FStrifeDialogueNode *CurNode, player_t *player) { mCurNode = CurNode; + mPlayer = player; mDialogueLines = NULL; mShowGold = false; @@ -720,7 +756,7 @@ public: int i,j; for (reply = CurNode->Children, i = 1; reply != NULL; reply = reply->Next) { - if (reply->Reply == NULL) + if (ShouldSkipReply(reply, mPlayer)) { continue; } @@ -778,6 +814,13 @@ public: } ConversationMenuY = mYpos; //ConversationMenu.indent = 50; + + // Because replies can be selectively hidden mResponses.Size() won't be consistent. + // So make sure mSelection doesn't exceed mResponses.Size(). [FishyClockwork] + if (mSelection >= (int)mResponses.Size()) + { + mSelection = mResponses.Size() - 1; + } } //============================================================================= @@ -839,12 +882,24 @@ public: } else { - // Send dialogue and reply numbers across the wire. assert((unsigned)mCurNode->ThisNodeNum < StrifeDialogues.Size()); assert(StrifeDialogues[mCurNode->ThisNodeNum] == mCurNode); + + // This is needed because mSelection represents the replies currently being displayed which will + // not match up with what's supposed to be selected if there are any hidden/skipped replies. [FishyClockwork] + FStrifeDialogueReply *reply = mCurNode->Children; + int replynum = mSelection; + for (int i = 0; i <= mSelection && reply != nullptr; reply = reply->Next) + { + if (ShouldSkipReply(reply, mPlayer)) + replynum++; + else + i++; + } + // Send dialogue and reply numbers across the wire. Net_WriteByte(DEM_CONVREPLY); Net_WriteWord(mCurNode->ThisNodeNum); - Net_WriteByte(mSelection); + Net_WriteByte(replynum); } Close(); return true; @@ -1169,7 +1224,7 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang S_Sound (npc, CHAN_VOICE|CHAN_NOPAUSE, CurNode->SpeakerVoice, 1, ATTN_NORM); } - DConversationMenu *cmenu = new DConversationMenu(CurNode); + DConversationMenu *cmenu = new DConversationMenu(CurNode, pc->player); if (CurNode != PrevNode) diff --git a/src/p_conversation.h b/src/p_conversation.h index 5b068fb04b..bd674aa101 100644 --- a/src/p_conversation.h +++ b/src/p_conversation.h @@ -45,6 +45,8 @@ struct FStrifeDialogueReply int ActionSpecial; int Args[5]; TArray ItemCheck; + TArray ItemCheckRequire; + TArray ItemCheckExclude; char *Reply; char *QuickYes; int NextNode; // index into StrifeDialogues diff --git a/src/p_usdf.cpp b/src/p_usdf.cpp index dccec7c210..245240273a 100644 --- a/src/p_usdf.cpp +++ b/src/p_usdf.cpp @@ -76,11 +76,11 @@ class USDFParser : public UDMFParserBase //=========================================================================== // - // Parse a cost block + // Parse a cost/require/exclude block // //=========================================================================== - bool ParseCost(FStrifeDialogueReply *response) + bool ParseCostRequireExclude(FStrifeDialogueReply *response, FName type) { FStrifeDialogueItemCheck check; check.Item = NULL; @@ -101,7 +101,12 @@ class USDFParser : public UDMFParserBase } } - response->ItemCheck.Push(check); + switch (type) + { + case NAME_Cost: response->ItemCheck.Push(check); break; + case NAME_Require: response->ItemCheckRequire.Push(check); break; + case NAME_Exclude: response->ItemCheckExclude.Push(check); break; + } return true; } @@ -206,7 +211,9 @@ class USDFParser : public UDMFParserBase switch(key) { case NAME_Cost: - ParseCost(reply); + case NAME_Require: + case NAME_Exclude: + ParseCostRequireExclude(reply, key); break; default: From f1a80770e1f18af2b3d55700d0edbfdd89f7edf5 Mon Sep 17 00:00:00 2001 From: FishyClockwork Date: Fri, 28 Oct 2016 13:43:46 +0200 Subject: [PATCH 02/11] Updated the USDF specs Updated the USDF specs about 'require' and 'exclude'. --- specs/usdf.txt | 20 ++++++++++++++++++++ specs/usdf_zdoom.txt | 10 ++++++++++ 2 files changed, 30 insertions(+) diff --git a/specs/usdf.txt b/specs/usdf.txt index 093c9e7d74..2c65f25d06 100644 --- a/specs/usdf.txt +++ b/specs/usdf.txt @@ -122,6 +122,26 @@ conversation // Starts a dialog. amount = ; // Minimum amount of the item needed. } + // The amount of an item needed for this option to become available. + // You can have as many as needed. All require blocks must be satisfied + // to show this option. + require + { + item = ; // Item that is required to show this option. + amount = ; // Minimum amount of the item needed. + } + + // The undesired amount of an item. This option will become available + // if you have less than the specified amount. You can have as many + // as needed. All exclude blocks must be satisfied to show this option. + // Note: if both require and exclude are defined then all require + // and all exclude blocks must be satisfied to show this option. + exclude + { + item = ; // Item that is unwanted to show this option. + amount = ; // Unwanted minimum amount of the item. + } + displaycost = ; // Whether the cost should be // displayed with the option. // If no cost is specified this should diff --git a/specs/usdf_zdoom.txt b/specs/usdf_zdoom.txt index c106cdd1af..8a324c0882 100644 --- a/specs/usdf_zdoom.txt +++ b/specs/usdf_zdoom.txt @@ -50,6 +50,16 @@ conversation item = ; } + require + { + item = ; + } + + exclude + { + item = ; + } + giveitem = ; } } From c341bc0d3c127cc0a03c2130b1c2ab2e01071a07 Mon Sep 17 00:00:00 2001 From: FishyClockwork Date: Sat, 29 Oct 2016 15:52:29 +0200 Subject: [PATCH 03/11] Added restriction of Require/Exclude to ZSDF Added restriction of Require/Exclude to ZSDF (namespace = "ZDoom";). A warning will be printed if a Require/Exclude block is detected in USDF (namespace = "Strife";). --- src/p_usdf.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/p_usdf.cpp b/src/p_usdf.cpp index 245240273a..e8ce5ca500 100644 --- a/src/p_usdf.cpp +++ b/src/p_usdf.cpp @@ -210,9 +210,17 @@ class USDFParser : public UDMFParserBase { switch(key) { - case NAME_Cost: case NAME_Require: case NAME_Exclude: + // Print a warning if the namespace is not ZDoom otherwise fall-through. [FishyClockwork] + if (namespace_bits != Zd) + { + sc.ScriptMessage("Detected \"%s\" block, ignoring. Require/Exclude are exclusive to namespace ZDoom.", key == NAME_Require ? "Require" : "Exclude"); + while (!sc.CheckToken('}')) sc.MustGetAnyToken(); // Skip this block + break; + } + + case NAME_Cost: ParseCostRequireExclude(reply, key); break; From f450a60f6630ff823c46b8ed151ec85f4ed5f7af Mon Sep 17 00:00:00 2001 From: FishyClockwork Date: Sat, 29 Oct 2016 15:54:45 +0200 Subject: [PATCH 04/11] Undone changes to usdf.txt, updated usdf_zdoom.txt Undone changes to usdf.txt, updated usdf_zdoom.txt --- specs/usdf.txt | 20 -------------------- specs/usdf_zdoom.txt | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/specs/usdf.txt b/specs/usdf.txt index 2c65f25d06..093c9e7d74 100644 --- a/specs/usdf.txt +++ b/specs/usdf.txt @@ -122,26 +122,6 @@ conversation // Starts a dialog. amount = ; // Minimum amount of the item needed. } - // The amount of an item needed for this option to become available. - // You can have as many as needed. All require blocks must be satisfied - // to show this option. - require - { - item = ; // Item that is required to show this option. - amount = ; // Minimum amount of the item needed. - } - - // The undesired amount of an item. This option will become available - // if you have less than the specified amount. You can have as many - // as needed. All exclude blocks must be satisfied to show this option. - // Note: if both require and exclude are defined then all require - // and all exclude blocks must be satisfied to show this option. - exclude - { - item = ; // Item that is unwanted to show this option. - amount = ; // Unwanted minimum amount of the item. - } - displaycost = ; // Whether the cost should be // displayed with the option. // If no cost is specified this should diff --git a/specs/usdf_zdoom.txt b/specs/usdf_zdoom.txt index 8a324c0882..588ae6cda1 100644 --- a/specs/usdf_zdoom.txt +++ b/specs/usdf_zdoom.txt @@ -50,14 +50,24 @@ conversation item = ; } + // The amount of an item needed for this option to become available. + // You can have as many as needed. All require blocks must be satisfied + // to show this option. require { - item = ; + item = ; // Item that is required to show this option. + amount = ; // Minimum amount of the item needed. } + // The undesired amount of an item. This option will become available + // if you have less than the specified amount. You can have as many + // as needed. All exclude blocks must be satisfied to show this option. + // Note: if both require and exclude are defined then all require + // and all exclude blocks must be satisfied to show this option. exclude { - item = ; + item = ; // Item that is unwanted to show this option. + amount = ; // Unwanted minimum amount of the item. } giveitem = ; From 42be7bee935b7509a5979a77f91b6b8983a9284e Mon Sep 17 00:00:00 2001 From: FishyClockwork Date: Sat, 29 Oct 2016 17:05:59 +0200 Subject: [PATCH 05/11] For USDF treat Require/Exclude as unknown For USDF treat Require/Exclude as an unknown keyword. --- src/p_usdf.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/p_usdf.cpp b/src/p_usdf.cpp index e8ce5ca500..a64dc932fe 100644 --- a/src/p_usdf.cpp +++ b/src/p_usdf.cpp @@ -210,19 +210,16 @@ class USDFParser : public UDMFParserBase { switch(key) { + case NAME_Cost: case NAME_Require: case NAME_Exclude: - // Print a warning if the namespace is not ZDoom otherwise fall-through. [FishyClockwork] - if (namespace_bits != Zd) + // Require and Exclude are exclusive to namespace ZDoom. [FishyClockwork] + if (key == NAME_Cost || namespace_bits == Zd) { - sc.ScriptMessage("Detected \"%s\" block, ignoring. Require/Exclude are exclusive to namespace ZDoom.", key == NAME_Require ? "Require" : "Exclude"); - while (!sc.CheckToken('}')) sc.MustGetAnyToken(); // Skip this block + ParseCostRequireExclude(reply, key); break; } - - case NAME_Cost: - ParseCostRequireExclude(reply, key); - break; + // Intentional fall-through default: sc.UnGet(); From 4a56d426c3aedc4dc0593923f3880adcbf98f1f5 Mon Sep 17 00:00:00 2001 From: FishyClockwork Date: Sat, 29 Oct 2016 17:33:34 +0200 Subject: [PATCH 06/11] Actually put the new info in the proper section Actually put the new info in the proper section in usdf_zdoom.txt --- specs/usdf_zdoom.txt | 46 +++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/specs/usdf_zdoom.txt b/specs/usdf_zdoom.txt index 588ae6cda1..8fe1bd7589 100644 --- a/specs/usdf_zdoom.txt +++ b/specs/usdf_zdoom.txt @@ -50,26 +50,6 @@ conversation item = ; } - // The amount of an item needed for this option to become available. - // You can have as many as needed. All require blocks must be satisfied - // to show this option. - require - { - item = ; // Item that is required to show this option. - amount = ; // Minimum amount of the item needed. - } - - // The undesired amount of an item. This option will become available - // if you have less than the specified amount. You can have as many - // as needed. All exclude blocks must be satisfied to show this option. - // Note: if both require and exclude are defined then all require - // and all exclude blocks must be satisfied to show this option. - exclude - { - item = ; // Item that is unwanted to show this option. - amount = ; // Unwanted minimum amount of the item. - } - giveitem = ; } } @@ -106,6 +86,32 @@ conversation // Starts a dialog. // the standard conversation ID ('actor' property) is used instead // for this purpose but since 'ZDoom' namespace requires the actor // to be a class name it needs a separate field for this. + + page + { + choice + { + // The amount of an item needed for this option to become available. + // You can have as many as needed. All require blocks must be satisfied + // to show this option. + require + { + item = ; // Item that is required to show this option. + amount = ; // Minimum amount of the item needed. + } + + // The undesired amount of an item. This option will become available + // if you have less than the specified amount. You can have as many + // as needed. All exclude blocks must be satisfied to show this option. + // Note: if both require and exclude are defined then all require + // and all exclude blocks must be satisfied to show this option. + exclude + { + item = ; // Item that is unwanted to show this option. + amount = ; // Unwanted minimum amount of the item. + } + } + } } =============================================================================== From 8f2e9be70c30ddd3a5c4e70bd843b27afad15f16 Mon Sep 17 00:00:00 2001 From: FishyClockwork Date: Sat, 29 Oct 2016 17:43:20 +0200 Subject: [PATCH 07/11] Changed a description in usdf_zdoom.txt Changed a description in usdf_zdoom.txt to be more truthful. It's not just one new field anymore. (I really should learn to read these things before changing them.) --- specs/usdf_zdoom.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/specs/usdf_zdoom.txt b/specs/usdf_zdoom.txt index 8fe1bd7589..2b2e6f6da5 100644 --- a/specs/usdf_zdoom.txt +++ b/specs/usdf_zdoom.txt @@ -76,8 +76,8 @@ namespace = "ZDoom"; III.A : Conversations --------------------- -This block only lists the newly added fields. Currently ZDoom only adds one -field to the specification: +This block only lists the newly added fields. Currently ZDoom only adds a few +fields to the specification: conversation // Starts a dialog. { From 1502eae2ac47c85b0e2c95b8aad60e6de435c449 Mon Sep 17 00:00:00 2001 From: Kyle Evans Date: Sat, 29 Oct 2016 21:08:11 -0500 Subject: [PATCH 08/11] Add XPM (X PixMap) version of ZDoom icon --- src/posix/zdoom.xpm | 83 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/posix/zdoom.xpm diff --git a/src/posix/zdoom.xpm b/src/posix/zdoom.xpm new file mode 100644 index 0000000000..eae49eb77f --- /dev/null +++ b/src/posix/zdoom.xpm @@ -0,0 +1,83 @@ +/* XPM */ +static char * zdoom_xpm[] = { +"48 48 32 1", +" c None", +". c #ADA990", +"+ c #999966", +"@ c #666666", +"# c #393939", +"$ c #555555", +"% c #996666", +"& c #777777", +"* c #5F5F5F", +"= c #333333", +"- c #4D4D4D", +"; c #868686", +"> c #969696", +", c #1C1C1C", +"' c #339933", +") c #336633", +"! c #66CC66", +"~ c #66FF66", +"{ c #66CC33", +"] c #222222", +"^ c #333300", +"/ c #292929", +"( c #040404", +"_ c #0C0C0C", +": c #663333", +"< c #996633", +"[ c #CC9966", +"} c #CC6633", +"| c #CC9999", +"1 c #FFCC99", +"2 c #FF9966", +"3 c #FFCCCC", +" ... ", +" ++@##$+ ", +" +...+%&+ ", +" %*=-*&;$=&* ", +" %**=$@;>@=&*% ", +" &**@$*@@$-.+& ", +" %$%@*..$@.. ", +" ,#@+++@@#& ", +" $,#$$@@$#=$'' ", +" )!!!~!{=],,,,]^)'!{') =/, ", +" )){'~!!'')=],=))'{)'')) /=],( ", +" )'!!'!)~'{'),)''''''')) @@/==](( ", +" ^)''')'{{''')'''''),))) $$@$/,( ", +" ,^))),))''''))'')^,__/$$$-#-(( ", +" :<[}<,_)))))))),___,]#@@-/]] ", +" :<|12<:_,,,,,_,#$$-#/,^^=^}}< ", +" :<[1}::,^,,__,#$-==/,,::^:<<< ", +" ::&+@#^,,__/)#-=/,,,,-::^<::= ", +" :*+12[:==_,$-=/,,,,/,#::::=^ ", +" #*}331}-$]-==/,,,,// ##:=^ ", +" /]<13[---],,,,,,,]_] ", +" ,:--/,___]]]]:^___/ ", +" _______,^^,^,__/# ", +" ______:::::/$,,/# ", +" ____^:::=,^^^^,^^ ", +" __,,:=^,,)))^,,= ", +" _,,),,,,,^)^^^,, ", +" ,^,,),__,^))),,^ ", +" ,,,^^,,,,,)))),, ", +" ,,,,,,,)^))))^ ", +" ,,^,,,^^)))))^ ", +" ,^^,,,,)))))), ", +" ,^,,,,))^))), ", +" ],,,,,$&&&*$# ", +" ],,,]#****$# ", +" ]]]]]^####, ", +" ]]]]*,,,,#* ", +" ,_,#@&&@*/ ", +" __$####=# ", +" ,_/$$$$$# ", +" ,,,$*$$$ ", +" ],,,$**$# ", +" ],,,@&&@# ", +" ],,,$**#= ", +" ,,=+++%$ ", +" *%%%*$ ", +" /$*$#/ ", +" ],,]] "}; From 7c1f7aa81cb152e25f672ccb1d4bb109b65729b2 Mon Sep 17 00:00:00 2001 From: FishyClockwork Date: Sun, 30 Oct 2016 20:27:07 +0100 Subject: [PATCH 09/11] Restricted custom goodbyes to ZSDF --- src/p_usdf.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/p_usdf.cpp b/src/p_usdf.cpp index a64dc932fe..d40c542a14 100644 --- a/src/p_usdf.cpp +++ b/src/p_usdf.cpp @@ -345,7 +345,11 @@ class USDFParser : public UDMFParserBase break; case NAME_Goodbye: - Goodbye = CheckString(key); + // Custom goodbyes are exclusive to namespace ZDoom. [FishyClockwork] + if (namespace_bits == Zd) + { + Goodbye = CheckString(key); + } break; } } From 4fc5d527c6951584dad900cbf14194193c9e53f4 Mon Sep 17 00:00:00 2001 From: FishyClockwork Date: Sun, 30 Oct 2016 20:30:32 +0100 Subject: [PATCH 10/11] Moved 'goodbye' from usdf.txt to usdf_zdoom.txt I have undone all my changes to usdf.txt. It should look like how it did before commit 0df6ba6 --- specs/usdf.txt | 18 ++++++++---------- specs/usdf_zdoom.txt | 3 +++ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/specs/usdf.txt b/specs/usdf.txt index 093c9e7d74..4d1d01c1b3 100644 --- a/specs/usdf.txt +++ b/specs/usdf.txt @@ -87,16 +87,14 @@ conversation // Starts a dialog. page // Starts a new page. Pages are automatically numbered starting at 1. { - name = ; // Name that goes in the upper left hand corner - panel = ; // Name of lump to render as the background. - voice = ; // Narration sound lump. - dialog = ; // Dialog of the page. - goodbye = ; // Custom goodbye message. If omitted then the - // generic goodbyes will be displayed instead. - drop = ; // mobj for the object to drop if the actor is - // killed. - link = ; // Page to jump to if all ifitem conditions are - // satisified. + name = ; // Name that goes in the upper left hand corner + panel = ; // Name of lump to render as the background. + voice = ; // Narration sound lump. + dialog = ; // Dialog of the page. + drop = ; // mobj for the object to drop if the actor is + // killed. + link = ; // Page to jump to if all ifitem conditions are + // satisified. // jumps to the specified page if the player has the specified amount // or more of item in their inventory. This can be repeated as many diff --git a/specs/usdf_zdoom.txt b/specs/usdf_zdoom.txt index 2b2e6f6da5..f800b5ae79 100644 --- a/specs/usdf_zdoom.txt +++ b/specs/usdf_zdoom.txt @@ -89,6 +89,9 @@ conversation // Starts a dialog. page { + goodbye = ; // Custom goodbye message. If omitted then the + // generic goodbyes will be displayed instead. + choice { // The amount of an item needed for this option to become available. From ede350ba3672c07907ebee319c015f7a365dbc7d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 30 Oct 2016 23:44:55 +0100 Subject: [PATCH 11/11] - there seem to be some problems with the line endings... --- specs/usdf.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/specs/usdf.txt b/specs/usdf.txt index 4d1d01c1b3..1367ccfbf9 100644 --- a/specs/usdf.txt +++ b/specs/usdf.txt @@ -87,13 +87,13 @@ conversation // Starts a dialog. page // Starts a new page. Pages are automatically numbered starting at 1. { - name = ; // Name that goes in the upper left hand corner - panel = ; // Name of lump to render as the background. - voice = ; // Narration sound lump. - dialog = ; // Dialog of the page. - drop = ; // mobj for the object to drop if the actor is - // killed. - link = ; // Page to jump to if all ifitem conditions are + name = ; // Name that goes in the upper left hand corner + panel = ; // Name of lump to render as the background. + voice = ; // Narration sound lump. + dialog = ; // Dialog of the page. + drop = ; // mobj for the object to drop if the actor is + // killed. + link = ; // Page to jump to if all ifitem conditions are // satisified. // jumps to the specified page if the player has the specified amount