Post by ano on Aug 24, 2015 21:42:57 GMT -5
**EDIT**
Moving forward, you no longer need to write your submissions in the proper pseudo-code.I instituted it under the misguided assumption that people would be a lot less averse to code than they actually are. We are currently working on a program that will enable everybody to write events and quests much like a text editor, which will make the process as lot easier.
Until then you can write submissions however you like, and feel free to use this post as just a guideline to understand what is and what is not possible in the game right now, events-wise.
**/TRANSMISSION OUT**
Hello everybody!
Since this project began, many of you might have found yourselves wondering:
"How do I even make a submission?"
Well, the answer is simple, though probably more complex than you expected.
Will you have to learn programming to do this? No, but we have a very specific synthax that our program will look for so that it can automatically add your submissions to the game. This allows us from having to take programmers from other tasks to do the monotous task of coding submissions in individually.
Besides that we expect you to handle a few organizational elements in with all submissions. We need you to write an index, summary and a list of characters and items involved in your quest.
Tutorial
First things first
First you must have your encounter in mind. Having it written as well is a good idea too. This system is supposed to allow you to do whatever you want, not constrain your creativity. So first write what you want to do, and then work on figuring out how to do it.
If you ever need help, we are just a PM away, and we are here for nothing other than to help.
Before you begin
Summary
Write a quick summary describing what happens in your quest/event.
List NPCs Involved
Make a quick list of the main NPCs involved in your quest/event. You can come up with as many as you like, but if you are using a preexisting one, make sure to respect their chronology.
List Items Involved
List all the items involved in your quest/event. Be they required items, sought after items, rewards or even temporary items used through the duration of your event.
Quests or Events?
First, you must choose whether you want to make a quest or an event. An event is a random singular encounter, found while roaming the world.
Quests, must be given to the player by some world entity, be it an NPC or just an object like a notice board. Quests are also different from event in that their can be multi-part and they are consistent in how they are obtained.
Event("Title", timeFrame, map, area, frequency){body}
The EVENT tag means that the following body represents an event.
TITLE represents just what it means. It is the name by which the program will represent your event.
TIMEFRAME represents the space of time in a 24 hour day in which the event will be available to happen.
MAP represents the map where the chosen area is located. Currently our game has only the world map, but eventually we will have specific maps for cities, dungeons and special places.
AREA represents where the event can be found. You can use either a tag name to have the event show up randomly in the selected area, or you can use a single slot from our 100x100 map. The current available areas in the game are: MainCity, Farmlands, Savannah, Hills, Beach, Port, CityRiver, MainRiver, NorthRiver, Swamp, Lake, Forest, ForestCity, Desert, DesertCity, Oasis, Island, IslandCity, IslandBeach, Mountain, MountainCity.
FREQUENCY represents how often that event occurs when the player enters a valid space from 1 to 100%. It will probably be changed when we include it in the game, but you are free to suggest one.
Quest("Title", timeframe, map, area, giver, phases, encounter){body}
The QUEST tag means that the following body represents a quest. Quests have a lot in common with events, except that their frequency is always 100 for their chosen slot, and they can have multiple steps to completion.
The first four parameters are the same as they would be for Events.
GIVER represents the name of the world entity that starts this quest. Right now it doesn't do much, since we expect you to create most of the NPCs at this point, but as our repertoire grows, it will help signify when multiple quests are being offered by the same entity, like MainNoticeBoard.
PHASES represents how many steps this quest will have. Think of these as different tasks within a single storyline.
ENCOUNTER represents the phase of the quest you are currently in. Later on we might have quests that branch depending on whether you succeed or fail at a particular phase, but so far encounters can only be followed linearly.
{Body}
The body represents the meat of the event. It has everything that happens in it, from the tests, to the branching conversations, and it is always denoted between {}.
{:1: "text" button(btnText, branch), button(btnText, branch), button(btnText, branch)./
:11: "text" go(branch)./
:12: "text" END./
:13: "text" END./
:111: "text" go(branch)
:1111: "text" END./}
The first thing you might notice are the numbers between colons. Those numbers represent the branching paths of an event's outcome and they teach the program where to go in accordance to the player. Every branch number is formed by their parent's number, followed by a new one that in unique to that branch.
All events must either end in go(branch)./, button(text, branch)./ or END./
go(branch)./ means that if a test in the branch body does not succeed, it is supposed to load the specified branch.
button(text, branch)./ tells the program to, instead of moving automatically to another branch, it should wait for the player's input, and go to the branch associated with the pressed button. The text parameter refers to the text that will be displayed on the button. Please mind that this should be as short as possible in order to be properly displayed on the button.
END./ means that the current branch ends the event/quest.
Please make sure to always add go(branch) or END./ to the final branches of your event, so that the player doesn't get stuck in it.
All text and tests in a branch must be added between quotation marks. In case you want to add quotation marks in your text itself, all cases of ^ will be automatically turned into " after the processing. Additionally, if you need to use line breaks, you should append \n (backslash, not forward slash) to the end of the preceding line. If you want to make a test, prior to the event start you can add it in a branch without any accompanying text. Since tests and commands are invisible, the player will see nothing except for the outcome of said test.
Tests & Commands
Commands and tests are functions that can be called in an event to either branch the current event or modify the player or world around them. All commands must be written within [], and are completely invisible to the player, so make sure to make any tests or changes clear to the player in the text itself! Here is a list of all tests and commands currently implemented in the game.
Commands
go(branch)
Loads the specified branch.complete()
Marks the current encounter as completed, so that the game will now only load the following encounter with the same name.add(item, amount)
Adds the specified item to the player's inventory in the specified amount.remove(item, amount)
Searches the player's inventory for the specified item. If found, removes the specified amount.equip(item, slot, R/K)
Equips the selected item to the specified slot(head, torso, legs, feet, mainhand, offhand). If there was an item already equipped, R/K decides what to do with it, either removing it or keeping it and moving the item to the player's inventory, respectively.teleport(map, target)
Teleports the player to the specified location(100x100) in the map.startQuest(target)
Starts chosen quest. Useful for when you want to embed a quest into a random event or another quest. Quests started by this method ignore the location restrictions and go straight to the main body. Keep in mind that this will stop your current even or quest and start a new one.button("text", branch)
Creates a button, and makes the whole scene wait for the player input. The pressed button dictates which branch is loaded next. The last button should always end in ./Modify Commands
mStr(target)
Sets the player's Strength to the target amount. You can also use +number and -number to change the current value by the specified amount.mAgi(target)
Sets the player's Agility to the target amount. You can also use +number and -number to change the current value by the specified amount.mVit(target)
Sets the player's Vitality to the target amount. You can also use +number and -number to change the current value by the specified amount.mInt(target)
Sets the player's Intelligence to the target amount. You can also use +number and -number to change the current value by the specified amount.mDex(target)
Sets the player's Dexterity to the target amount. You can also use +number and -number to change the current value by the specified amount.mHealth(target)
Sets the player's current Health to the target amount. You can also use +number and -number to change the current value by the specified amount.mAP(target)
Sets the player's AP to the target amount. You can also use +number and -number to change the current value by the specified amount.mCapacity(target)
Sets the player's current Capacity to the target amount. You can also use +number and -number to change the current value by the specified amount.mFat(target)
Sets the player's Fat to the target amount. You can also use +number and -number to change the current value by the specified amount.mExp(target)
Sets the player's Experience to the target amount. You can also use +number and -number to change the current Experience by the specified amount.mGold(target)
Sets the player's Gold to the target amount. You can also use +number and -number to change the current value by the specified amount.mHeight(target)
Sets the player's Height to the target amount. You can also use +number and -number to change the current value by the specified amount.Test Commands
tStr(target, branch)
Tests the player's Strength. If it reaches the target value, loads the specified branch.tAgi(target, branch)
Tests the player's Agility. If it reaches the target value, loads the specified branch.tVit(target, branch)
Tests the player's Vitality. If it reaches the target value, loads the specified branch.tInt(target, branch)
Tests the player's Intelligence. If it reaches the target value, loads the specified branch.tDex(target, branch)
Tests the player's Dexterity. If it reaches the target value, loads the specified branch.tCurHealth(target, branch)
Tests the player's current Health. If it reaches the target value, loads the specified branch.tMaxHealth(target, branch)
Tests the player's max Health. If it reaches the target value, loads the specified branch.tCurCapacity(target, branch)
Tests the player's current Capacity. If it reaches the target value, loads the specified branch.tMaxCapacity(target, branch)
Tests the player's max Capacity. If it reaches the target value, loads the specified branch.tAP(target, branch)
Tests the player's current AP. If it reaches the target value, loads the specified branch.tFat(target, branch)
Tests the player's Fat. If it reaches the target value, loads the specified branch.tLevel(target, branch)
Tests the player's Level. If it reaches the target value, loads the specified branch.tGold(target, branch)
Tests the player's Gold. If it reaches the target value, loads the specified branch.tHeight(target, branch)
Tests the player's Height(metric). If it reaches the target value, loads the specified branch.tAtk(target, branch)
Performs a test attack with the player's main weapon. If it reaches the target value, loads the specified branch.tMaxAtk(target, branch)
Calculates the maximum possible attack value of the player's main weapon with the player's current stats. If it reaches the target value, loads the specified branch.tDef(target, branch)
Performs a test deffence with the player's current armor. If it reaches the target value, loads the specified branch.tMaxDef(target, branch)
Calculates the maximum possible defense value of the player's armor with the player's current stats. If it reaches the target value, loads the specified branch.tAccuracy(target, branch)
Tests the player's Accuracy. If it reaches the target value, loads the specified branch.tDodge(target, branch)
Tests the player's Dodge. If it reaches the target value, loads the specified branch.tComplete(target, encounter, branch)
Checks to see if the chosen encounter of the specified quest was already marked as complete, if so loads the specified branch. You can use "any" to refer to any encounter of the chosen quest.tItem(target, amount, branch)
Searches the player's inventory for the specified item, if the item is found in at least the specified amount, loads the specified branch.tEquip(target, slot, branch)
Searches the chosen equipment slot(head, torso, legs, feet, mainhand, offhand) for the specified item. If the item is found, loads the specified branch.tTotalweight(target, A/E, branch)
Sums the player's body weight and their equipment then tests the result. A/E especifies whether the rest of the inventory is added to the sum. If it reaches the target value, loads the specified branch.Wrapping it Up
Finally, never for get to review! Make sure your syntax is properly written, your grammar is spot on, and all your content is in accordance with the Bane of Gluttony Rules and Guidelines. After that, PM me the submission with the [Event Submission] tag, followed by the title of your submission.
I will send you a response to confirm that I received your entry. It will then go through our review process and in a few days I should respond to your PM again either to inform you that you are in or to suggest a few modifications to your entry to make sure it is up to standard. If you want to send another submission, please send it in another PM, titled appropriately, so that we can keep things organized. For more information on what makes a good entry, please head to our Bane of Gluttony Rules & Guidelines.
Example
By droark
"Blade and Belly"
What the above does is create an Event called Blade and Belly Random that can occur between 10 AM and 8 PM on the WorldMap in the MainCity area, with a 25% chance of occurring when the player moves to a MainCity tile. Since it is an event, it is not multipart. Basically this event exists only so that the player can stumble upon the quest by chance while wandering through town.
Now lets see what I did here. First, since this quest is only started specifically by our previous event, the location on it's tag is irrelevant, I put it on a spot at the edge of the map so that it wouldn't accidentally come up. Then, I opened the quest giving the player two options to choose from, each one branching the quest to the appropriate response. When the player chooses to help Shara we add complete(), which means that we completed the first step of this quest, and now next time we show up the game will know we are at encounter 2 of this quest.
Now, the first thing we do is test if the player has or not the quest items. We write nothing on the first branch so that we can test it without displaying anything to the player. If the player does not have the haunches, we change nothing as Shara keeps waiting for the player to deliver on their promise. If the player comes back with the haunches, we give them gold and experience by using modify commands and then we set this encounter as complete. That means that the game will no longer display any "Blade and Belly" event or quest except if it finds one phase at 3(which we haven't written yet.).
"Blade and Belly"
Event("Blade and Belly", 10-20, WorldMap, Maincity, 25)
{:1: startQuest("Blade and Belly") END./}
What the above does is create an Event called Blade and Belly Random that can occur between 10 AM and 8 PM on the WorldMap in the MainCity area, with a 25% chance of occurring when the player moves to a MainCity tile. Since it is an event, it is not multipart. Basically this event exists only so that the player can stumble upon the quest by chance while wandering through town.
Quest("Blade and Belly", 10-20, WorldMap, 100x100(irrelevant), Shara, 2, 1)
{:1: "As you step over the rough cobblestone, your head aching and rubbing the sleep from your eyes, you hear a quiet sobbing from around the corner. Do you approach the voice?" button(Yes, 11), button(No, 12)./
:11: "Whomever it is that is crying, they need help. You rush around the corner and nearly collide with a rather plump mouse as you do so. She gasps momentarily, before ducking her head down and wiping the tears from her snout.
^,Please forgive my good [sir/madam].^, She starts. ^,It’s just… I’m so hungry. I have had nothing to eat since second lunch, and I fear I may die of hunger!^, Looking over the woman, you note that she isn’t wasting away in any sense of the word. Rather, she appears to be quite overweight! Her hips are starting to fray the fabric of her plain dress, her belly seems to be stretching the threads to their limit, as you can see the downy white fur peaking through the strained garment. Finally, it appears that her breasts have made an impromptu window of the woman’s torso. ^,If it isn’t too much trouble… could you bring me some food? I don’t have money for the restaurant, but I have just enough for you to buy a simple weapon. There are an enormous number of boars that have cropped up just to the east of the city. If you could bring me five haunches of pork, I’d be ever so grateful!^, Her stomach grumbles, and she adds. ^,The faster, the better!^,
Do you accept?” button(Yes, 111), button(No, 112)./
:12: "You decide that you have enough problems of your own without having to deal with another’s at the moment. You continue on your way, the sobbing slowly growing fainter as you leave the corner." END./
:111: “She thanks you heartily, shaking your hand, the various fatty bits of her jiggling furiously as she does so. ^,Oh… I’m Shara, by the way.^, She blushes slightly, before handing you a handful of gold pieces. ^,The blacksmith is on the [direction] side of town, just [direction] of the [location]. This should be enough to buy a simple weapon to help you hunt. Thanks again!^ [complete("Belly and Blade")]" END./
:112: “She looks rather forlorn, her stomach growling again as she clutches it. ^,Well, thanks anyway. Have a good day, sir.^, She wipes her wet snout one more time before ambling away, quickly turning the corner as she leaves.” END./}
Now lets see what I did here. First, since this quest is only started specifically by our previous event, the location on it's tag is irrelevant, I put it on a spot at the edge of the map so that it wouldn't accidentally come up. Then, I opened the quest giving the player two options to choose from, each one branching the quest to the appropriate response. When the player chooses to help Shara we add complete(), which means that we completed the first step of this quest, and now next time we show up the game will know we are at encounter 2 of this quest.
Quest("Blade and Belly", 10-20, WorldMap, 59x46, Shara, 2, 2)
:1: "[tItem(PorkHaunch, 5, 12)]" go(11)./
:11: “As you walk around a corner you come across Shara, still quietly sobbing and holding her stomach, even as she eats what must not be her first meal of today. She whimpers a little as she notices you, but tries to smile, hopeful.
You really should go back to finding those haunches for her." go(1)./
:12: “Wandering through the streets of the city, it takes some time, and a bit of asking after her, but you finally find Shara as she is resting on a bench, next to the street. She perks up as she sees you, her eyes drawn to your bulging pack. She jumps up, rushing forward to greet you!
^,Oh, welcome back!^, She smiles, her face lighting up, though one hand seems to be constantly on her expansive gut. Her smile only widens as you give her the haunches of pork, ^,You’re a life saver, [sir/madam].^, She suddenly lurches forward, wrapping her soft arms around you and pulling you into a warm hug. ^, Unfortunately, I can only offer you my friendship and a few more gold pieces. But thank you! If I see you again, maybe I can hire you again! I’ve been so hungry these last few weeks, I wonder why…^, She looks concerned for a moment, before the bloody smell of the haunches reach her. ^,Whatever it is, I need to get these cooked! Have a good day!^, Quickly handing you another handful of gold, the rotund mouse ambles off, even the rather light haunches weighing her weak frame down as she hobbles away, her wide hips sashaying pleasantly as she does so.
[mGold(+3)][mLevel(+100)][encounterComplete()]" END./}
Now, the first thing we do is test if the player has or not the quest items. We write nothing on the first branch so that we can test it without displaying anything to the player. If the player does not have the haunches, we change nothing as Shara keeps waiting for the player to deliver on their promise. If the player comes back with the haunches, we give them gold and experience by using modify commands and then we set this encounter as complete. That means that the game will no longer display any "Blade and Belly" event or quest except if it finds one phase at 3(which we haven't written yet.).