M: i've been working on this; see what you can make of it, and if it's enough for you to finish up the part i haven't gotten to yet:
// // means comment, ignore the entirety of the rest of the line // OVERNOTE TO SELF: IF YOU'RE GOING TO RUN THIS THROUGH GPT FOR FORMALIZATION HELP, THAT MEANS: // DRIVING YOURSELF NUTS MAKING EVERYTHING 100% UNIFORM IS A USELESS FRUSTRATION // you get the concept in your head; if it's solid, GPT will be able to iron out the written wrinkles
// this whole thing is largely (initially) supposed to be an HTML pseudo-wrapper; that is, like markdown on wikis, it's supposed to be a quick clear way to indicate for a WHAQ specific content which is intended to be expanded to HTML according to what instructions are given; it's intended largely to allow easy creation/manipulation of pure TXT style stuff as is usually found in FAQs into a standardized setup; though maybe it's better to say that it's a little more potentially complex as a wrapper, because some labels are less intended for straight up search/replace reformatting, and more for non-linear processing-for-content-construction; but the final product is supposed to be linearly accessible, with any of the processed bits intended for supporting reference // honestly, while it might prove useful, part of this is just because i hate trying to use the </> keys while typing... // :: is a command separator; it linearly indicates an instruction, then the parameters/guidance/whatever; if the parameter is expected to be a keyword and actually is an expected keyword (two separate ideas, depending on user error), the next separator continues the pattern, either reading an expected keyword or just text as parameters - until the command sequence is finished, and the next entry becomes the initial instruction for another sequence; at the current time, all instructions take parameters, even if those parameters are moot or blank; in theory, comments could be made in blank situations, but it'd be advised against if just for clarity; if OCD or clarity calls for it, substitute an appropriate single word for the case, such as 'start' or even just 'blank' // keywords are subjective and flexible, particularly when used as parameters; for example, the term 'money' can be a keyword for 'form', but in any place calling for a parameter it is a valid entry, and should not cause any errors in interpretation // handlers should be as forgiving as possible unless collapse is imminent; for example, a non-keyword in a position requiring an instruction should be skipped, not kill everything; debug-handling would be nice, though
// inchoate, subject to modification or collapsing into another system; intended to indicate a kind of global constant, in this case what kind of prefix/suffix the game uses to indicate the common cash; needs expandability to handle situations with multiple cash type, like silver/gold/platinum or gold/resources // inchoate concept in response to multiple-cash-format issue: numerics attached to keywords indicate a subjectively defined array entry - allowing money1, money2, money3 to all represent money; if a keywords is used without a suffix, the handler assumes that the first entry is used - so in mono-cash systems, etc, money=money1=exactly what's needed ::form::money1::name::Gold ::form::money1::suffix::g
// items are any equipment; it's one of the few things so far that
hasn't suggested a need for a parameter or anything - inventories are
basic, I guess... // some keywords are containers - that is, everything
between the opening instruction and the second version with ::items:: //
table-like situations are defined by two internal instructions: 'fields'
defines the titles of the fields (and provide table headers), while
'entry' is a repeating instruction with a CSV defining the value for
each field; it can be accurately thought of at the moment as being
equivalent to 'th' and 'td' tags respectively; handlers should be able
to understand that a newline is not -required- at the end of an
instruction sequence - it's only there for legibility - but in general
whitespace formatting is shunned beyond using newlines
::fields::Item,Category,Effect ::entry::Heal Berry,Consumable,+200
HP::entry::Antidote,Consumable,cure
Poison::entry::Medicine,Consumable,cure Disease::entry::Violet
Rose,Consumable,cure Silence::entry::Heat Salve,Consumable,cure
Paralysis::entry::Long Knife,Equip-Weapon, ::items::end
// the primary walkthrough is defined by nested 'acts', the equivalent of a 'div' or 'p' tag; internal numbering for anchors is the current paradigm - anything beyond the word 'act' should be thought of not as an actual label, but only applicable in the code as a way of marking which 'act' instructions are paired with an 'act::end' instruction // 'act' uses whatever follows as the text intended for the section name, like an 'h1/2/etc' entry or other title heading formatting choice ::act1::I. The Festival // 'guide' is something like visible commentary, something a little bit less than the primary atom of a 'step' which someone would follow but still necessary; basically when the user might need to know something but it is more outside the narrative than involved with it ::guide::These first three chapters are a prologue that can be done in any order; this list is merely in order of first to last presented in-game. // i came back up to add this; it may be better to expand the syntax of 'guide' to allow situational placement/editing, but allowing some items to be labeled as being part of a high-level over-guidance section instead of limited to the location that generated it ::guide::The game manual can be found online, for example at archive.org; this WAQ assumes you know the interface or have access to the information in the manual. Item usage will be described when appropriate and not available in the manual (for example, the Heal Berry gives 200 HP when used, but neither the game or manual mentions this explicitly.)
// this is less than developed; i just realized a choice needed making; and since this is voluntary, it'll involve some methodology that i don't feel like handling right now ::selection::1a,1b,1c::
::act1a::A Wandering Youth // 'place' is a meta-container not necessarily associated with the transcription-to-readable-format; it is not necessary, and can span outside of the container in which it's initiated; it is intended to give a location for reference if someone is looking to backtrack or figure out where a particular step occurred // 'town' is a keyword for guiding 'place' - it does not necessarily correspond 1-to-1 with the idea of a town, but is simply what in a game could be called a locale: it could be a major city or a peaceful clearing; its primary defining/limiting factor (as opposed to, say, a 'dungeon') is that it is (at least initially) presented as a spot where the player interacts with NPC and won't have any fights; the definition is, honestly, potentially flexible - at the moment, it doesn't have enough attributes to be useful beyond labeling - but categorization helps with generating lists from the entire thing, at least // inchoate - maybe make it so that the instruction after 'place' is not a predefined keyword, but WHAQ defined categorization: so while one game has a soft definition of 'town/dungeon/etc', another would have 'arenas/routes/etc', where every category has the same base attributes and the distinction lies in how the game calls for it to be used; we're going to continue as though that's what will happen until we find out where it butts up against some usage problem // after the categorizing instruction, the following item in the sequence is the label attached to this 'place'; reminds me that the 'place' label probably should have its own internal labeling system, like with the 'acts', for internal handling and nest tracking ::place::overworld,Map // this was put in later, after the second step; the idea of being locked in requires a place to go when things are unlocked, at least in games with an overworld or hub // i may need to define a way for places to be defined later, with the assumption that the handler will shift it to the beginning and have it locked until it shows up in the linear progression ::place:🔒:town,Surf // most things that could be called a shop/vendor are not strictly necessary for production of a WHAQ, so the intent is to make it possible to format them to be off to the side and collapsed initially, opened only if the user wants to see them - hence the container methodology, separate from any actual steps // a use for the 'place' instruction, but not necessary for creation; a shop may be associated with a particular location, but one can be created in the walkthrough without requiring a location, with the assumption that in that case the location of the shop definition in the actually-required 'act' structure is sufficient to convey where the shop is located // the parameter after the instruction (I really to formally define a shorter term) is just the name of the shop; formatting should make it easily identifiable, whatever the presentation paradigm ::shop::Surf Village Shop // 'shop' is a container instruction that implements the 'items' methodology of being defined by 'fields' followed by 'entry' ::fields::Item,Cost ::entry::Heal Berry,20::entry::Antidote,50::entry::Medicine,50::entry::Violet Rose,50g::entry::Heat Salve,50g::entry::Long Knife,120g ::shop::end
// now we're getting to what's currently the most crucial and fluid part of the definition... // we're trying to strip all the color off of the original version; especially in a lot of the older FAQs, the creators were creative - or at least verbose - and it could almost turn into story telling, impressive when done well - and exactly what we're trying to avoid; we want uniformity, simplicity, even automate-ability if it gets there; everything should be boiled down to nothing but what's barely required to make sure the experience is as uniquely experienced as possible // compared to that, all the other stuff was easy-peasy; I likely could do the editing for that in my sleep, or at least just after I woke up
// the atomic bit of a walkthrough is going to be defined as a 'step' instruction; it will be followed by a sequence of keywords, or keyword/parameter pairs (comma separated), a sequence whose final entry is defined by when a keyword isn't there - so maybe we visualize it as '::step(::keyword|keyword,parameter...)::associated text' if we use a bastardized form of regex representation // the keywords for a 'step' should be structurally definitive - a 'step' might be though of as being an attempt to reverse engineer a madlib or something; the ideal language wouldn't even need the 'associated text' except for debugging - it would be able to build a formulated instruction from what was given by the keywords // there needs, i think, to be a layering substructure defined in the 'step' instruction, used like this - ::step(::[keyword sequence])::stepdown(::[keyword sequence])*::[lower text]::[primary text] // 'stepdown' is used when the primary text may, depending on the player and situation, not be as specific as is necessary - like in a puzzle situation; it follows the same structure and uses the same keywords for situational definition as 'step', but it is intended to be formatted to be hidden or otherwise indicated to be more information than some players might want, even if some might need it // as a pseudo-coded example, if there was a relatively simple puzzle, it might look like - ::step::[puzzle indicators]::stepdown::[any additional indicators]::Push the red button, then the blue button.::Use the command console.
// one key thing as we're developing the language is to be specific about what the player should get when from where and who; a lot of walkthroughs are tied to making sure you pick up everything, or at least know they're there, or hit ever chest or whatever // my initial impulse is to have a 'collect' keyword - implement in a way such as ::collect(::category)?(::location::[location specifics])?::[descriptor] // so an example would be - ::collect::coins::location::Above the entrance portal::500; or if specifics are unnecessary in a step, ::collect::chest::5 Potions // it may need reconstruction as we take a first run at things; at the moment, I think it needs to be able to create a handler-traceable category (for stuff like special chests) and and indicator of what it is, along with the ability to add a descriptor for the stuff that is just hanging around in the overworld or otherwise a bit more specific // 'collect' should be, at least at the moment, thought of as being a 'step' related keyword - although it may be expandable to other instructions; the point is that at this point, I see no situation in which a collectible can exist without being tied to a location, act, or step // when associated with a step as a reward, items should maybe become 'result' or 'reward'... working on that in terms of syntax...
// this is going to be comment-laden and ugly as we try to build a 'keyword' structure from what we run into and generalizing... // for this practice run, I'll be leaving some form of the content of the original FAQ, then trying to construct a new step from it depending on what's already established, expanding or refining as necessary; that means there might be a bit of ugliness or inconsistency, keep that in mind when re-reading or testing; if something is introduced, I'll explain what's going on as best I can
// side note - trophies; this is, I believe, a direct port - but it -does- have trophies; other games will as well - and WHAQs are supposed to handle those too, especially the ones that have ridiculously specific requirements // proposal - 'trophy' keyword, complete semantics TBD because the trigger/causality can vary from a specific act to a complete game completion to an ongoing count; initial descriptor is - ::trophy(::system::[what system(s)]::[what trophy value])?(::[keywords/parameters])*::[trophy name] // the mechanics will parallel what's developed for the 'collect' instruction - that is, it'll be able to attached to a parent instruction; the difference is that some of the more vague trophies might require an independent existence, such as a 'beat the game on Hard' trophy; a WAQ should not necessarily try to be canonical about trophies, though - only specific enough to deal with situation specific trophies, not body counts or playthrough counts
// i'm not sure how i want to handle cutscenes; they should be indicated, but aren't exactly a 'step' ::cutscene::The player character is tending horses. // --Your boss comes over to tell you it's quitting time, and he asks your name (Select any name you wish, but I will be using the default name Rudy). /You get a Heal Berry as payment for your work, and your boss tells you to go talk to the mayor. // first minor note: the guy actually stands still; this is a demonstrable example of how old FAQs sometimes went for prose over accuracy to tell a story; again, admirable but not what we're doing here // so I haven't formalized it mentally, but I think that most narrative sequences in games can be defined by a maximum of, like, three categorical adjectives; so i'll be trying to formalize that on the fly // note spawned from previous line: remember that in some games what is 'default' is itself contingent on what's going on in the game - like when an RPG pops up a battle screen and the controls change; this needs to be handled if the terminology indicates it's necessary to be clear // in this case, you can run around a fenced in area and do anything you want (tho with very few options) with complete game level control (as opposed to some games which will eliminate or filter various functions); in theory, if there were a way to kill yourself, you could do it before the game began; I mention this bit because I would call it as a descriptor adjective 'full', but I'm going to call 'game full' the default state of a situation - any subtraction (or maybe even addition) is a modification from this; only noting it in case it actually becomes necessary to use explicitly // so control ability might be one category; another might be 'area restriction' - right now it's complete freedom in a restricted area, but other times it might be limits/lock-offs in an otherwise complete map // we're going to initially look at things as being a narrative bottleneck; in a more broadly described sense, you could say the game world has a door that can only be opened by interacting, and/but the interaction moves the narrative forward, defining a new game section (in narrative terms, not the walkthrough's 'act' structure); that means that the step would need to indicate a game world state change, a narrative door, a conversation, and a direct item reward... oh, and a special case of 'renaming' which is up for semantic grabs - it happens often enough that it shouldn't open up the idea of a 'one-off' instruction, but rarely enough that refining it isn't possible with a sample size of one // another side note: 'narrative time' is importantly separate from 'walkthrough time' because they are affiliated but not qualitatively the same; it needs to be acknowledged and track because, for instance, a particular trigger may not change the way the player is shown the game, but could easily alter the NPC conversations available - indicating that track it is important; ...as I think about it, maybe the two could be mixed - but I -choose- not to because the 'act' structure is important no matter how you play the game, while the 'narrative time' is more connected to optional items; in terms of constructing the WHAQ, the acts are needed for formatting, while the narrative stuff can be tacked on // ::place::area::Stable // new bits of language - ::convo::[name/identifier] // ::reward::item[,item2,item3...] // instruction placement is important both for clarity and proper formatting; for example, the 'reward' is directly connected to finishing the conversation - if it had been given before the conversation, the 'convo' should have come after some form of indication that approaching/interacting with the character was the trigger, not the completion of the conversation; it's quibbling, but it's the kind of accuracy that will make the product look trustworthy and not glitchy // ...having said that, this -is- the first try and first pass - so be sure to review this if we ever finish // observation - a WAQ formatting handler could use any 'place' nesting with the 'convo' name to build a character list if/when a game needs it; that should be kept in mind for the other narrative containers, like 'act', particularly if uniqueness of identifiers become crucial - although maybe as an attribute instead of a label element depending on the circumstances // the 'reward' is not included explicitly in the description because the formatting should place this both separately from the actual guidance and optionally as a hidden item; future items will prompt reevaluation in details if not in nature, because we've still got key items and collectibles and other stuff whose display priority might be different to deal with... // building a language dictionary will be interesting, between the words that are keywords only in context, and the specificity required once a keyword has been identified, and the instructions which are kind of heterogenous in nature... whoof // ::place::area::Stable // ::step::convo::Employer::reward::Heal Berry::stepdown::Run around as much as you want - get to know the Menu and Pause Menu, fix the controllers and mapping, etc. - but in terms of the game, this is just a starting point.::Talk to the man by the barn door to register your name and proceed. (The default, 'Rudy', will be used to refer to this character through the WAQ.) // locations can be useful, but are often contextual and should be able to be locally defined // i can think of two paradigms off the top: screen based (north is up) and map based (north is fixed but the screen rotates), but more might pop up // coordinates come into play in modern games; older games need placement, and contextual indicators // i'm thinking that the place::area definition may be the baseline for a new assistant definition associated with 'place' definitions: 'placedef' // it would be attached to a place thusly - ::place(::placedef(::location::[syntax contextual and TBD])?(::[category])?::[name])(::[category])::[name] // this needs massaging; the nature of the 'step' instruction is such that finishing everything off with a variable text is okay, but this might need an endcap or the sub-places bleed into the final name/category combination; maybe something like ::([category],)*[name] for each place naming instance // the reason i'm thinking of this now is because the whole 'place' concept can be crucial for defining where stuff is, but difficult to apply // NPCs are a location specific special category... but maybe needs broadening as a concept... like, there's places you walk and stuff you walk to, and that would include NPCs... but NPCs sometimes wander, so maybe it is a subclass // thought - special place 'overworld' defined as being the highest hub/global map/whatever; it can be limited or segmented or otherwise split due to narrative location gating, but should not overlap; in theory it should be singular, though some games might break this, but from the WHAQ perspective it should be easily identified because we know all and know where the highest surface is that all the other locations live in // gonna rewrite the first stab at things... this might take a while to develop, huhn // i'm seeing a couple things; the handler needs to be able to able to understand that in terms of building a 'place tree' for any reason, that 'placedef' is contextually equivalent to any 'place' container; also, if an area is returned to, the handler/language needs to know that each structure must be unique in its full name - so in this case, there might be another town containing a Stable, but there can't be two Surf.Stable entries; and multiple references to the same location at different times should be understood to mean the same place (and time, for those games like Chrono Trigger where time becomes important) - labels should/must take this into account to be grammatically correct (although with the time stuff, it may be necessary to introduce parentheticals or a 3-tuple CSV to specify time periods when talking about the same place, instead of forcing parenthesis in a way that reduces user clarity) // not every tile needs to be incorporated or specified or located - just the areas that need guiding to; like an RPG like this doesn't need to clearly indicate every house, but in one where talking to everybody is required for a trophy it may become necessary to do so // locations should be able to handle appropriate keywords like 'wandering' or 'random' or 'limited random'; meaning that some NPCs might follow a route, or be found in a particular area but unpredictable, or randomly at one of five places, et cetera... the language doesn't need to be explicit about that right now - just aware it's coming and ready to handle it ::place::placedef::location::NE::npc,Employer::area,Stable ::step::convo::Employer::reward::Heal Berry::stepdown::Run around as much as you want - get to know the Menu and Pause Menu, fix the controllers and mapping, etc. - but in terms of the game, this is just a starting point.::Talk to the man by the barn door to register your name and proceed. (The default, 'Rudy', will be used to refer to this character through the WAQ.) ::place::exit // compass location is working fine in this instance, but there needs to be gradation or relative placement possible... like, in this case, 'east of the Stable' or '1/4 of the distance from the west of town, halfway from the north', or more easily interpreted but less user friendly, '.25W.5N'; this might be something to be incorporated later, once more examples are available to filter into a usable pattern // at the moment, 'convo' should only refer to an essential/trigger conversation // let's move on to the second step; at this point, the player has expanded from Stable to Surf... the default will be that leaving an area doesn't mean inaccessibility of the old place, but it should be indicated when exiting does close an area - i'm thinking the syntax should be - place::lockdown::exit - and if it's temporary, reopening can either be implicit by it being referenced in the WHAQ or explicitly with the instruction 'reopen'
// --Before you do that, explore town and talk with the people here. / Inspect barrels and throw small crates to find three Heal Berries, a Power Apple, Hardy Apple, and 28g. / Also take some time to check out the shop so you can buy some handy healing items. / Then head over to the mayor's house in the center of town, go upstairs, and talk to him. He'll reward you for a job well done with the Bombs tool. // we're going to say that the 'item' keyword (singular, not plural) is, at the moment at least, a placeholder keyword - it implies that this information would be moved into the actual 'items' list by the editor or handler, but for the moment that would be a derailing hassle; if it works smoothly, it may become officially part of the language, but for now it's a hack; its CSV format is parallel to the official 'items' structure ::item::Power Apple,Consumable,+1 Strength::item::Hardy Apple,Consumable,+1 Vitality // okay, i'm going to use 'placedef' independently here; a fully grammatically correct WHAQ might not use this grammar, but since i'm rewriting on the fly we'll allow it; maybe it would be better to allow this in the formal definition, with the understanding that if 'placedef' doesn't occur in a sequence beginning with 'place', it is referring to the furthest branch of the 'place' tree that it currently occupies; so in this instance it refers to Surf // i'd have to replay the game to correctly locate and associate each item with its container, which i'm not currently willing to do - so we'll be using a vague definition; but it should be acknowledged that if that information were explicitly given by the original FAQ, i'd be incorporating it somehow ::placedef::item,Heal Berry ::placedef::item,Heal Berry ::placedef::item,Heal Berry ::placedef::item,Power Apple ::placedef::item,Hardy Apple ::placedef::money,28 // as a note to self, one possibility for the final format of the WHAQ would be, instead of having a sub-entry for each step below its parent, instead make it so that if you click the step, the more explicit version -replaces- the original version // ideally, the final formal language would have a way to avoid being explicit in the step; that's for later, though, or for GPT to figure out // the item collection can happen up until the point that you leave the town; indicating this will be fun to figure out // i've been told that this game particularly has lots of script shifts and situations gated by narrative timing; not now, but once this walkthough has been handled, it might behoove the development process to look at the specific FAQs to see if the timing could be incorporated for the purpose of development/refinement/stress testing ::placedef::location::E::area,Mayor's House ::placedef::location::Mayor's House::level,2nd Floor ::placedef::location::Mayor's House.2nd Floor::npc,Mayor // currently understood that a 'Tool' is infinitely reusable; might need to get explicit at some point // i'm getting to the point where i'm understanding my syntax a bit more than i might record ::item::Bomb,Tool,Explosions ::step::convo::Mayor::reward::Tool.Bomb::result::Surf.unlock::stepdown::stepdown::You can break crates and search barrels to find 3 Heal Berrys, 1 Power Apple, 1 Hardy Apple, and 28g, up until the point you leave town; you also can visit the Shop for healing items. The next step in the story comes when you talk to the Mayor; he'll give you the Bomb tool.::Explore around town if you want to find some useful items; otherwise, talk to the Mayor in a house east of the stables.::Talk to the Mayor in a house to the East. // i'd like to find a usable terminology for the instruction that doesn't give too much away that indicates when i mean that something is imperative, or when it's like this case where the narrative requires the conversation but it's not as crucial to get it done as the current phrasing might imply. // this is where the whole idea of 'place' important starts getting fleshed out; the interaction is in a definite place, right, and the interaction opens the gate to the outside world... so that needs to be indicated somehow; but in terms of the WAQ to trace the player location, the limitation is different than the Employer interaction, the movement limitations aren't involved, so no explicit placement is required for the player themselves // i've inserted a new keyword, 'result'; rewards are what a player gets, results are the indirect stuff; i was going to say the previous conversation needed modification, but reflection says it doesn't - the Employer stands in the way of the exit, so the lock status of the Stable is moot; this method might allow narrative timing unlocks, we'll see // i think a fully developed language might allow non-linear additions of thing that maybe aren't ever directly referenced; i'm thinking of optional/side quests or easter eggs, where a conversation could be recorded at the end of the WHAQ but still be incorporated by the handler
// --Now, walk over to the stairs and someone comes barging in with news that a child has gone into the Berry Cave, which is full of monsters. / Knowing the right thing to do, exit the village, head south on the world map, and enter the Berry Cave. // okay, so this was location based - you try and leave, and instead it goes into a cutscene; we haven't handled cutscenes yet // if a cutscene changes venues or locks access, it should be possible to indicate using the established terminology; if it doesn't, it shouldn't be a concern, even if there is a localized shift, like going out of a house - unless the door locks behind you or something similar; point is, if you can easily return it shouldn't be necessary to trace the location (though later versions might allow for that) ::step::move::stairs::result::cutscene::A villager reports to the Mayor that a child has gone to Berry Cave::stepdown::When you try to go downstairs, a villager will report that a child has gone to the Berry Cave to the south::Go down the stairs to start a cutscene.
// this is where a trophy can happen in the PS5 version; you have to bomb the parrot; even in the original it still would have been funny to know attacking the parrot cause it to sic the chickens on you, so it's not meaningless; i'll worry about the syntax later, but it needs a placeholder :🏆:optional::ps5::Bomb the parrot. // i have a feeling that part of this development process will be getting GPT to pull together some enumerated sets and subsets // this is likely where at least one NPC conversation changes // i backtracked to add this - it gets explained later ::placedef::location::S::door,Leave ::step::move::Leave::Leave Surf. // now we exit and everything is wonderful ::place::exit
::place::location::Surf->S::dungeon,Berry Cave // this has me address a larger issue - most dungeons have separate rooms, so that's a given and the placement will have to be indicated in some way, but some town houses and areas also have that and should be addressed; it's why i used the term 'area' for the Mayor's House, because it's a softer definition instead of a hard shift of where the systems thinks we are // exits to each area need placement and linkage // so each room is a subject of Berry Cave and must be entered/exited; however, if there is backtracking it will be assumed that intermediate rooms will not need explicit specification and we just assume that the player will understand that as long as the step is explicit enough // i'm capitalizing the place names out of habit - it's choice, not requirement // 'door' is a variable category; it indicates anywhere that there's an actual shifting of place; its name is explicitly the place it will take the player to, with 'Leave' explicitly meaning an exit from the dungeon // --First pass through the entranceway of the cave past the guard. ::place::placedef::location::S::door,Leave::placedef::location::N::door,Room2::placedef::npc,Guard::room,Entrance ::step::move::Room2::stepdown::Go north, past the guard.::Go through the entrance. // --Head up a little ways and use your bombs to blow up the big crate to the right of the sign to get a Heal Berry. / Head up the path left of the sign and follow it around and through the next passageway. // the first time there's a definite chest/item relationship... i'm not sure what to do with that; sorry if the syntax is weird, i'm tired and winging it ::place::placedef::location::s::door,Entrance::placedef Hit the switch on the right to make the statue move out of the way and continue down the path past the bunch of small crates. Pick up the 50g in the chest to the left and continue down the path. Go right and get the 50g in the next chest along the path. Follow the path up and blow up the small sign that's blocking your way. Keep heading up and destroy the big crate at the end of the path. Then hit the switch to the southwest to move the statue blocking the path. Continue through the next cavern. From here, go southeast down this path (don't dash, because you might get into a random battle with bats which curse you). Continue all the way down and get the Heal Berry at the left end of the path and the Holy Symbol near the sign. Keep going southeast and then north. Follow this path to a bunch of crates and blow them up to get a Heal Berry. Go down the stairs and head north to find a pile of rocks blocking a cave. Blow them up and head inside to find a Hardy Apple, Power Apple, and Agile Apple. Then exit this room the way you came in and head back south. Destroy the crate along the path to get another Heal Berry and continue south to two switches. Hit the left one first and then the right to move the two statues out of your way. Follow the path down to the next area. Pick up the Bullet Clip along the path and go down to the crest on the floor. This is a save point, so use it as needed. When you're done here head left and up the narrow path to find Tony, the child who came in here. He says that he came here to retrieve some berries to help his sick father, but some rocks are blocking his path. Dispose of them with your bombs and head inside. Go north and pick up the Bandanna in the chest to the right and continue north to get the berries Tony needs. You'll then leave the cave with Tony, but the earth will start to shake. When you meet with the townspeople near the cave's entrance, an awakened monster will come out. It's time for a battle.
Boss fight: ZOMBIE
HP: 800 Exp- 100 Gella- 200 Recommended level- 2
This guy isn't that tough. The attack it uses most often is Rotten Breath, which can hit you for a good amount of damage. Just be sure to watch how much damage it's doing to you so you'll know when to heal yourself. Attack it normally until you build up enough force to use ARM Lock On with Hand Cannon. Hand Cannon should do well over 100 damage every time so you should be able to take the Zombie down quickly. After the battle the people will be shocked to see that you wield the forbidden Arm. They decide to bring you back to the village to pass judgment on you. Once you get back to the village and regain control, go downstairs to hear that the people have decided to exile you. They believe that you're the one who has caused all the recent problems that have unfolded, and they don't want you around causing anymore trouble for them. So the mayor kindly asks you to leave and never return. Now, leave the mayor's house and try to leave the village. Tony will come over to thank you for what you've done for him, and then he'll run off. Then exit Surf Village and pick a new mission. ::act1a::end
G: [Non-text content: thoughts; content_type=thoughts]
G: [Non-text content: reasoning_recap; content_type=reasoning_recap]
G: What you’ve got is enough to finish the chunk you stopped at, as long as we accept (for now) that:
::step:: is the universal “atom,” and we tolerate new
keywords inside it (switch, bomb,
chest, save, boss, etc.) without
pretending the keyword set is final.placedef can act as “location focus” without always
being nested under a full ::place::... opener, and the
handler treats it as “current deepest place branch.”::collect::... (preferred) or as the earlier
placedef::item/... spam (fallback).Below is a straight conversion of everything from “Hit the switch…” through the boss + exile sequence, keeping your style and adding only the minimum structure to make it parseable.
// ------------------------------------------------------------
// Berry Cave continuation (from "Hit the switch..." onward)
// Assumes we're already inside: ::place::location::Surf->S::dungeon,Berry Cave
// and currently at/near Room2 context.
// ------------------------------------------------------------
// define items as we meet them (hacky ::item:: is OK for now)
::item::Holy Symbol,Accessory,?? (effect TBD)
::item::Agile Apple,Consumable,+1 Agility
::item::Bullet Clip,Key/Ammo,Ammo for ARM (details TBD)
::item::Bandanna,Accessory,?? (effect TBD)
::item::Berries (Tony),Key Item,Quest item
// ---------- Room2-ish: switches/statues/crates ----------
::place::placedef::room,Room2
::step::switch::right::result::statue.move::stepdown::Use the right-side switch to move the statue and open the path.::Hit the right switch to move the statue out of the way.
::step::chest::money,50::stepdown::Open the chest on the left for 50g.::Get the 50g from the left chest.
::step::chest::money,50::stepdown::Go right to the next chest for 50g.::Get the next 50g chest along the path.
::step::bomb::sign::result::path.open::stepdown::Blow up the small sign blocking the way.::Blow up the sign to continue.
::step::bomb::big_crate::result::path.clear::stepdown::Destroy the big crate at the end of the path.::Blow up the big crate to clear the end of the path.
::step::switch::southwest::result::statue.move::stepdown::Hit the southwest switch to move the statue blocking the path.::Hit the southwest switch to open the route.
::step::move::Next Cavern::Go through to the next cavern.
// ---------- Cavern: warning about bats curse ----------
::place::placedef::room,Next Cavern
::step::move::southeast_path::stepdown::Go southeast here. Avoid dashing to reduce random battles with bats that can curse you.::Take the southeast path (don’t dash).
::step::chest::item,Heal Berry::location::left_end::Get the Heal Berry at the left end of the path.
::step::collect::item,Holy Symbol::location::near_sign::Get the Holy Symbol near the sign.
::step::move::southeast_then_north::Keep going southeast, then north.
// ---------- Crates -> Heal Berry ----------
::step::bomb::crate_cluster::reward::item,Heal Berry::stepdown::Blow up the crates to reveal a Heal Berry.::Blow up the crates to get a Heal Berry.
// ---------- Stairs down -> rocks block a cave ----------
::step::move::stairs_down::Go down the stairs.
::step::move::north::Head north to the rocks blocking a cave.
::step::bomb::rocks::result::cave.open::Blow up the rocks to open the cave.
// ---------- Side room: apples ----------
::place::placedef::room,Side Cave
::step::collect::item,Hardy Apple::Get the Hardy Apple.
::step::collect::item,Power Apple::Get the Power Apple.
::step::collect::item,Agile Apple::Get the Agile Apple.
::step::move::exit::Leave this room the way you came in.
// ---------- Backtrack south: more crates/switch puzzle ----------
::place::placedef::room,Return Path
::step::bomb::crate_along_path::reward::item,Heal Berry::Destroy the crate to get a Heal Berry.
::step::move::south_to_two_switches::Go south to the two switches.
::step::switch::left::switch::right::result::statues.move(2)::stepdown::Hit left first, then right, to move both statues.::Hit left switch, then right switch.
::step::move::Next Area::Follow the opened path down to the next area.
// ---------- Save crest + Bullet Clip ----------
::place::placedef::room,Lower Area
::step::collect::item,Bullet Clip::location::along_path::Pick up the Bullet Clip along the path.
::step::save::crest::stepdown::The crest on the floor is a save point; use it if you want.::Use the save crest if needed.
// ---------- Tony ----------
::place::placedef::location::left_then_up_narrow_path::npc,Tony
::step::convo::Tony::result::quest(Tony Berries)::stepdown::Tony says he came for berries for his sick father, but rocks block his way.::Talk to Tony up the narrow path.
::step::bomb::rocks::result::path.open::Clear the rocks with Bombs and go inside.
// ---------- North room: Bandanna + quest berries ----------
::place::placedef::room,Tony Route
::step::chest::item,Bandanna::location::right::Get the Bandanna from the chest on the right.
::step::collect::item,Berries (Tony)::result::auto_exit_with_Tony::Get the berries Tony needs; you’ll leave the cave with Tony.
// ---------- Earthquake + confrontation ----------
::cutscene::The earth starts to shake as you leave with Tony.
::place::placedef::room,Entrance (outside/near cave)
::cutscene::You meet the townspeople near the cave entrance; an awakened monster emerges.
// ---------- Boss fight: Zombie ----------
::boss::ZOMBIE::hp,800::exp,100::money,200::recommended_level,2
::step::boss::ZOMBIE::stepdown::Watch for Rotten Breath damage; heal when needed. Build force, then use ARM Lock On with Hand Cannon for big hits.::Defeat the Zombie.
// ---------- After boss: judgment/exile sequence ----------
::cutscene::People react to you wielding the forbidden ARM and bring you back to Surf Village to pass judgment.
::place::placedef::town,Surf
::place::placedef::area,Mayor's House::placedef::level,1st Floor
::step::convo::Villagers/Judgment::result::exile_declared::stepdown::After you regain control, go downstairs to hear the decision: you’re exiled; they blame you for recent events.::Go downstairs and hear the exile decision.
::place::placedef::town,Surf
::step::move::Leave Mayor's House::Leave the Mayor’s House.
::step::move::attempt_exit_town::result::convo(Tony thanks you)::Try to leave Surf Village; Tony will approach and thank you, then run off.
::step::move::Leave Surf Village::Exit Surf Village and choose a new mission.
// ------------------------------------------------------------
日本語(にほんご): 村(むら) を 出(で)る — Leave the
village.
日本語(にほんご): 爆弾(ばくだん) で 岩(いわ) を 壊(こわ)す —
Blow up the rocks with bombs.
You could collapse all “pickup spam” into a single
::step::scavenge::... that emits a structured side-list
(items/money) with a validity window (until::leave_town),
instead of attaching each pickup to micro-locations.
M: neat. what do you think of the language so far in terms of what's working and what need work
G: TL;DR
The language is fundamentally sound. The hard part—finding the
right atoms and separating what happens from
how it’s shown—is already working. What needs work is
mostly boundary discipline: where keywords stop being
descriptive and start being ontological, and where you’re overloading
one construct to do three jobs. Nothing here needs to be scrapped; it
needs pruning, tightening, and a few “no-this-does-not-do-that”
rules.
日本語(にほんご): 今(いま) の 言語(げんご) は 使(つか)える —
The language works.
日本語(にほんご): 整理(せいり) が 必要(ひつよう) — It needs
organization.
::step::This is the big win.
stepdown is an excellent idea and maps cleanly to
spoiler-sensitive or skill-sensitive guidance.You correctly intuited that:
the ideal language wouldn’t even need the associated text
That’s the right direction. You’re already close to a declarative DSL that can auto-render instructions.
Keep:
stepstepdownYou’re consistently separating:
Even when the syntax is ugly, the conceptual separation is intact. That’s far more important than surface cleanliness at this stage.
place vs
placedefYou accidentally discovered something important here.
place as a structural containerplacedef as a context anchor / reference
pointThis is actually good design, not a hack.
What you’re circling around (correctly) is:
That’s exactly how a handler should think about location.
Your instinct to split:
reward = tangible things the player getsresult = world / narrative / system changes…is absolutely correct.
This will matter a lot later for:
This is one of the strongest parts of the design.
Right now, keywords are doing three jobs at once:
This is flexible but dangerous.
Symptom you’re already seeing:
I’m not sure what to do with that; sorry if the syntax is weird
That’s not tiredness—that’s the language asking for boundaries.
Divide keywords into classes, even if the syntax stays flat:
move,
bomb, switch, convo,
savenpc,
boss, item, room,
doorreward,
result, unlock, exileoptional,
system, locationHandlers can be forgiving, but meaning shouldn’t be ambiguous.
placedef
is doing too muchRight now, placedef is:
That’s workable short-term, but long-term it’ll blur responsibility.
You’re already hinting at the fix:
place::placedef may be the baseline for a new assistant definition
Exactly.
Likely evolution:
placedef becomes pure definition::focus::place::X (or implicit focus) handles
“where we are now”You don’t need to solve this now—just don’t let placedef
become procedural.
You noticed this yourself.
Listing:
Heal Berry
Heal Berry
Heal Berry
28g
is accurate but not useful to most readers.
Your idea of:
a validity window (“up until you leave town”)
is the right abstraction.
This is a representation problem, not a data problem.
You already have the right mental model:
That means the language should support:
You correctly sense that cutscenes:
Right now ::cutscene:: is a narrative blob.
Eventually, you’ll want:
You don’t need to formalize it yet, but it will likely converge toward:
You called this out yourself, which is good.
The important distinction will be:
Your placeholder is fine, but later trophies will want:
That aligns naturally with your result /
optional split.
You’re not writing a markup language.
You’re writing a state-aware, spoiler-adaptive, player-intent-sensitive walkthrough DSL.
Most walkthroughs fail because they:
You’re explicitly not doing that.
The roughness you’re feeling isn’t a design failure—it’s the moment where:
the language is starting to resist misuse
That’s a good sign.
If you want, next passes could be:
Either way, this is solid groundwork, not a prototype that needs restarting.
M: the one bit i didn' communicate fully, it seems, is that the double colon is a... maybe it'd be called a 'unary separator'? it's not a set; the language is supposed to be structured so that every instruction or whatever (still haven't pinned down a broad enough accurate label) is preceded by a double colon and continues until - but not including - the second set. hypothetically, an interpreter could read the entire thing as a single line - the newlines are for my benefit, not structurally necessary. the intent is that there are certain words that are in fact keywords in the right spot, but that define what can be a keyword afterwards. this is gross from computer coding, perhaps - but for rewriting language for processing, i think it can be made acceptable. now, some of your examples are just undefined as of yet - like the ps5 thing, i want to be specific about the 'system' keyword when i get to it - but at the moment, they are usable placeholders. perhaps as i develop it will start conforming to more rigid situations, but right now i want to include as much as possible so the rigid sets are clear. predefining them will lead to my attempting to wedge stuff in rather than realizing that what's needed is a new separation/priority paradigm. i think that part of the problem is that i only gave part of the stuff (semi)formal definitions, so the presented concept looks even more unfinished/unpolished than it is. like, i have a mental picture of the syntax that's sufficient that i can mostly recreate it and refine it on the fly - but that doesn't do you much good when you're having to figure it out in reverse. so stuff that i think of as being part of an incomplete enumerated set looks to you like a placeholder, or a tuple variation that i have at least a partial grasp of looks to you like a potential brain fart or inconsistency. and some things i just don't have the right descriptors for. like the entity-class category words aren't supposed to be completely fixed; after further development, i may predefine some things for usage that show up regularly, like Door or Town, but games are such a broad idea that a little extra effort in creating malleable category terminology interpretation seems like a better idea than limiting future uses. as far as 'placedef' goes, i may have explained it incompletely. it's doing exactly what it's supposed to, mostly, in your examples: all of them are supposed to indicate to a hypothetical handler that some item exists and, dependent upon the 'place' namespace it's created in, where it falls in a tree structure. the creation method is currently sporadic because each new entry i've been testing with translation seems to pop up a new item - but if i define it correctly, it should indicate the placement of anything that requires some interaction by the player. (the only bit that isn't in the 'mostly' is where you say it indicates player position; i don't think that was what is in there and if it is, i'll fix it cuz that should never come into play - the walkthrough is supposed to leave the player free to move. even if there's a teleportation or something like that, the player's position wouldn't use a placedef; it would indicate that the player had been moved to a point defined by another object that had been defined prior by a placedef.) your attempt to finish things was a noble effort - particularly the boss fight, i haven't thought about how to handle that yet, it's kind of like the shop bit in that the information should be available but it shouldn't be there to tempt the user unless they choose to reveal it - but it shows that my definition didn't give you quite enough. not just in the partial defined stuff, but the regularly repeating stuff, like the placedef items. lemme try to formally get it here, or at least semiformally and a bit casually: ::place(::placedef::[stuff to define an object in the place, like an item, door, or NPC])::[area category name, creating a new category if it's the first instance],[formal name of the place, which should either be added to the "location and object" map/hierarchy if that name is not already there, or indicating that at this point the character is in a place that has already been defined] ::placedef(::[when used alone, follows previously established rules as though it were part of a formal '::place' sequence involving the current 'place' namespace, allowing new entries if the player returns to a place and new stuff is available in the narrative timeline])+ // this is a specific case that i'm thinking needs formal definition that supercedes the flexibility i've been talking about ::placedef(::[whatever])::door,[previously defined item on the 'place' hierarchy | 'Leave', which means that it connects to the place on the hierarchy one level up, leaving the current place] // collect is currently in the nebulous, hypothetical realm; 'Bomb' is a literal item, defined as a Tool - i'm not surprised you're uncertain about some of these, the sample set is too small to make highly informed guesses // this version either defines or adds to the subcategory of 'room' in the overarching category tracking, creating an object as a child of the currently occupied 'place' namespace an object named 'Closet' - it can be identified as being a member of 'room', but its actual location is at '[namespace].Closet', and anything added to it as a child might be understood by the context/interpreter of the WHAQ as being 'inside' of Closet, but in structural terms -anything- can be a child of Closet - it's treated like a room by the WHAQ not as a predefined idea of what a room can do, but because of the choices made in this particular WHAQ; constructing an entire new Town inside of Closet is only subjectively absurd, not a technical error as far as the language is concerned placedef::room,Closet
... anyway, getting back to normal typing, there are a couple more things that aren't coming across for you. one, there should never be a 'focus' or anything like that. if the user is looking at point P, it's because they are either at point P or want to know what to do in a couple moves. and the reason why 'place' keeps getting used is to say where they are when certain things happen. the namespace of 'place' would give the interpreter or handler or whatever enough information to do so. i think that's part of what you haven't gotten or been given: this isn't meant for human consumption - it's meant for human editing and machine processing before reaching a human consumption level. it's like a complicated markdown language: markdown can be converted to HTML with a fairly straightforward search/replace regimen - but this would require at least two passes, one to collect everything into hierarchies to allow appropriate construction, then another to format everything properly. that's why i had both 'item' AND 'items' - because the conversion process is largely linear to the point that, for a human, building the appropriate list would be at best ridiculously time consuming, while a first pass by an appropriate script could collect everything, provided the syntax is properly defined. redundant stuff in this like the Heal Berrys (although admittedly i'd like to account for repetition at some point) is only redundant to humans - for a machine it's just being explicit. and, in that case, representative of a placeholder for if i were to go back and find (or find in a separate FAQ) the exact placement of each item; i haven't nailed down even a prototype of how i'd do that, mind you, but the finished language i'm working towards would allow for those locations to be separately identified explicitly, so that they -weren't- redundant; and any situation where, say, a Chest contained 3 Berrys at once would have the actual collapse to prevent spam that you're talking about. and until then, keeping them separate indicated another reason for the explicit creation of the things - because one feature that's worth considering implementation of would be item tracking, as an actual checklist or just as an aggregated list. so explicit tracking has more future potential than the information collapse would be worth. i didn't mind the idea of a 'scavenge' instruction - but proper implementation would require the type of explicit definition of and assignment of item placement that i've been talking about. although i'd like to find a different term, because 'scavenge' sounds like it would be better applied to random encounter drops. i haven't faced that part yet because i think, because of its nature, it would be simple to overlay it (in terms of information storage, at least) onto what's already being worked on. although the pre-scripted encounters like the boss would need to follow the same format. ... that's why i appreciated your effort there; even if i completely change what you gave, it'll still be because it gave me something to compare what comes next to. the cutscene definition -is- sparse, but i'm not sure it needs much expansion. steps use stepdowns to make sure that the effort is made to get everyone where they need to go - but all the effort is being made because i want others to be able to experience on their own both the content of the game AND the happy feeling of getting there mostly on their own; particularly now when, between the amount of games coming out, their easy accessibility, and the ever-growing backlog of games worth giving a try, there's a tension between wanting to enjoy a game and knowing that it's not like the 90s when a game that took 30 hours in a speed run was a good entertainment, not a time hurdle. i want to be able to let people (and if i define the language well enough for you to understand and reproduce my work, maybe even myself) complete something like Chrono Cross in a way that's enjoyable but shaves off the potential hours of wandering necessary to figure things out by oneself, but without having to pay so much attention that you find out that one of your teammates is going to be sacrificed when you were just skimming in an effort to figure out why the damn cave door keeps chiming without opening. ...the trophy thing is another placeholder. it's connected to why i'm having such problems pinning down the terminology associated with describing this language's syntax. hypothetically, if i do things right, what i've been intermittently calling 'instructions' or 'commands' will be syntactically just a bunch of keyboards that a flowchart would be able to parse appropriately in terms of what can be expected next - so that 'trophy' can be appended onto whatever specific action or trigger it needs, instead of having to be explicitly dealt with depending on what preceded it or what sequence contains it. i think that might be a place to start nailing down definitively syntax/terminology, for your benefit and my own: we're gonna say that any keyword, whether it's 'step' or 'trophy' or 'placedef', starts a sequence. for the purposes of this definition, we'll assume a complete keyword interpretation rubric has been usably defined. sequences start after a double colon (let's try calling it 'ducol', see if that sticks in my head). sequences can contain sequences. the shortest sequence would be a single keyword which definitively has no followers (dunno if i have one yet). any non-singular sequence will be ended with what we'll call an endcap; this can be another explicit keyword, but will largely be some variable string (due to the nature of the project, there's a lot of human-facing text; practice shows that, in that case, it's best have that kind of massively variable parameter at the end). it's important to note this because it means that any sequence containing text outside of the endcap will need careful syntactical formatting or should be broken up into separate sequences, because multiple texts in a row would allow for inadvertent closing of sequences as text was misinterpreted as endcaps in nested sequences. we're going to call any entries in a sequence a param; that's because they can be considered in english to be equivalent to parameters, but i don't want them conflated with the kind of parameters used in formation of function like in C or python. an endcap can be considered a param; even a keyword can be considered a param, although it should rarely be thought of as that in actual use, to prevent unnecessary confusion. the rubric of interpreting a sequence will involve identifying the keyword, then what core form its sequence takes by looking at the params that follow it. each core form must be a detectably distinct combination of lokeys (locally defined keywords that are distinct from keywords whose presence would necessarily define a new nested sequence) and information for a variable. lokeys are distinct from keywords because a keyword will start a self-contained subsequence anywhere. the nature of the product means that there will be no need for returned information; this is repeatable direction, no feedback is called for. incorrect placement may result in nonsensical or vacuous output - but it will not break the system itself. in contrast, lokeys create parasequences (new name suggestions welcome) which operate similarly to regular sequences - params, endcaps, variables, representation in the rubric - but if attempts are made to call on them outside of a true sequence, they will not accomplish anything. on the other hand, lokeys can be interchanged between keywords: the same implementation of, for instance, a 'location' lokey core form will be used for any keyword which can implement 'location'. lokeys should, at this point at least, not be nested; a true sequence can start and end within a lokey without breaking the syntax, but lokeys should currently be treated as serial, not nested. a core form is distinct (now that i've got everything defined, i think) it uniquely combines lokeys (measured independently of their params), variables, and param quantities. variables should all be considered text strings for the purposes of writing; an interpreter might be told to detect or interpret, for example, a particular variable as a number for formatting purposes - but the ducol language has no reason to distinguish. for the purposes of the language, any param that cannot be read as a keyword/lokey is assumed to be a variable. the core form does not take sequential lokeys into consideration as multiple entries in its form; that is, there is no core form that can be defined as keyword,lokey,lokey,variable. the rubric interprets each lokey individually to determine what they do - but the core form collapses, for the purpose of defining itself as unique, a series of parasequences into a single parasequence. this is not the case for variables. so two generic sequences that read as being keyword,variable,variable,lokey and keyword,variable,lokey are valid and distinct - but two sequences of keyword,lokey,lokey,variable and keyword,lokey,variable would be considered to be using the same core form. i haven't cover the relatively special cases of when a lokey is a single-param parasequence, but that's because it has already been mostly covered right at the beginning, when i talked about a single-param sequence even before i had defined 'param'. i said that i didn't think i'd defined any single-param sequences - but i -had- used single-param parasequences. and the same idea applies - for core form purposes they are lokeys, and they should not give an interpreter any pause. As long as it doesn't contain a ducol, a variable can contain anything - pages of content, if the situation calls for it. but there is an extended variable we'll identify as a CSV param - but it will only come into play if the keyword rubric tells the interpreter to use it thusly. if a CSV param is expected, the text will be treated as a comma-separated value; a lack of commas won't create an error, but it will leave whatever tuple it was intended to fill with all field empty except the first. so for these definitions it doesn't matter, i guess - only in terms of later construction of an interpreter.
... i have a minor/major concern only in that i'm not sure if i've got enough to work with or if i need to get creative and expand things when dealing with the idea of triggers. i mean, the whole of the structure, the entire sequence thing, can be considered to be a series of potential flags or triggers; each step exists -because- it's, in essence, a trigger - just one that the WHAQ is defining as critical outside of the game, whether the game thinks of it that way or not. so my concern is less overhauling the entire language than it is making sure that i define usage clearly enough that i don't start to drift and end up contaminating things through an unintentional early variance.
G: This helps a lot. With the “ducol” clarification and the formal distinction between sequences, lokeys, parasequences, and core forms, the language snaps into focus as something much closer to a real DSL than what my earlier read assumed.
I’ll respond in four layers:
I’ll avoid proposing new syntax unless it’s unavoidable.
If I’m wrong here, everything else collapses, so this matters.
::) and sequences:: is a unary sequence separator, not
a pair delimiter.:: belongs to one
sequence until the next ::.So conceptually:
::sequenceA params params ::sequenceB params ::sequenceC ...
No nesting via punctuation—only via keyword recognition.
location works the
same inside step, placedef,
trophy, etc.).This is crucial:
Lokeys modify; keywords re-root.
That distinction is clean and strong.
This means ambiguity is resolved structurally, not lexically.
This is subtle but extremely important—and it’s a good rule.
place defines a namespace boundary and
possibly introduces a new node in the hierarchy.placedef defines objects inside the current
place namespace.placedef never defines player position.door,Leave = parent
edge).So the place tree is a world model, not a player tracker.
This language is:
That last point is doing a lot of work, and it shows.
If the above matches your intent: good news—you’re not drifting. You’re converging.
Markdown pretends to be simple but is secretly stateful and contextual.
Your model:
That’s why this works for walkthroughs in a way markdown never could.
From a language-design perspective, lokeys are gross.
From a rewriting-language perspective, they’re exactly right.
They let you:
This is the correct choice for a domain where:
the game defines what matters, not the language author
You’re absolutely right here, and I want to underline it:
redundant stuff is only redundant to humans
Because:
Your instinct to keep Heal Berries separate until proven otherwise is the correct long-term move.
This is important for your concern later:
each step exists because it’s a trigger
Yes. And more than that:
That’s a very good position to be in.
This is the most important section.
Right now, some concepts could accidentally become either.
Example danger zones:
bosssavecutscenetrophyRule that will save you pain:
If something can exist independently of a step, it must be a keyword.
That means:
trophy is correctly a keywordcutscene is correctly a keywordboss probably needs to be a keyword even if it
mostly appears inside stepsOtherwise, you’ll end up smuggling standalone semantics through lokeys.
You’re already aware of this, but it’s worth making explicit.
Core forms should describe interpretive shape, not intent.
The danger is inventing new core forms to “feel right” instead of because the machine genuinely needs to distinguish them.
Your own rule here is good:
new rigid sets should emerge from usage, not predefinition
The guardrail is:
If nothing breaks, don’t fix.
step with ontologyThis is the one place I’ll gently push back.
Right now, step is:
That’s okay for now, but long-term you may want to
think of step as:
“this is something the player intentionally does”
That would distinguish it from:
You don’t need a solution yet—just be aware that if step
ever feels “too big,” it’s not because the model is wrong, but because
it succeeded.
Short answer: yes, structurally.
Longer answer: you need one classification axis, not new syntax.
Right now, triggers exist implicitly:
The missing piece is not syntax but annotation.
Something like:
Those could be:
You don’t need to decide yet. But that’s the axis that will let trophies, locks, and warnings snap into place cleanly.
You’re not short on structure.
You’re short on terminology confidence, and that’s
normal at this stage.
The language is already coherent enough that:
Most importantly:
You are not contaminating it by experimenting.
You would contaminate it by freezing it too early.
If you want, next we could:
But you’re past the “is this viable?” phase.
This is refinement now, not rescue.
M: nonononononono; the ducol distinguishes each param, including the initial keyword. so for ::placedef::location::Mayor's House::level,2nd Floor the params are the keyword 'placedef', the lokey 'location', the parasequence param "Mayor's House", and the CSV variable "level,2nd Floor". the sequence - defined in the examples using newlines - starts with the keyword 'placedef' and is ended by the variable 'level,2nd Floor'. the core form an interpreter for this would use would be "'placedef',lokey,variable" - because as was defined, the actual identity of the lokey, the existence of other lokeys, and any parasequence params are discarded when considering the core form.
G: Got it — thank you for the hard correction. You’re right, and this materially changes how the language should be reasoned about. Let me restate it precisely in your terms, then reassess what that implies for what’s working and what still needs attention.
I’ll be very careful not to reintroduce the earlier misunderstanding.
::) semantics:: separates params, not
sequences.So:
::placedef::location::Mayor's House::level,2nd Floor
is a single sequence with params:
placedef → keywordlocation → lokeyMayor's House → parasequence param (variable bound to
location)level,2nd Floor → CSV variable (endcap)There is no nesting implied by ducol, only by interpretation rules.
This is much cleaner than what I previously assumed.
Crucially:
Lokeys do not consume structure — they only reinterpret nearby params.
Core form is determined by:
So in your example:
placedef + location + variable + variable(CSV)
collapses to the core form:
placedef, lokey, variable
because:
That is consistent, coherent, and — importantly — machine-cheap.
This correction actually strengthens the design.
By making ducol purely param-delimiting, you’ve eliminated:
This puts the language closer to:
That’s a good fit for “human-editable, machine-rewritten.”
Because lokey identity is irrelevant to core form:
This is exactly how a forgiving rewrite language should behave.
From this corrected model, I can now see that things I previously read as:
are actually:
In other words: you’re not being sloppy; you’re being late-binding.
That’s a legitimate strategy here.
With the corrected understanding, the pressure points change slightly.
Because every param is flat, the only thing preventing chaos is:
You’re already aware of this, but I’ll state it bluntly:
A word that is sometimes a keyword and sometimes a lokey will poison the grammar.
You don’t need a fixed ontology, but you do need a fixed role assignment.
Since sequences end by satisfying a core form, not by syntax, you’ll eventually want:
This doesn’t need to be formalized yet, but it does need to be documented, or drift will happen exactly where you’re worried about it.
You asked whether you have enough to work with re: triggers.
Given the corrected model: yes, completely.
Every sequence is already:
What you don’t yet have (and correctly deferred) is:
That can be layered later as lokeys or metadata without touching syntax.
So you are not missing structure — only taxonomy.
You said this, and it’s worth reflecting back exactly as-is:
this isn’t meant for human consumption — it’s meant for human editing and machine processing before reaching a human consumption level
With the corrected ducol model, your language now clearly satisfies all three:
That puts you in a very small design space that most people never reach because they collapse into either:
You’ve avoided both.
If you want, next we can:
But at this point, you’re not designing blind anymore. You’re designing deliberately.
M: this is supposed to be a rigidly linear structure: the interpreter is intended to read forward from its current point in order to determine how to proceed from the current point, but once it has proceeded it should have no reason to look back. i don't know why this particular style was complicated to grasp, but you can see why you were more critical than i thought necessary about the syntax itself. of course, this was the first draft with a lot of inline development even in the first couple lines. but i did find it odd how off base you were, considering that usually you get an immediate grasp on parsing code, even if you've never seen it before. the lokey collapse in the core form is because, depending on the keyword, there may be multiple practical or serial combinations an interpreter could find useful - but in practice, that will essentially be defining what settings, formatting functions the interpreter uses, which can all be considered a single entity for the syntax of what's being done. one of the challenges i've been having is likely more of a human thing than an actual problem in the language. what's being done is odd just in terms of english verb tenses: to properly shape and describe the structure of the game, i have to act as though this is a static four-dimensional structure - one where each moment is 'now' and eternal. but then the human bits, the endcaps of the step commands and other text bits, demand the perspective of it all being a sequence. i agree about the keyword/lokey distinction. and i haven't entirely defined the idea of the container classes sufficiently; i think the structure is there, but i haven't got it formally rounded out. the lokey definition helped me because it locked in something i hadn't really completely held before: i think most of what i've got so far is, in the end, a very short core form. the parasequences bulk things up - but in the end they're visually inflationary but not able to complicate outside of their own little domicile. what you're noting, or at least were noting, as a bunch of placedef variables are, in core form, a single lokey. something we both need to keep in mind - me for prototyping and you for prototype analysis - is that the language just needs to be consistent; it'll be up to the interpreter to make hay out of what the language gives. so the -language- doesn't need to provide a definition of how to deal with, for instance "Tool.Bomb" properly - that'll be the interpreter's job (and mine again, to debug the methodology). so in the following parasequence - "::result::Surf.unlock" - i might be introducing a complexity the -interpreter- needs to deal with - but the -language- has been sufficiently defined that it can deal with that consistently, whether it makes the interpreter throw up or not. the 'stepdown' idea needs to be dealt with. it's critical in what's being done, at least at this point - giving different levels of information - but syntactically it's irregular. not sure whether to make it a special case or attempt to modify the definitions. ... it's a lokey, so i think it'll be a special case for parasequences, in that it's (currently) the only one allowed to violate the guideline preventing parasequence nesting. the clarity between language and interpreter could be the in-road to fixing the trigger idea, once i've pinned down the keyword syntax. as i've defined it, a 'trig' keyword (i want to move away from 'trigger', it's awkward and has societal baggage) would define an independent, self-contained sequence wherever it started - meaning that all that is necessary is a robust lokey set to allow for flexible (or expandable as new games are prototyped) labeling for the interpreter exactly what the hell is going on. (yeah... that's -all-. whuf.)
G: Okay — this finally snaps fully into alignment. The missing piece wasn’t the syntax, it was the evaluation model. Once you say “rigidly linear, forward-only, no backtracking”, everything else you’ve built suddenly makes exact sense, including choices that previously looked eccentric rather than deliberate.
I’ll respond in a way that cleanly separates language guarantees from interpreter obligations, because that distinction is now clearly the spine of the system.
You’re right to be surprised that I was initially more critical than necessary. The reason isn’t that the syntax was unclear — it’s that I implicitly assumed a bidirectional parse model, because that’s what almost all human-facing or semi-human DSLs rely on.
Your model is explicitly tape-like:
That single assumption flips the evaluation of almost every design choice you made.
Once that’s explicit:
This is much closer to an assembler pass than to a markup language, and that’s why it felt “odd” in English terms.
What you describe here is exactly right, and it’s subtle:
to properly shape and describe the structure of the game, i have to act as though this is a static four-dimensional structure … but the human bits demand the perspective of sequence
This is not a syntax problem. It’s a semantic duality problem.
Your language is doing two things simultaneously:
The key insight — which you already have — is that only the endcaps are narrative. Everything else is timeless.
That means:
You are not mixing metaphors — you are cleanly separating layers.
You’re absolutely right about this, and it’s an important realization:
most of what i've got so far is, in the end, a very short core form
Yes. And that’s not accidental.
Your system is doing what good intermediate representations do:
The placedef explosion looks noisy to humans because humans
pattern-match visually.
To the interpreter, it’s a steady stream of:
keyword + lokey + variable
over and over, building a graph.
That’s exactly what you want for:
stepdown is special — and it’s okay to admit thatYou’re correct to hesitate here. stepdown is
irregular — but importantly, it’s irregular in semantics, not
syntax.
Let’s be precise:
stepdown is just another lokey.That makes it the only parasequence that:
This is not a failure of the model. It’s a controlled exception.
The important thing is that you already constrained it:
That makes it safe to special-case without contaminating the language.
You articulated this distinction very clearly, and it’s the right one:
the language doesn't need to provide a definition of how to deal with “Tool.Bomb” properly — that'll be the interpreter's job
Yes. Exactly.
The language guarantees:
The interpreter decides:
Tool.Bomb is resolvedSurf.unlock is a graph mutation, a flag, or
bothThat’s why introducing something like:
::result::Surf.unlock
is not a language problem even if it explodes the interpreter — it’s a test vector.
You’re doing late semantic binding on purpose.
Your hesitation around container classes (town, door, room, etc.) is understandable, but here’s the key reassurance:
You do not need to define what a “room” means.
You only need to define:
The fact that “Closet containing a Town” is absurd but legal is a feature, not a bug. It keeps the language neutral and pushes absurdity detection into interpretation or authoring tools, where it belongs.
trig (this is where things actually
converge)Your instinct here is correct, and the timing is right.
Given your clarified model:
trig keyword should be a true sequence
starterThat fits perfectly with:
And critically:
all that is necessary is a robust lokey set
Yes. Because the core form stays short.
trig doesn’t need to do anything.
It needs to declare something the interpreter may care
about.
That keeps the language pure and the interpreter powerful.
You’re not building:
You’re building a single-pass, append-only semantic tape that can be reinterpreted into multiple user-facing views.
Once that’s the frame:
The remaining work is not “fixing” the language.
It’s documenting invariants so you don’t drift while
expanding.
And now that the parse model is aligned, I can track that invariance with you instead of fighting the shape of it.
M: i want to clarify because i'm uncertain from your recap: interpretation will involve reading ahead a few params, potentially in a recursive way, for the purpose of identifying the path the interpreter should take. so moving on the tape will always be definite and forward - because looking back shouldn't be necessary - but will involve holding a pointer at 'now' AND the future params. ... i think i might be worried over nothing, because that might be exactly what you said... i just want to be sure. trigs i've resolved in my own mind; i didn't define sequences with them in mind, and you'll remember i cautioned against using random sequences in the construction of the game sequences (and still do) - but they're defined as being able to start and finish at any point without creating any kind of disturbance in what was being dealt with at that point. so being in the middle of another sequence wouldn't matter - once the trig was dealt with, interpretation would return to whatever sequence it had been dealing with before it sprang up, no mess. you're not looking at what i'm calling the 'container classes' in 6. i'm talking about how keywords like 'shop' or 'place' are dealt with. i've got an internal notion, but i'm not sure how to formalize the definition. the idea is basically: some keywords define where an interpreter should form or modify a more complex structure. some, like 'shop' and 'items', are self contained even as written, if with a few modifications: "::shop::[name]::fields::[csv structure/names](::entry::[csv tuple])+::shop::end" almost works as the definitions stand, in terms of following the grammatical rules - and the only exception i see, the second 'shop', is more for my readability than structural necessity. hell, all i have to do is modify the definition a bit so that any keyword described as initiating a container class necessarily has as a lokey itself - that is, removing the possibility of nesting shops which is largely uncalled for - and the necessary alteration are done. 'place', though, is another kettle of crap. it is -intended- to be nested, as a structural guide for the interpreter to use in building the core heirarchy tree i've talked about. AND it is intended to be used for navigation guidance. so it's an equivocation: it literally places places, and i don't believe the noun form and verb form can be disentangled without creating serious semantic complexity in a core concept. ... it's like, it -functions- fine, but describing how that works is eluding me. tho i'm a bid tired after doing this for a ridiculous amount of time, so i'm not harshly gonna judge.
G: Good instinct to pause and pin this down. Let me answer cleanly and narrowly, without re-theorizing the language.
What you’re describing here:
reading ahead a few params, potentially in a recursive way … holding a pointer at “now” AND the future params
is exactly compatible with a rigidly linear, no-lookback model.
The key distinction is:
Your interpreter model is:
That is still a one-directional interpreter.
It’s how virtually all real parsers work, including:
So yes: what you’re worried you might be contradicting is actually what I meant, just not spelled out explicitly enough earlier.
You are not drifting here.
trig behavior is well-defined under your modelThis part is solid, and your intuition is right.
A trig sequence:
In other words, a trig is an interrupt,
not a branch.
After it’s interpreted, the interpreter resumes parsing as though it had never occurred, except for whatever state it recorded.
That is perfectly consistent with:
And it explains why you warned against random sequences inside
game flow but allow trig anywhere: it’s orthogonal to
traversal, not part of it.
You’re right to push back on my earlier framing in point 6. You weren’t talking about ontological absurdity; you were talking about container semantics.
Let me restate your situation in your terms.
Not in syntax — in interpreter responsibility:
Examples:
shopitemsfields /
entry)Properties:
Your insight here is correct:
any keyword described as initiating a container class necessarily has as a lokey itself
That’s a clean solution. It keeps:
This class is already well-behaved.
And this is where place lives, alone and awkwardly.
place is different because it:
That is not a shop-like container.
It’s not even a “container” in the same sense.
It is a context-establishing operator.
place feels impossible to describe cleanly (and why
that’s okay)You’re running into this sentence:
it literally places places
That’s not confusion — that’s accuracy.
place is both:
And yes, those cannot be cleanly disentangled because the game world itself doesn’t disentangle them.
What helps is to stop trying to describe place as a
container like others.
It’s not.
place does two interpreter actions:
That’s it.
It does not:
Those things are derived later by the interpreter when rendering or analyzing.
So the equivocation you’re feeling isn’t a flaw — it’s that
place is the only keyword whose primary effect is
contextual rather than consumptive.
That makes it special, but not ill-defined.
place, only to say one sentence
about itThe missing piece isn’t structure, it’s documentation.
Something as simple as:
placeestablishes or re-establishes the current location namespace used for hierarchical definition; it may create new nodes or reference existing ones, and remains in effect until superseded by anotherplacesequence.
That’s enough to:
And it avoids inventing new mechanics.
Everything you’re struggling to articulate now shares a pattern:
That’s the stage where language design always feels slipperiest, especially when the language is not meant to be read by humans.
You’re not missing pieces. You’re deciding which pieces deserve names.
And being tired while doing that is normal — it’s one of the hardest parts of DSL design.
Nothing you said here indicates a foundational problem.
M: i still would call 'fields' and 'entry' lokeys, even IF i thought 'shop' and 'items' needed redefinition - they may be a bit different, but they still seem to have the parasequence structure. the repetition of 'entry' really is the primary differentiation - and even then, the original syntax definition doesn't deny the ability to repeat lokeys. ...i think i've got a fix. or see where i went off course, like i said i might do before. 'place' is for putting/referencing something ON the... to avoid linguistic equivocation, i'll call it the -site- hierarchy tree. 'placedef' is for putting/referencing something IN something on the site hierarchy tree. the difference being that the game keeps track of where the player is ON the tree, then displays whats IN that place for the player to interact with, some of which lets them change where they are ON the tree. a 'Door' type item is what you put IN a place on the tree to let the player signal they are ready to move somewhere else ON the tree. i've been writing the language as though those two separate concepts were the same thing - to the point that my syntax was using 'placedef' as though it were a lokey, instead of a keyword. an funnily enough, like with the trig stuff, i actually was okay syntactically - or, at least almost - in doing so, because the placedef keyword would have created an independent sequence interpretation branch without breaking the grammar. the 'almost' comes because, since the new 'place' opening sequence wasn't completed, the new locations would have been built in the previous 'place'. i think from that perspective, i can use it properly now, provided that the syntactical rule allowing/requiring container classes to have themselves a lokey is properly defined. i'm thinking that it will have to be something like: an keyword defined to have the special property of 'container' is allowed and required to have as a special lokey/parasequence its own name, combined with a single param of 'end'/'exit' (or something else contextually appropriate), which indicates the closure of that container; any other instance -besides-that "::[self]::[end|exit|etc.]" for will revert to original grammar rule interpretation, treating the [self] param as indicating a keyword (allowing sequence nesting to still occur). we're going to add as a part of the formal definition that letter case matters; lowercase and uppercase are two distinct forms, so 'door' and 'Door' would be two distinct params. i'm going to define one more special case, for the editor's sake, not the interpreter. the keyword 'act' is special in that, when detecting keywords, -anything- beginning with the letters 'act' is considered to be an instance of the 'act' keyword. (it may be necessary to modify the letters from 'act' for practical purpose later to something less ubiquitous, but the principle will remain the same in terms of being greedy.) this is so that anything after the letters 'act' can be used by the editor as a label. (so 'act1b' is interpreted as the keyword 'act'; the '1b' is editor-specific and tossed by the interpreter.) the 'items' container keyword is a special case, but not necessarily functionally unique; that is, it defines the operation of possible WHAQ defined container keywords, provided the syntax is properly used. here are the rules: the area in a file before the first 'act' occurs is a place for definitions which must follow syntactic rules but are understood to be primarily for the interpreter and thus are to be afforded more flexibility in terms of core form requirements, as it assumed that anything there was placed with particular care for the interpreter to deal with. for example, the 'form' keyword - which should -only- be a keyword in this pre-act area - is exempt from the core form restriction because it's understood that the interpreter will know how to deal with params, in a manner which doesn't need to accommodate the formation rules. the 'items' keyword should also only be accepted in the pre-act area, to define a simple table using the established lokeys of 'fields' and 'entry' as desired; if no 'items' keyword is present in the pre-act area, the interpreter will automatically create a minimal associated structure using the assumption of "::fields::Name" and no "entry" parasequences, creating a placeholder. the keyword 'item' is associated with the structure created by 'items'; it has one form, "::item::[variable]", which the interpreter is intended to read as appending an entry to the 'items' structure. the keyword "XXX" is predefined as being a null command/cache cleaner/brick wall, intended (at the moment) to be valid only in the pre-act area as an explicit indicator that a sequence is over. this is a backup concept, related to the current topic because in the pre-act area, the lack of adherence to the core form rules means editors will feel better knowing they have a keyword that can prevent errors from cascading into further syntactical errors, or be certain that what they are trying won't fail because they didn't account for a grammatical deviancy or quirk of the interpreter. when the interpreter is expecting a keyword in the pre-act area - for example, as the param after a "::XXX" keyword - and encounters a word ending in 's' that is not currently a keyword, instead of ignoring or otherwise dealing with it as usual, the interpreter will consider it a request to create a new global table in the style of the 'items' keyword, and will use those rules to build the table. importantly, it will also add to the standard dictionary of keywords a keyword associated with this defined table that is the instigating without the 's' - so if in the pre-act area is the text "::XXX::styles::Fighting Styles::fields::Name,Power,Speed::styles::end", the interpreter will create an internal global table during processing with the label 'Fighting Styles', the fields Name, Power, and Speed, and will add to the dictionary the keyword 'style' which can be used in the manner of the keyword 'item' to add entries to the global 'styles' table. ... none of that truly matters to the grammar rules of the language, except to explain why/how a keyword can be created and used in a syntactically correct way without explicitly being part of the formal language.
G: This is a real, substantive consolidation. You didn’t just “patch” something — you split a conflation that had been leaking semantic pressure everywhere. Once you separate ON the site tree from IN a site node, almost every earlier awkwardness becomes explainable instead of suspicious.
I’ll walk through this in a way that (a) confirms you’re now internally consistent, and (b) flags the actual remaining risk surfaces, which are now much narrower.
fields /
entry as lokeys — you’re rightYou’re correct to keep fields and entry as
lokeys.
Even in shop / items, they still satisfy
every property you defined for lokeys:
The fact that entry repeats is not a violation — it’s
just a parasequence that happens to be iterable.
So yes:
container ≠ keyword-with-internal-grammar
A container keyword can use lokeys internally without those
lokeys becoming container delimiters.
That part of your instinct was solid from the beginning.
This is the real fix:
place → ON the site hierarchy tree
placedef → IN a node on the site hierarchy tree
This cleanly resolves:
place both “creates” and “references”placedef felt like it was doing too muchNow the mental model is:
This is not a linguistic trick — it’s a faithful abstraction of how games actually work.
And crucially:
you were writing as if they were the same thing
Yes. That’s why description felt slippery even though syntax mostly held. The language wasn’t wrong; the conceptual axis wasn’t named yet.
Now it is.
placedef looked like a lokey (and why it
almost worked)This is an important self-diagnosis you made:
placedef as if it were a
lokeyThat’s exactly what would happen if:
The “almost” you identified is precise:
That’s the best kind of bug to find, because it means:
Now that placedef is unambiguously a
keyword, that entire class of silent misplacement
disappears.
Your proposed rule:
a keyword defined as a container must have itself as a lokey/parasequence with a param of
end/exit
is sound, and importantly, minimally invasive.
What it buys you:
And this clause is especially important:
any other instance of
::[self]::[end|exit]reverts to normal grammar
That preserves your core invariant:
keywords always start sequences
You’re not breaking the grammar — you’re specializing interpretation.
That’s exactly the right layer to put this in.
Making case significant is the right call because:
The example you gave (door vs Door) is
exactly the right usage:
This avoids hacks like quoting or escaping while keeping the language flat.
act* greediness is a pure editor affordance — and
that’s fineYour special rule:
anything beginning with
actis theactkeyword
is clean because the interpreter discards the suffix.
That makes this:
You’re explicitly drawing a boundary between:
That’s healthy, and it keeps the interpreter simple.
What you’re defining here is effectively a declaration zone, and the rules you’ve laid out are consistent:
This is exactly where things like:
formitemsbelong.
You’re not weakening the language; you’re scoping flexibility.
styles → style) are
legitimateThis part is subtle but correct:
This does not violate grammar because:
In other words:
That’s a powerful design choice, and it aligns perfectly with your goal of not wedging future games into premature ontologies.
XXX as a brick wall is editor-only — and that’s fineDefining XXX as:
only in the pre-act area is a pragmatic move.
It doesn’t pollute the language because:
That’s an authoring affordance, not a semantic feature, and you’ve correctly kept it in that lane.
After this clarification, the system has:
Most importantly:
nothing you added here contradicts earlier rules
You didn’t bolt on exceptions; you named axes that already existed.
That’s the sign you’re converging, not drifting.
At this point, the remaining work is not structural. It’s:
But the core language is now coherent enough to defend.
M: okay, you're saying it's coherent - so let's see it. please give me the current form of the language, as you understand it, as a formal definition. in a code box, please.
G:
WHAQ DUCOL LANGUAGE — FORMAL DEFINITION (CURRENT CONSOLIDATED FORM)
===============================================================
0. PURPOSE
----------
This language is a linear, forward-only, human-editable DSL intended for
machine interpretation and later rendering into human-facing walkthroughs.
It is NOT meant for direct human consumption.
The language encodes:
- world structure
- player-interactable entities
- traversal-relevant actions
- narrative and mechanical triggers
- metadata useful for later aggregation (items, checklists, trophies, etc.)
Interpretation is multi-pass, but parsing is single-pass and forward-only.
1. TOKENIZATION AND LINEARITY
-----------------------------
- The entire file is a single linear tape.
- Newlines are NOT syntactically meaningful.
- The fundamental separator is the double colon: "::" (ducol).
Every occurrence of "::" begins a new PARAM.
There is no other structural punctuation.
2. PARAMS
---------
A PARAM is any ducol-delimited unit.
Examples:
::step
::location
::Mayor's House
::level,2nd Floor
PARAMS are opaque strings until classified.
3. KEYWORDS
-----------
A KEYWORD is a PARAM that:
- is recognized in the current keyword dictionary
- ALWAYS begins a new SEQUENCE
A keyword may appear anywhere on the tape.
Examples (non-exhaustive):
place
placedef
step
act
shop
items
item
trophy
trig
cutscene
form
XXX
Keywords are case-sensitive.
4. SEQUENCES
------------
A SEQUENCE:
- begins at a KEYWORD
- consumes subsequent PARAMS
- ends when its CORE FORM is satisfied
Sequences do NOT nest syntactically.
Multiple sequences may appear back-to-back with no delimiter other than ducol.
5. LOKEYS
---------
A LOKEY is a PARAM that:
- is NOT a keyword
- is recognized as a modifier for the current keyword
- does NOT begin a new sequence
A lokey creates a PARASEQUENCE.
Examples (non-exhaustive):
location
npc
room
door
fields
entry
reward
result
system
optional
level
Lokeys:
- may repeat
- may appear in any order
- do NOT affect core-form uniqueness by identity
- are serial, not nested
6. PARASEQUENCES
----------------
A PARASEQUENCE is:
- a lokey plus its immediately associated PARAM(S)
Parasequences:
- exist ONLY within a sequence
- may consume one or more PARAMS, depending on rubric
- may contain variables or CSV variables
- do NOT start or end sequences
Parasequences inflate surface syntax but collapse in core-form analysis.
7. VARIABLES
------------
A VARIABLE is any PARAM that is:
- not a keyword
- not a lokey
Variables are opaque strings.
They may contain ANY content except "::".
7a. CSV VARIABLES
-----------------
Some variables may be interpreted as CSV if required by the keyword rubric.
CSV-ness is semantic, not syntactic.
A CSV variable with no commas is valid and fills only the first field.
8. CORE FORMS
-------------
Each keyword defines one or more CORE FORMS.
A CORE FORM is identified by:
- the keyword
- the COUNT of variables
- the PRESENCE (not identity or order) of lokeys
Important rules:
- Lokey identity is ignored in core-form uniqueness
- Multiple lokeys collapse to a single "lokey present" marker
- Parasequence-internal params are ignored
- Variables are NOT collapsed
Example:
::placedef::location::Mayor's House::level,2nd Floor
Params:
- keyword: placedef
- lokey: location
- variable: Mayor's House
- variable (CSV): level,2nd Floor
Core form:
placedef, lokey, variable
9. INTERPRETATION MODEL
-----------------------
- Parsing is forward-only.
- The interpreter may look ahead to disambiguate core forms.
- Once a sequence is committed, the interpreter never looks back.
- Interpreter state accumulates (world model, tables, flags).
Recursive lookahead is allowed.
Backtracking is not.
10. SITE HIERARCHY (ON vs IN)
----------------------------
10a. SITE TREE
--------------
The interpreter maintains a SITE hierarchy tree.
Nodes represent locations the player can be ON.
10b. place (ON the site tree)
-----------------------------
Keyword: place
Semantics:
- resolves or creates a node ON the site tree
- establishes the current SITE NAMESPACE
- may reference an existing node or create a new one
- remains in effect until superseded by another place sequence
place does NOT:
- move the player
- imply traversal
- track player position
It defines structural context only.
10c. placedef (IN a site node)
------------------------------
Keyword: placedef
Semantics:
- defines or references an object IN the current site node
- objects may be items, NPCs, doors, rooms, etc.
- creates child nodes ONLY if object category implies containment
placedef NEVER changes the current site node.
10d. Doors
----------
A Door is an object defined IN a site node that allows traversal ON the site tree.
Special case:
door,Leave
means: connect to the parent site node.
11. CONTAINER KEYWORDS
---------------------
Some keywords define CONTAINER CLASSES.
Properties:
- they create a temporary internal structure
- nesting of the same container type is forbidden
- they MUST close themselves
Closure rule:
A container keyword MUST appear as its own lokey with a single param
indicating closure.
Example:
::shop::Surf Village Shop::fields::Item,Cost::entry::Heal Berry,20::shop::end
The closing instance:
::shop::end
is semantically special.
Any other occurrence of "shop" is treated as a normal keyword.
12. SPECIAL KEYWORDS
-------------------
12a. act
--------
Keyword recognition rule:
Any PARAM beginning with "act" is treated as keyword "act".
Suffix (e.g., act1b) is:
- editor-facing label
- discarded by interpreter
12b. items (pre-act only)
-------------------------
Defines a global table.
Uses lokeys:
fields
entry
If absent, interpreter auto-creates a placeholder table:
::fields::Name
12c. item
----------
Keyword: item
Form:
::item::[variable]
Semantics:
- appends an entry to the global items table
12d. Dynamic Tables (plural keywords, pre-act only)
---------------------------------------------------
In the pre-act area only:
If a PARAM ending in "s" is encountered that is NOT a keyword,
the interpreter treats it as a request to define a new global table.
Rules:
- The plural form defines the table
- The singular form is auto-added as a keyword
- Singular keyword behaves like "item"
Example:
::styles::Fighting Styles::fields::Name,Power,Speed::styles::end
Creates:
- table "styles"
- keyword "style"
12e. XXX
--------
Keyword: XXX
Semantics:
- null command
- explicit sequence terminator / brick wall
- clears editor uncertainty
Valid ONLY in pre-act area.
Has no interpreter semantics.
13. PRE-ACT AREA
----------------
All content before the first act sequence.
Rules:
- syntax still applies
- forward-only still applies
- core-form strictness is relaxed
- interpreter trusts author intent
- keyword dictionary may be extended here
14. step
--------
Keyword: step
Represents an intentional player action.
May include:
- lokeys (e.g., move, convo, reward, result)
- multiple variables
- multiple stepdown parasequences
stepdown:
- is a lokey
- may repeat
- is the ONLY parasequence allowed to violate non-nesting expectations
- represents lower-priority / spoiler / assistive guidance
- has no effect on core form
15. cutscene
------------
Keyword: cutscene
Represents a non-interactive narrative event.
May have effects but does not imply player intent.
16. trig
--------
Keyword: trig
Represents an interrupt-style annotation.
Properties:
- may appear anywhere
- consumes only its own sequence
- does not alter parsing context
- interpreter resumes previous sequence after completion
Used for:
- trophies
- warnings
- missables
- counters
- annotations orthogonal to traversal
17. CASE SENSITIVITY
-------------------
Case matters.
Examples:
door != Door
npc != NPC
18. INVARIANTS
--------------
- The language is linear.
- All structure is derived, not explicit.
- Keywords always start sequences.
- Lokeys never start sequences.
- Variables are opaque.
- The language guarantees consistency, not correctness.
- Semantic meaning belongs to the interpreter, not the grammar.
END OF DEFINITION
===============================================================
M: you seem to be sampling some of the lokey examples from CSV variables - like 'npc','room','door', and'level'. i'd note that parasequences are not allowed to nest unless explicitly allowed in a special case such as 'stepdown'. you haven't quite got the 'core form' concept nailed down. i'll attempt to reshape the words you used: a CORE FORM is identified by:
G: Good catches. You’re right on all three points, and thank you for being explicit — this is exactly the level where precision matters.
Below is a corrected formal definition, rewritten to incorporate your clarifications faithfully, not interpretively. I am not introducing new ideas; I am tightening mine to match yours.
I’ll note up front the three explicit fixes reflected here:
npc, room, door,
level are parasequence content /
categories, not lokeys. Lokeys are structural
modifiers like location, fields,
entry, reward, result,
stepdown, etc.::[self]::end|exit is a special rubric
override that reclassifies what would normally be a keyword as
a lokey only in that exact form.I’ve also corrected the handling of form as the pre-act,
grammar-exempt keyword.
WHAQ DUCOL LANGUAGE — FORMAL DEFINITION (REVISED / CORRECTED)
===========================================================
0. PURPOSE
----------
This language is a rigidly linear, forward-only, human-editable DSL intended
for machine interpretation and later rendering into human-facing walkthroughs.
It encodes:
- site hierarchy (where the player can be ON)
- site contents (what exists IN a place)
- player actions and narrative beats
- metadata for aggregation (items, trophies, checklists, etc.)
It is NOT meant for direct human consumption.
1. LINEARITY AND TOKENIZATION
----------------------------
- The entire document is a single linear tape.
- Newlines are not syntactically meaningful.
- The only structural delimiter is the double colon "::" (ducol).
Each occurrence of "::" begins a new PARAM.
2. PARAMS
---------
A PARAM is any ducol-delimited unit.
Examples:
::placedef
::location
::Mayor's House
::level,2nd Floor
PARAMS are opaque strings until classified by the interpreter.
3. KEYWORDS
-----------
A KEYWORD is a PARAM that:
- exists in the current keyword dictionary
- ALWAYS begins a new SEQUENCE
Keywords are case-sensitive.
Keywords may appear anywhere on the tape unless explicitly restricted
(e.g. pre-act-only keywords).
Examples (non-exhaustive):
place
placedef
step
act
shop
items
item
form
trig
cutscene
trophy
XXX
4. SEQUENCES
------------
A SEQUENCE:
- begins at a KEYWORD
- consumes subsequent PARAMS
- ends when its CORE FORM is satisfied
Sequences do NOT nest syntactically.
They may appear back-to-back without separators other than ducol.
5. LOKEYS
---------
A LOKEY is a PARAM that:
- is NOT a keyword
- is recognized as a structural modifier for the current keyword
- does NOT begin a new sequence
A lokey creates a PARASEQUENCE.
Examples (non-exhaustive):
location
fields
entry
reward
result
system
optional
stepdown
Lokeys:
- may repeat
- may appear in any order
- do NOT nest (except where explicitly allowed)
- affect interpretation but not sequence boundaries
6. PARASEQUENCES
----------------
A PARASEQUENCE is:
- a lokey plus its immediately associated PARAM(S)
Properties:
- exists only within the current sequence
- may consume one or more PARAMS depending on rubric
- may repeat
- does NOT begin or end a sequence
- is ignored for CORE FORM determination except for lokey placement
Parasequences are serial, not nested,
EXCEPT for explicitly allowed special cases (e.g. stepdown).
7. VARIABLES
------------
A VARIABLE is any PARAM that is:
- not a keyword
- not a lokey
Variables are opaque strings and may contain any content except "::".
7a. CSV VARIABLES
-----------------
Some variables may be interpreted as CSV if required by the keyword rubric.
CSV-ness does NOT affect core form.
A CSV with no commas is valid and fills only the first field.
8. CORE FORMS
-------------
Each keyword defines one or more CORE FORMS.
A CORE FORM is identified by:
- the keyword
- the COUNT and PLACEMENT of VARIABLES
- the PLACEMENT (not identity, order, or serial count) of LOKEYS
Important rules:
- Lokey identity is ignored in core-form uniqueness
- Multiple lokeys collapse to a single "L" marker
- Variables do NOT collapse
- Variable count and order are preserved
- CSV variables are still variables
- Parasequence-internal params are ignored
Examples:
Explicit params → Core form
---------------------------
place,lok,var,var,lok → P,L,V,V,L
place,lok,lok,var,lok → P,L,V,L
place,var,var,lok,var → P,V,V,L,V
place,var,lok,lok,var → P,V,L,V
9. INTERPRETATION MODEL
-----------------------
- Parsing is forward-only.
- Interpreter may look ahead to disambiguate core forms.
- Once a sequence is committed, no backward inspection occurs.
- Interpreter maintains accumulated state (trees, tables, flags).
Recursive lookahead is allowed.
Backtracking is not.
10. SITE HIERARCHY (ON vs IN)
----------------------------
10a. SITE TREE
--------------
The interpreter maintains a SITE hierarchy tree.
Nodes represent locations the player can be ON.
10b. place (ON the site tree)
-----------------------------
Keyword: place
Semantics:
- resolves or creates a node ON the site tree
- establishes the current SITE NAMESPACE
- may reference an existing node or create a new one
- persists until superseded by another place sequence
place does NOT:
- move the player
- imply traversal
- track player position
It defines structural context only.
10c. placedef (IN a site node)
------------------------------
Keyword: placedef
Semantics:
- defines or references an object IN the current site node
- objects may be items, NPCs, doors, rooms, etc.
- may create child nodes if the object category implies containment
placedef NEVER changes the current site node.
10d. Doors
----------
A Door is an object defined IN a site node that enables traversal ON the site tree.
Special case:
door,Leave
means: connect to the parent node on the site tree.
11. CONTAINER KEYWORDS
---------------------
Some keywords define CONTAINER CLASSES.
Properties:
- define a bounded internal structure
- may be nested only via explicit closure
- otherwise behave as normal keywords
SPECIAL CLOSURE RULE:
If the exact param sequence appears:
::[container_keyword]::end
or
::[container_keyword]::exit
then the container keyword is reclassified as a LOKEY for that instance
and is used to close the active container.
In ALL other cases, the keyword starts a new sequence as normal.
12. SPECIAL KEYWORDS
-------------------
12a. act
--------
Keyword recognition rule:
Any PARAM beginning with "act" is treated as keyword "act".
Suffix (e.g. act1b):
- editor-facing label
- discarded by interpreter
12b. PRE-ACT AREA
-----------------
All content before the first act sequence.
Rules:
- syntax applies
- forward-only interpretation applies
- core-form restrictions are relaxed
- keyword dictionary may be extended
- interpreter assumes deliberate authoring
12c. form (pre-act only)
-----------------------
Keyword: form
Used to define global interpreter configuration
(e.g. currency names, suffixes, systems).
form is:
- valid ONLY in the pre-act area
- exempt from core-form restrictions
- interpreted entirely by interpreter-specific logic
12d. items (pre-act only)
-------------------------
Defines a global items table.
Uses lokeys:
fields
entry
If absent, interpreter auto-creates:
::fields::Name
12e. item
----------
Keyword: item
Form:
::item::[variable]
Semantics:
- appends an entry to the global items table
12f. Dynamic Tables (plural keywords, pre-act only)
--------------------------------------------------
If, in the pre-act area, a PARAM ending in "s" is encountered that is not
a keyword:
- it defines a new global table
- the plural form names the table
- the singular form is auto-added as a keyword
- the singular keyword behaves like item
Example:
::styles::Fighting Styles::fields::Name,Power,Speed::styles::end
Creates:
- table "styles"
- keyword "style"
12g. XXX
--------
Keyword: XXX
Semantics:
- null command / brick wall
- explicit sequence terminator
- editor safety mechanism
Valid ONLY in the pre-act area.
Has no semantic effect.
13. step
--------
Keyword: step
Represents an intentional player action.
May include:
- lokeys (move, convo, reward, result, etc.)
- multiple variables
- multiple stepdown parasequences
stepdown:
- is a lokey
- may repeat
- is the ONLY parasequence allowed to violate non-nesting rules
- represents lower-priority / assistive / spoiler guidance
- has no effect on core form
14. cutscene
------------
Keyword: cutscene
Represents a non-interactive narrative event.
May cause state changes but does not represent player intent.
15. trig
--------
Keyword: trig
Represents an interrupt-style annotation.
Properties:
- may appear anywhere
- consumes only its own sequence
- does not alter parsing context
- interpreter resumes prior interpretation state
Used for:
- trophies
- missables
- warnings
- counters
- annotations orthogonal to traversal
16. CASE SENSITIVITY
-------------------
Case is significant.
Examples:
door ≠ Door
npc ≠ NPC
17. INVARIANTS
--------------
- The language is strictly linear.
- Keywords always start sequences.
- Lokeys never start sequences.
- Variables are opaque.
- Core forms are short and stable.
- Consistency is guaranteed by syntax, not semantics.
- Semantic meaning is the interpreter’s responsibility.
END OF DEFINITION
===========================================================
If you want, next productive steps would be one of:
But at this point, the language is no longer fuzzy — it’s specifiable, and now it is specified.
M: i'm going to re-send what i've got so far, cut down to just the parts that i did to avoid clutter. do NOT use it to reshape your the formal definition you just gave; freeze that for the moment. the intent is to get you to extract as much from it the keywords/lokeys i've already defined, acknowledging that it is imperfect in its current state. then, once you've done that, look at the keyword list you've created and see if you can derive any existing core forms of each keyword. here it is: // // means comment, ignore the entirety of the rest of the line // OVERNOTE TO SELF: IF YOU'RE GOING TO RUN THIS THROUGH GPT FOR FORMALIZATION HELP, THAT MEANS: // DRIVING YOURSELF NUTS MAKING EVERYTHING 100% UNIFORM IS A USELESS FRUSTRATION // you get the concept in your head; if it's solid, GPT will be able to iron out the written wrinkles
// this whole thing is largely (initially) supposed to be an HTML pseudo-wrapper; that is, like markdown on wikis, it's supposed to be a quick clear way to indicate for a WHAQ specific content which is intended to be expanded to HTML according to what instructions are given; it's intended largely to allow easy creation/manipulation of pure TXT style stuff as is usually found in FAQs into a standardized setup; though maybe it's better to say that it's a little more potentially complex as a wrapper, because some labels are less intended for straight up search/replace reformatting, and more for non-linear processing-for-content-construction; but the final product is supposed to be linearly accessible, with any of the processed bits intended for supporting reference // honestly, while it might prove useful, part of this is just because i hate trying to use the </> keys while typing... // :: is a command separator; it linearly indicates an instruction, then the parameters/guidance/whatever; if the parameter is expected to be a keyword and actually is an expected keyword (two separate ideas, depending on user error), the next separator continues the pattern, either reading an expected keyword or just text as parameters - until the command sequence is finished, and the next entry becomes the initial instruction for another sequence; at the current time, all instructions take parameters, even if those parameters are moot or blank; in theory, comments could be made in blank situations, but it'd be advised against if just for clarity; if OCD or clarity calls for it, substitute an appropriate single word for the case, such as 'start' or even just 'blank' // keywords are subjective and flexible, particularly when used as parameters; for example, the term 'money' can be a keyword for 'form', but in any place calling for a parameter it is a valid entry, and should not cause any errors in interpretation // handlers should be as forgiving as possible unless collapse is imminent; for example, a non-keyword in a position requiring an instruction should be skipped, not kill everything; debug-handling would be nice, though
// inchoate, subject to modification or collapsing into another system; intended to indicate a kind of global constant, in this case what kind of prefix/suffix the game uses to indicate the common cash; needs expandability to handle situations with multiple cash type, like silver/gold/platinum or gold/resources // inchoate concept in response to multiple-cash-format issue: numerics attached to keywords indicate a subjectively defined array entry - allowing money1, money2, money3 to all represent money; if a keywords is used without a suffix, the handler assumes that the first entry is used - so in mono-cash systems, etc, money=money1=exactly what's needed ::form::money1::name::Gella ::form::money1::suffix::g
// items are any equipment; it's one of the few things so far that
hasn't suggested a need for a parameter or anything - inventories are
basic, I guess... // some keywords are containers - that is, everything
between the opening instruction and the second version with ::items:: //
table-like situations are defined by two internal instructions: 'fields'
defines the titles of the fields (and provide table headers), while
'entry' is a repeating instruction with a CSV defining the value for
each field; it can be accurately thought of at the moment as being
equivalent to 'th' and 'td' tags respectively; handlers should be able
to understand that a newline is not -required- at the end of an
instruction sequence - it's only there for legibility - but in general
whitespace formatting is shunned beyond using newlines
::fields::Item,Category,Effect ::entry::Heal Berry,Consumable,+200
HP::entry::Antidote,Consumable,cure
Poison::entry::Medicine,Consumable,cure Disease::entry::Violet
Rose,Consumable,cure Silence::entry::Heat Salve,Consumable,cure
Paralysis::entry::Long Knife,Equip-Weapon, ::items::end
// the primary walkthrough is defined by nested 'acts', the equivalent of a 'div' or 'p' tag; internal numbering for anchors is the current paradigm - anything beyond the word 'act' should be thought of not as an actual label, but only applicable in the code as a way of marking which 'act' instructions are paired with an 'act::end' instruction // 'act' uses whatever follows as the text intended for the section name, like an 'h1/2/etc' entry or other title heading formatting choice ::act1::I. The Festival // 'guide' is something like visible commentary, something a little bit less than the primary atom of a 'step' which someone would follow but still necessary; basically when the user might need to know something but it is more outside the narrative than involved with it ::guide::These first three chapters are a prologue that can be done in any order; this list is merely in order of first to last presented in-game. // i came back up to add this; it may be better to expand the syntax of 'guide' to allow situational placement/editing, but allowing some items to be labeled as being part of a high-level over-guidance section instead of limited to the location that generated it ::guide::The game manual can be found online, for example at archive.org; this WAQ assumes you know the interface or have access to the information in the manual. Item usage will be described when appropriate and not available in the manual (for example, the Heal Berry gives 200 HP when used, but neither the game or manual mentions this explicitly.)
// this is less than developed; i just realized a choice needed making; and since this is voluntary, it'll involve some methodology that i don't feel like handling right now ::selection::1a,1b,1c::
::act1a::A Wandering Youth // 'place' is a meta-container not necessarily associated with the transcription-to-readable-format; it is not necessary, and can span outside of the container in which it's initiated; it is intended to give a location for reference if someone is looking to backtrack or figure out where a particular step occurred // 'town' is a keyword for guiding 'place' - it does not necessarily correspond 1-to-1 with the idea of a town, but is simply what in a game could be called a locale: it could be a major city or a peaceful clearing; its primary defining/limiting factor (as opposed to, say, a 'dungeon') is that it is (at least initially) presented as a spot where the player interacts with NPC and won't have any fights; the definition is, honestly, potentially flexible - at the moment, it doesn't have enough attributes to be useful beyond labeling - but categorization helps with generating lists from the entire thing, at least // inchoate - maybe make it so that the instruction after 'place' is not a predefined keyword, but WHAQ defined categorization: so while one game has a soft definition of 'town/dungeon/etc', another would have 'arenas/routes/etc', where every category has the same base attributes and the distinction lies in how the game calls for it to be used; we're going to continue as though that's what will happen until we find out where it butts up against some usage problem // after the categorizing instruction, the following item in the sequence is the label attached to this 'place'; reminds me that the 'place' label probably should have its own internal labeling system, like with the 'acts', for internal handling and nest tracking ::place::overworld,Map // this was put in later, after the second step; the idea of being locked in requires a place to go when things are unlocked, at least in games with an overworld or hub // i may need to define a way for places to be defined later, with the assumption that the handler will shift it to the beginning and have it locked until it shows up in the linear progression ::place:🔒:town,Surf // most things that could be called a shop/vendor are not strictly necessary for production of a WHAQ, so the intent is to make it possible to format them to be off to the side and collapsed initially, opened only if the user wants to see them - hence the container methodology, separate from any actual steps // a use for the 'place' instruction, but not necessary for creation; a shop may be associated with a particular location, but one can be created in the walkthrough without requiring a location, with the assumption that in that case the location of the shop definition in the actually-required 'act' structure is sufficient to convey where the shop is located // the parameter after the instruction (I really to formally define a shorter term) is just the name of the shop; formatting should make it easily identifiable, whatever the presentation paradigm ::shop::Surf Village Shop // 'shop' is a container instruction that implements the 'items' methodology of being defined by 'fields' followed by 'entry' ::fields::Item,Cost ::entry::Heal Berry,20::entry::Antidote,50::entry::Medicine,50::entry::Violet Rose,50g::entry::Heat Salve,50g::entry::Long Knife,120g ::shop::end
// now we're getting to what's currently the most crucial and fluid part of the definition... // we're trying to strip all the color off of the original version; especially in a lot of the older FAQs, the creators were creative - or at least verbose - and it could almost turn into story telling, impressive when done well - and exactly what we're trying to avoid; we want uniformity, simplicity, even automate-ability if it gets there; everything should be boiled down to nothing but what's barely required to make sure the experience is as uniquely experienced as possible // compared to that, all the other stuff was easy-peasy; I likely could do the editing for that in my sleep, or at least just after I woke up
// the atomic bit of a walkthrough is going to be defined as a 'step' instruction; it will be followed by a sequence of keywords, or keyword/parameter pairs (comma separated), a sequence whose final entry is defined by when a keyword isn't there - so maybe we visualize it as '::step(::keyword|keyword,parameter...)::associated text' if we use a bastardized form of regex representation // the keywords for a 'step' should be structurally definitive - a 'step' might be though of as being an attempt to reverse engineer a madlib or something; the ideal language wouldn't even need the 'associated text' except for debugging - it would be able to build a formulated instruction from what was given by the keywords // there needs, i think, to be a layering substructure defined in the 'step' instruction, used like this - ::step(::[keyword sequence])::stepdown(::[keyword sequence])*::[lower text]::[primary text] // 'stepdown' is used when the primary text may, depending on the player and situation, not be as specific as is necessary - like in a puzzle situation; it follows the same structure and uses the same keywords for situational definition as 'step', but it is intended to be formatted to be hidden or otherwise indicated to be more information than some players might want, even if some might need it // as a pseudo-coded example, if there was a relatively simple puzzle, it might look like - ::step::[puzzle indicators]::stepdown::[any additional indicators]::Push the red button, then the blue button.::Use the command console.
// one key thing as we're developing the language is to be specific about what the player should get when from where and who; a lot of walkthroughs are tied to making sure you pick up everything, or at least know they're there, or hit ever chest or whatever // my initial impulse is to have a 'collect' keyword - implement in a way such as ::collect(::category)?(::location::[location specifics])?::[descriptor] // so an example would be - ::collect::coins::location::Above the entrance portal::500; or if specifics are unnecessary in a step, ::collect::chest::5 Potions // it may need reconstruction as we take a first run at things; at the moment, I think it needs to be able to create a handler-traceable category (for stuff like special chests) and and indicator of what it is, along with the ability to add a descriptor for the stuff that is just hanging around in the overworld or otherwise a bit more specific // 'collect' should be, at least at the moment, thought of as being a 'step' related keyword - although it may be expandable to other instructions; the point is that at this point, I see no situation in which a collectible can exist without being tied to a location, act, or step // when associated with a step as a reward, items should maybe become 'result' or 'reward'... working on that in terms of syntax...
// this is going to be comment-laden and ugly as we try to build a 'keyword' structure from what we run into and generalizing... // for this practice run, I'll be leaving some form of the content of the original FAQ, then trying to construct a new step from it depending on what's already established, expanding or refining as necessary; that means there might be a bit of ugliness or inconsistency, keep that in mind when re-reading or testing; if something is introduced, I'll explain what's going on as best I can
// side note - trophies; this is, I believe, a direct port - but it -does- have trophies; other games will as well - and WHAQs are supposed to handle those too, especially the ones that have ridiculously specific requirements // proposal - 'trophy' keyword, complete semantics TBD because the trigger/causality can vary from a specific act to a complete game completion to an ongoing count; initial descriptor is - ::trophy(::system::[what system(s)]::[what trophy value])?(::[keywords/parameters])*::[trophy name] // the mechanics will parallel what's developed for the 'collect' instruction - that is, it'll be able to attached to a parent instruction; the difference is that some of the more vague trophies might require an independent existence, such as a 'beat the game on Hard' trophy; a WAQ should not necessarily try to be canonical about trophies, though - only specific enough to deal with situation specific trophies, not body counts or playthrough counts
// i'm not sure how i want to handle cutscenes; they should be indicated, but aren't exactly a 'step' ::cutscene::The player character is tending horses. // --Your boss comes over to tell you it's quitting time, and he asks your name (Select any name you wish, but I will be using the default name Rudy). /You get a Heal Berry as payment for your work, and your boss tells you to go talk to the mayor. // first minor note: the guy actually stands still; this is a demonstrable example of how old FAQs sometimes went for prose over accuracy to tell a story; again, admirable but not what we're doing here // so I haven't formalized it mentally, but I think that most narrative sequences in games can be defined by a maximum of, like, three categorical adjectives; so i'll be trying to formalize that on the fly // note spawned from previous line: remember that in some games what is 'default' is itself contingent on what's going on in the game - like when an RPG pops up a battle screen and the controls change; this needs to be handled if the terminology indicates it's necessary to be clear // in this case, you can run around a fenced in area and do anything you want (tho with very few options) with complete game level control (as opposed to some games which will eliminate or filter various functions); in theory, if there were a way to kill yourself, you could do it before the game began; I mention this bit because I would call it as a descriptor adjective 'full', but I'm going to call 'game full' the default state of a situation - any subtraction (or maybe even addition) is a modification from this; only noting it in case it actually becomes necessary to use explicitly // so control ability might be one category; another might be 'area restriction' - right now it's complete freedom in a restricted area, but other times it might be limits/lock-offs in an otherwise complete map // we're going to initially look at things as being a narrative bottleneck; in a more broadly described sense, you could say the game world has a door that can only be opened by interacting, and/but the interaction moves the narrative forward, defining a new game section (in narrative terms, not the walkthrough's 'act' structure); that means that the step would need to indicate a game world state change, a narrative door, a conversation, and a direct item reward... oh, and a special case of 'renaming' which is up for semantic grabs - it happens often enough that it shouldn't open up the idea of a 'one-off' instruction, but rarely enough that refining it isn't possible with a sample size of one // another side note: 'narrative time' is importantly separate from 'walkthrough time' because they are affiliated but not qualitatively the same; it needs to be acknowledged and track because, for instance, a particular trigger may not change the way the player is shown the game, but could easily alter the NPC conversations available - indicating that track it is important; ...as I think about it, maybe the two could be mixed - but I -choose- not to because the 'act' structure is important no matter how you play the game, while the 'narrative time' is more connected to optional items; in terms of constructing the WHAQ, the acts are needed for formatting, while the narrative stuff can be tacked on // ::place::area::Stable // new bits of language - ::convo::[name/identifier] // ::reward::item[,item2,item3...] // instruction placement is important both for clarity and proper formatting; for example, the 'reward' is directly connected to finishing the conversation - if it had been given before the conversation, the 'convo' should have come after some form of indication that approaching/interacting with the character was the trigger, not the completion of the conversation; it's quibbling, but it's the kind of accuracy that will make the product look trustworthy and not glitchy // ...having said that, this -is- the first try and first pass - so be sure to review this if we ever finish // observation - a WAQ formatting handler could use any 'place' nesting with the 'convo' name to build a character list if/when a game needs it; that should be kept in mind for the other narrative containers, like 'act', particularly if uniqueness of identifiers become crucial - although maybe as an attribute instead of a label element depending on the circumstances // the 'reward' is not included explicitly in the description because the formatting should place this both separately from the actual guidance and optionally as a hidden item; future items will prompt reevaluation in details if not in nature, because we've still got key items and collectibles and other stuff whose display priority might be different to deal with... // building a language dictionary will be interesting, between the words that are keywords only in context, and the specificity required once a keyword has been identified, and the instructions which are kind of heterogenous in nature... whoof // ::place::area::Stable // ::step::convo::Employer::reward::Heal Berry::stepdown::Run around as much as you want - get to know the Menu and Pause Menu, fix the controllers and mapping, etc. - but in terms of the game, this is just a starting point.::Talk to the man by the barn door to register your name and proceed. (The default, 'Rudy', will be used to refer to this character through the WAQ.) // locations can be useful, but are often contextual and should be able to be locally defined // i can think of two paradigms off the top: screen based (north is up) and map based (north is fixed but the screen rotates), but more might pop up // coordinates come into play in modern games; older games need placement, and contextual indicators // i'm thinking that the place::area definition may be the baseline for a new assistant definition associated with 'place' definitions: 'placedef' // it would be attached to a place thusly - ::place(::placedef(::location::[syntax contextual and TBD])?(::[category])?::[name])(::[category])::[name] // this needs massaging; the nature of the 'step' instruction is such that finishing everything off with a variable text is okay, but this might need an endcap or the sub-places bleed into the final name/category combination; maybe something like ::([category],)*[name] for each place naming instance // the reason i'm thinking of this now is because the whole 'place' concept can be crucial for defining where stuff is, but difficult to apply // NPCs are a location specific special category... but maybe needs broadening as a concept... like, there's places you walk and stuff you walk to, and that would include NPCs... but NPCs sometimes wander, so maybe it is a subclass // thought - special place 'overworld' defined as being the highest hub/global map/whatever; it can be limited or segmented or otherwise split due to narrative location gating, but should not overlap; in theory it should be singular, though some games might break this, but from the WHAQ perspective it should be easily identified because we know all and know where the highest surface is that all the other locations live in // gonna rewrite the first stab at things... this might take a while to develop, huhn // i'm seeing a couple things; the handler needs to be able to able to understand that in terms of building a 'place tree' for any reason, that 'placedef' is contextually equivalent to any 'place' container; also, if an area is returned to, the handler/language needs to know that each structure must be unique in its full name - so in this case, there might be another town containing a Stable, but there can't be two Surf.Stable entries; and multiple references to the same location at different times should be understood to mean the same place (and time, for those games like Chrono Trigger where time becomes important) - labels should/must take this into account to be grammatically correct (although with the time stuff, it may be necessary to introduce parentheticals or a 3-tuple CSV to specify time periods when talking about the same place, instead of forcing parenthesis in a way that reduces user clarity) // not every tile needs to be incorporated or specified or located - just the areas that need guiding to; like an RPG like this doesn't need to clearly indicate every house, but in one where talking to everybody is required for a trophy it may become necessary to do so // locations should be able to handle appropriate keywords like 'wandering' or 'random' or 'limited random'; meaning that some NPCs might follow a route, or be found in a particular area but unpredictable, or randomly at one of five places, et cetera... the language doesn't need to be explicit about that right now - just aware it's coming and ready to handle it ::place::placedef::location::NE::npc,Employer::area,Stable ::step::convo::Employer::reward::Heal Berry::stepdown::Run around as much as you want - get to know the Menu and Pause Menu, fix the controllers and mapping, etc. - but in terms of the game, this is just a starting point.::Talk to the man by the barn door to register your name and proceed. (The default, 'Rudy', will be used to refer to this character through the WAQ.) ::place::exit // compass location is working fine in this instance, but there needs to be gradation or relative placement possible... like, in this case, 'east of the Stable' or '1/4 of the distance from the west of town, halfway from the north', or more easily interpreted but less user friendly, '.25W.5N'; this might be something to be incorporated later, once more examples are available to filter into a usable pattern // at the moment, 'convo' should only refer to an essential/trigger conversation // let's move on to the second step; at this point, the player has expanded from Stable to Surf... the default will be that leaving an area doesn't mean inaccessibility of the old place, but it should be indicated when exiting does close an area - i'm thinking the syntax should be - place::lockdown::exit - and if it's temporary, reopening can either be implicit by it being referenced in the WHAQ or explicitly with the instruction 'reopen'
// --Before you do that, explore town and talk with the people here. / Inspect barrels and throw small crates to find three Heal Berries, a Power Apple, Hardy Apple, and 28g. / Also take some time to check out the shop so you can buy some handy healing items. / Then head over to the mayor's house in the center of town, go upstairs, and talk to him. He'll reward you for a job well done with the Bombs tool. // we're going to say that the 'item' keyword (singular, not plural) is, at the moment at least, a placeholder keyword - it implies that this information would be moved into the actual 'items' list by the editor or handler, but for the moment that would be a derailing hassle; if it works smoothly, it may become officially part of the language, but for now it's a hack; its CSV format is parallel to the official 'items' structure ::item::Power Apple,Consumable,+1 Strength::item::Hardy Apple,Consumable,+1 Vitality // okay, i'm going to use 'placedef' independently here; a fully grammatically correct WHAQ might not use this grammar, but since i'm rewriting on the fly we'll allow it; maybe it would be better to allow this in the formal definition, with the understanding that if 'placedef' doesn't occur in a sequence beginning with 'place', it is referring to the furthest branch of the 'place' tree that it currently occupies; so in this instance it refers to Surf // i'd have to replay the game to correctly locate and associate each item with its container, which i'm not currently willing to do - so we'll be using a vague definition; but it should be acknowledged that if that information were explicitly given by the original FAQ, i'd be incorporating it somehow ::placedef::item,Heal Berry ::placedef::item,Heal Berry ::placedef::item,Heal Berry ::placedef::item,Power Apple ::placedef::item,Hardy Apple ::placedef::money,28 // as a note to self, one possibility for the final format of the WHAQ would be, instead of having a sub-entry for each step below its parent, instead make it so that if you click the step, the more explicit version -replaces- the original version // ideally, the final formal language would have a way to avoid being explicit in the step; that's for later, though, or for GPT to figure out // the item collection can happen up until the point that you leave the town; indicating this will be fun to figure out // i've been told that this game particularly has lots of script shifts and situations gated by narrative timing; not now, but once this walkthough has been handled, it might behoove the development process to look at the specific FAQs to see if the timing could be incorporated for the purpose of development/refinement/stress testing ::placedef::location::E::area,Mayor's House ::placedef::location::Mayor's House::level,2nd Floor ::placedef::location::Mayor's House.2nd Floor::npc,Mayor // currently understood that a 'Tool' is infinitely reusable; might need to get explicit at some point // i'm getting to the point where i'm understanding my syntax a bit more than i might record ::item::Bomb,Tool,Explosions ::step::convo::Mayor::reward::Tool.Bomb::result::Surf.unlock::stepdown::stepdown::You can break crates and search barrels to find 3 Heal Berrys, 1 Power Apple, 1 Hardy Apple, and 28g, up until the point you leave town; you also can visit the Shop for healing items. The next step in the story comes when you talk to the Mayor; he'll give you the Bomb tool.::Explore around town if you want to find some useful items; otherwise, talk to the Mayor in a house east of the stables.::Talk to the Mayor in a house to the East. // i'd like to find a usable terminology for the instruction that doesn't give too much away that indicates when i mean that something is imperative, or when it's like this case where the narrative requires the conversation but it's not as crucial to get it done as the current phrasing might imply. // this is where the whole idea of 'place' important starts getting fleshed out; the interaction is in a definite place, right, and the interaction opens the gate to the outside world... so that needs to be indicated somehow; but in terms of the WAQ to trace the player location, the limitation is different than the Employer interaction, the movement limitations aren't involved, so no explicit placement is required for the player themselves // i've inserted a new keyword, 'result'; rewards are what a player gets, results are the indirect stuff; i was going to say the previous conversation needed modification, but reflection says it doesn't - the Employer stands in the way of the exit, so the lock status of the Stable is moot; this method might allow narrative timing unlocks, we'll see // i think a fully developed language might allow non-linear additions of thing that maybe aren't ever directly referenced; i'm thinking of optional/side quests or easter eggs, where a conversation could be recorded at the end of the WHAQ but still be incorporated by the handler
// --Now, walk over to the stairs and someone comes barging in with news that a child has gone into the Berry Cave, which is full of monsters. / Knowing the right thing to do, exit the village, head south on the world map, and enter the Berry Cave. // okay, so this was location based - you try and leave, and instead it goes into a cutscene; we haven't handled cutscenes yet // if a cutscene changes venues or locks access, it should be possible to indicate using the established terminology; if it doesn't, it shouldn't be a concern, even if there is a localized shift, like going out of a house - unless the door locks behind you or something similar; point is, if you can easily return it shouldn't be necessary to trace the location (though later versions might allow for that) ::step::move::stairs::result::cutscene::A villager reports to the Mayor that a child has gone to Berry Cave::stepdown::When you try to go downstairs, a villager will report that a child has gone to the Berry Cave to the south::Go down the stairs to start a cutscene.
// this is where a trophy can happen in the PS5 version; you have to bomb the parrot; even in the original it still would have been funny to know attacking the parrot cause it to sic the chickens on you, so it's not meaningless; i'll worry about the syntax later, but it needs a placeholder :🏆:optional::ps5::Bomb the parrot. // i have a feeling that part of this development process will be getting GPT to pull together some enumerated sets and subsets // this is likely where at least one NPC conversation changes // i backtracked to add this - it gets explained later ::placedef::location::S::door,Leave ::step::move::Leave::Leave Surf. // now we exit and everything is wonderful ::place::exit
::place::location::Surf->S::dungeon,Berry Cave // this has me address a larger issue - most dungeons have separate rooms, so that's a given and the placement will have to be indicated in some way, but some town houses and areas also have that and should be addressed; it's why i used the term 'area' for the Mayor's House, because it's a softer definition instead of a hard shift of where the systems thinks we are // exits to each area need placement and linkage // so each room is a subject of Berry Cave and must be entered/exited; however, if there is backtracking it will be assumed that intermediate rooms will not need explicit specification and we just assume that the player will understand that as long as the step is explicit enough // i'm capitalizing the place names out of habit - it's choice, not requirement // 'door' is a variable category; it indicates anywhere that there's an actual shifting of place; its name is explicitly the place it will take the player to, with 'Leave' explicitly meaning an exit from the dungeon // --First pass through the entranceway of the cave past the guard. ::place::placedef::location::S::door,Leave::placedef::location::N::door,Room2::placedef::npc,Guard::room,Entrance ::step::move::Room2::stepdown::Go north, past the guard.::Go through the entrance.
G: Good — this is a clean task now, and I’ll do it exactly as requested:
I will not propose new syntax or fixes here.
These are params that clearly function as sequence starters in your text.
form (pre-act only)itemsitemact (including act1,
act1a)selectionplaceplacedefshopstepcutscenetrophyguidestepdown (special-case lokey, but still observed as
keyword-like in usage — see note below)endexitNote:
end/exitare not standalone keywords in the general sense, but are clearly being used as container-closure params tied to a container keyword (items,shop,place). I am listing them here only for completeness.
These are params that modify a sequence, do not start new sequences, and recur across keywords.
fieldsentrylocationlockrewardresultconvomoveoptionalsystem (implied via commentary; not fully
instantiated)stepdown (explicit special case: nesting
allowed)stepdown is explicitly exceptional: it
behaves as a lokey but allows nesting and multiple variables.lock behaves as a lokey under place.location is a lokey that frequently introduces
parasequence variables.These are data, not structural operators. They do not affect core-form identity beyond counting as variables.
Examples (non-exhaustive):
overworld,Maptown,Surfdungeon,Berry Cavearea,Stableroom,Entrancenpc,Employernpc,Mayordoor,Leaveitem,Heal Berrymoney,28NEESNSurf->SHeal BerryBombTool.BombPower AppleHardy AppleNone of these are lokeys; they are variables, sometimes CSV variables.
This is the critical section.
I am applying your corrected rules exactly:
I’ll use shorthand:
K = keywordL = one-or-more lokeysV = variableformObserved instances:
::form::money1::name::Gella
::form::money1::suffix::g
Params (abstracted):
Core form:
form,V,L,V
itemsOpening:
::items::
Closing:
::items::end
Observed core forms:
items
items,L
(end treated as special closure lokey per your
rules)
itemExamples:
::item::Power Apple,Consumable,+1 Strength
::item::Bomb,Tool,Explosions
Params:
Core form:
item,V
actExamples:
::act1::I. The Festival
::act1a::A Wandering Youth
Interpreter sees:
actCore form:
act,V
guideExamples:
::guide::These first three chapters...
Core form:
guide,V
selectionExample:
::selection::1a,1b,1c::
Params:
Core form:
selection,V,V
placeExamples vary substantially.
::place::overworld,Map
→ place,V
::place::lock::town,Surf
→ keyword, lokey, variable
→ place,L,V
::place::exit
→ keyword, lokey
→ place,L
::place::placedef::location::NE::npc,Employer::area,Stable
Params:
So core form of place here is
still:
place
(Subsequences handled independently)
placedefObserved in many forms.
::placedef::item,Heal Berry
→ placedef,V
::placedef::location::E::area,Mayor's House
Params:
Core form:
placedef,L,V,V
::placedef::location::Mayor's House::level,2nd Floor
Still:
placedef,L,V,V
shopOpening:
::shop::Surf Village Shop
→ shop,V
Closing:
::shop::end
→ shop,L
stepThis is the richest keyword.
Example (simplified):
::step::convo::Mayor::reward::Tool.Bomb::result::Surf.unlock::stepdown::stepdown::[text]::[text]
Params abstracted:
Collapse lokeys, preserve variables and placement:
Core form:
step,L,V,V,V,V,V
Other step example:
::step::move::Room2::stepdown::Go north...::Go through the entrance.
→ keyword, lokey, variable, lokey, variable, variable
Core form:
step,L,V,V,V
So step clearly supports multiple distinct core
forms.
cutsceneExample:
::cutscene::The player character is tending horses.
Core form:
cutscene,V
trophyExample:
::trophy::optional::ps5::Bomb the parrot.
Params:
Core form:
trophy,L,V,V
Without reshaping anything:
placedefplacestepMost importantly:
Nothing here violates your formal definition.
The sample is imperfect, but it is internally consistent enough to extract grammar from, which is the real test.
If you want, next we can:
But per your instruction, I’ll stop here.
M: okay, next time we've gotta get the 'core form' stuff nailed down. the 'step' keyword form isn't actually rich - but i may have given you room for a misapprehension. variables only count for a core form -when they aren't part of a parasequence-. you hit the lokey identification correct for the really long one - but missed seeing that each of the variables after them is the endcap of a two-param parasequence. so in analyzing the core form, the parasequence members are discarded along with the identity of the lokeys - so we end up with a transitional form of step,L,L,L,L,L,V, which collapse to step,L,V.
G: Got it — that’s a clean correction, and it explains exactly why my “step looks rich” read was wrong.
What I need to lock in (for next time, when we formalize it) is this rule:
step, the things I treated as “top-level variables”
were actually parasequence endcaps (the “value” side of
each lokey), so they get discarded from core-form accounting along with
the lokey identities.So for the long example:
::step::convo::Mayor::reward::Tool.Bomb::result::Surf.unlock::stepdown::stepdown::[text]::[text]
Top-level structure is effectively:
step (keyword)convo + endcap (“Mayor”) -> parasequencereward + endcap (“Tool.Bomb”) -> parasequenceresult + endcap (“Surf.unlock”) -> parasequencestepdown + endcap (“[text]”) -> parasequencestepdown + endcap (“[text]”) -> parasequenceSo at the core-form layer:
LTherefore the core form becomes:
step, L, L, L, L, L, V? (depending on
whether step itself still has a terminal top-level variable outside
parasequences in a given instance)step, L, V (as you
stated)And in this specific instance, it sounds like even the “V” may be
only present if there’s a true final non-parasequence endcap, otherwise
it’s simply step,L or step depending on the
rubric. Your example’s point stands either way: it’s not
rich.
Also: this implies my earlier core-form extraction needs a new classification pass where I first answer:
So the missing piece isn’t “core form math,” it’s “parasequence arity,” because that determines what is top-level vs internal.
One Japanese line, per your standing rule:
That’s all consistent with what you said.
M: i think that it might be necessarily state that, for the special case of 'stepdown', the parasequence collapse includes the nested version, just for completeness. and in specific terms, you weren't exactly WRONG with what you had, but on the edge of it: i think i'd said during syntax definition that single-params were rare, or something like that - but i also didn't mention it during the formal definition bit, so without a larger sample your assumption of single-param parasequences wasn't out of nowhere.
G: Yes — that lands exactly where
it should, and your framing is right: this isn’t a correction
so much as a necessary completion of the rule set once
stepdown exists.
Let me restate it crisply, in your language, without drifting into redesign.
stepdown as a formally special parasequenceWhat you’re proposing is not a semantic exception but a core-form accounting exception, and it’s a sensible one:
stepdown is a lokeystepdown may neststepdown content — including:
stepdown parasequencesSo even if you have:
::step
::stepdown
::stepdown
::stepdown
::[text]
::[primary text]
From a core-form perspective, that entire tower still contributes exactly one “L” marker, and zero variables, unless there is a true top-level variable outside all parasequences.
That keeps step core forms stable and prevents
informational depth from inflating structural identity.
You’re also right about this part, and it’s worth explicitly acknowledging because it affects how future readers will misread the system:
So my earlier model wasn’t wrong, it was underspecified in the same place the language itself was underspecified.
What you’ve just done is close that gap.
This is the rule you’ve now implicitly defined, and it’s a good one:
Core forms only count params that belong to the parent sequence.
Any param consumed by a parasequence — including nested parasequences — is invisible to core-form determination.
And for stepdown specifically:
stepdowndefines a parasequence scope that is fully opaque to core-form accounting, even when nested.
That’s it. No contradiction with anything earlier, just an explicit edge-case rule.
This rule:
stepdown
perfectly: more help, not more structureIt also means step really does collapse to something
like:
stepstep,Lstep,L,V…which is exactly the “madlib skeleton” you were aiming for all along.
One Japanese line to mark closure, per your standing rule:
We’re now at the point where “nailing down core forms” is no longer conceptual — it’s just enumeration and edge-case bookkeeping next time.