Two questions for Quest veterans

So I'm working for a half year on my first idea. I restarted my project two times because I messed up...

My questions for the experienced Quest users/devs is,
how is your working-flow?
..and..
How do you keep the project organized?

For now I created some checklists with tiddlywiki parallel to my project.
I add all items, locations, NPCs, etc. into my personal wiki and create some check boxes to check for the tested and wished response.... after test play ...


(filler for getting my edited post, updated/posted)


well, there's OOP/OOD (Object Oriented Programming/Design), using encapsulation ("compartmentalization/organization", in quest: library files and Objects), for examples:

I like having one library file, be my omni-resource of notes, code, and etc, that I personally just use as a reference (NOT used as an actual library file used by a game file, and for copy-pasting of code from it into what-ever/where-ever it's to be used), for example:

resource_library_file.aslx

<library>

  <!--
  New Default Game Code
  -->

  <asl version="550">

    <include ref="English.aslx" />
    <include ref="Core.aslx" />

    <game name="NAME_OF_GAME">

      <gameid>SOME_RANDOMLY_GENERATED_HASH_STRING</gameid>
      <version>YOUR_GAME_VERSION_HISTORY_DECIMAL_NUMBER</version
      <firstpublished>CURRENT_YEAR</firstpublished

    </game>

    <object name="room">

      <inherit name="editor_room" />

      <object name="player">

        <inherit name="editor_object" />
        <inherit name="editor_player" />

      </object>

    </object>

  </asl>

  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Library Files
  -->

  <!--
  Default Engine and Language Library Files
  -->

  <include ref="English.aslx" />
  <include ref="Core.aslx" />

  <!--
  Custom Engine and Language Library Files
  -->

  <!--
  Custom Library files
  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Delegates
  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Templates
  -->  

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Objects
  -->

  <!--
  The 'game' Game Settings Object
  -->

  <game name="NAME_OF_GAME">

    <gameid>SOME_RANDOMLY_GENERATED_HASH_STRING</gameid>
    <version>YOUR_GAME_VERSION_HISTORY_DECIMAL_NUMBER</version>
    <firstpublished>CURRENT_YEAR</firstpublished>
    <author>NAME_OF_AUTHOR</author>
    <subtitle>SUBTITLE</subtitle
    <description>ONLINE_DESCRIPTION_OF_GAME</description>
    <category>CATEGORY_OF_GAME</category>

    <!--
    ETC built-in and/or custom ATTRIBUTES
    -->

    <attr name="start" type="script">
      // SCRIPTING
    </attr>

  </game>

  <!--
  Room Objects
  -->

  <object name="room">

    <inherit name="editor_room" />

  </object>

  <!--
  Player Objects
  -->

  <object name="player">
    <inherit name="editor_object" />
    <inherit name="editor_player" />
  </object>

  <!--
  Non-Player Objects
  -->

  <!--
  Item Objects
  -->

  <!--
  Usable Item Objects
  -->

  <!--
  Battle Item Objects
  -->

  <!--
  Quest/Special/Key Item Objects
  -->

  <!--
  Equipment Objects
  -->

  <!--
  Weapon Equipment Objects
  -->

  <!--
  Armor Equipment Objects
  -->

  <!--
  Clothing Equipment Objects
  -->

  <!--
  Spell Objects
  -->

  <!--
  Storage Objects
  -->

  <!--
  Exterior Objects
  -->

  <!--
  Interior Objects
  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Object Types
  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Turnscripts
  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Timers
  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Verbs
  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Commands
  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Functions
  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Systems
  -->

  <!--
  Leveling System
  -->

  <!--
  Combat System
  -->

  <!--
  Equipment System
  -->

  <!--
  Magic System
  -->

  <!--
  Stealth/Detection System (stealing/planting, sneaking, etc)
  -->

  <!--
  Transaction ("shopping") System
  -->

  <!--
  Item System
  -->

  <!--
  Diplomacy (Dialogue/Conversation/etc) System
  -->

  <!--
  Record (Journal/Note-Taking) System
  -->

  <!--
  Storage System
  -->

  <!--
  Date and Time (and etc) System
  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Attributes
  -->

  <--
  Boolean Attributes
  -->

  <--
  Integer Attributes
  -->

  <--
  Double (Decimal numbers: Floats / Floating-Points) Attributes
  -->

  <--
  String Attributes
  -->

  <--
  Object Attributes
  -->

  <--
  List Attributes
  -->

  <--
  Dictionary Attributes
  -->

  <--
  Inherited Attributes
  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Game Mechanics (Equations/Formulas/Etc)
  -->

  <!--
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  -->

  <!--
  Personal Notes and Etc
  -->

</library>

and then you can have library files as encapsulation:

combat.aslx
magic.aslx
fire_spells.aslx
player_objects.aslx
non_player_objects.aslx
monsters.aslx
room_objects.aslx
items.aslx
equipment.aslx
weapons.aslx
swords.aslx
storage.aslx
etc etc etc


example of (how to) using library files and of a library file (a 'monster' library file):

example_game_file.aslx

<asl version="550">

  <include ref="English.aslx" />
  <include ref="Core.aslx" />

  <include ref="monsters.aslx" />

  <game name="NAME_OF_GAME">

    <gameid>SOME_RANDOMLY_GENERATED_HASH_STRING</gameid>
    <version>YOUR_GAME_VERSION_HISTORY_DECIMAL_NUMBER</version
    <firstpublished>CURRENT_YEAR</firstpublished

  </game>

    <object name="room">

      <inherit name="editor_room" />

      <object name="player">

        <inherit name="editor_object" />
        <inherit name="editor_player" />

      </object>

    </object>

  </asl>

monsters.aslx

(This 'monsters.aslx' Library File and any Library File, has to be in the same folder as your 'example_game_file.aslx' Game file, for quest to be able to find and use the library file within your game file)

<library>

  <object name="orc">
  </object>

  <object name="ogre">
  </object>

  <object name="dragon">
  </object>

  <object name="skeleton">
  </object>

</library>

here's an old resource of mine for content that's been on a long hiatus, lol:

http://textadventures.co.uk/forum/design/topic/3876/rpg-elements-game-mechanics-and-game-design

(I was just trying to put all of this various RPG stuff in one spot for me and others to use)


I put all rooms inside zones (which are just rooms the player cannot get to), to divide up different parts of the game. I use annotations (turn on on the Features tab of the game object) on each zone (and sometimes each room) to track what is going on there if complicated and to keep a "to do" list for the zone.


to provide an example of what Pixie is talking about with his 'zones' :

you can use Objects as Organizational Folders (this is what Pixie is talking about with his 'zones') for working within the GUI/Editor

(you can name/label them whatever you want, you don't have to name/label them as I do in this example post, lol)

my 'XXX_folder_object' Objects are just for my own (the game maker's) organization, they're NOT rooms/locations that the person playing the game interacts with

my 'country/colony' Objects ARE the locations that the person playing the game will go to interact with

also the 'players/npcs' are Objects the person playing the game interacts with as well, of course

<object name="world_folder_object">

  <object name="modern_earth_folder_object">

    <object name="europe_folder_object">

      <object name="united_kingdom">
        <inherit name="editor_room" />
        <!-- 'Exit' Element coding (I'm rusty and too lazy to look it up) -->
      </object>

      <object name="germany">
        <inherit name="editor_room" />
        <!-- 'Exit' Element coding (I'm rusty and too lazy to look it up) -->
      </object>

    </object

    <object name="asia_folder_object">

      <object name="china">
        <inherit name="editor_room" />
        <!-- 'Exit' Element coding (I'm rusty and too lazy to look it up) -->
      </object>

      <object name="japan">
        <inherit name="editor_room" />
        <!-- 'Exit' Element coding (I'm rusty and too lazy to look it up) -->
      </object>

    </object

  </object>

  <object name="mars_folder_object">

    <object name="colony_1">
        <inherit name="editor_room" />
        <!-- 'Exit' Element coding (I'm rusty and too lazy to look it up) -->
    </object>

    <object name="colony_2">
        <inherit name="editor_room" />
        <!-- 'Exit' Element coding (I'm rusty and too lazy to look it up) -->
    </object>

  </object>

</object>

<object name="character_folder_object">

  <object name="playable_character_folder_object">

    <object name="player">
      <inherit name="editor_object" />
      <inherit name="editor_player" />
      <attr name="parent" type="object">germany</attr>
    </object>

    <object name="player_2">
      <inherit name="editor_object" />
      <inherit name="editor_player" />
      <attr name="parent" type="object">colony_1</attr>
    </object>

  </object>

  <object name="non_playable_character_folder_object">

    <object name="npc_1">
      <inherit name="editor_object" />
      <attr name="parent" type="object">united_kingdom</attr>
    </object>

    <object name="npc_2">
      <inherit name="editor_object" />
      <attr name="parent" type="object">colony_2</attr>
    </object>

  </object>

</object>

I do it the old-fashioned way - paper-pencil.

I draw my map first with a general idea of the story-line and I start where the player starts and create scenarios as the player would encounter them. Also, by having the map drawn, it keeps the rooms in a relatively neat working order. It does require some jumping around in the event a flag was set in one room that requires correspondence in another room, or an item a player needs from one room 'down the road' that needs to used in a previous room. When I need to jump forward, I simply do that (since my map is already made) and create the flag scenario or drop the needed object in that room. On my map page I make note of set flags - what triggers it, what object it is on, and the name I have given it. Example... pushing green button, bad guy number 1, badguyactive.

It seems to work well for me. I think my stories are at least fluent and fairly complex and I have never had any issues with organization. But, to each their own. I'm not quite comfortable using annotations as Pixie does, but if you are, that may make more sense to you. I'm not much of a coder!

As for my workflow... that's another story all together. I just need to make time. X3 has been stuck in limbo for MONTHS!

Best of luck!


I have a pretty massive game at the moment and it's only getting bigger. I think it's 60,000+ lines of code and 1.3 million words.

One of the best things I can recommend is putting EVERY SINGLE VARIABLE in a Notepad document exactly as it appears in game (so you have consistent spelling). Divide it into categories, list all categories that pertain to whatever scene you are writing in Notepad++ when you go to write so you don't forget variables.

For example...

player.race: human 0, elven 1, dwarven 2, dragon-descended 3, halfling 4, orc-descended 5, gnome 6, dark elf 7, goblin 8, high-demon 9, alaraune 10, demon 11, cow-taur 12, dryad 13, goo 14, naga 15, centaur 16, neko 17, wolf-taur 18, dragon 19, orc 20, doll 21, bee-taur 22, drider 23.
player.haircolor: brunette 0, white 1, red 2, black 3, dirty blonde 4, platinum blonde 5, green 6, purple 7, dark red 8, orange 9, blue 10, ombre 11, neon 12, pastel 13, pink 14, silver 15, rainbow 16.

and then doing stuff like this underneath these categories...

{if player.race=human:}{if player.race=elven:}{if player.race=dwarven:}{if player.race=dragon-descended:}{if player.race=halfling:}{if player.race=orc-descended:}{if player.race=gnome:}{if player.race=dark elf:}{if player.race=goblin:}{if player.race=high-demon:}{if player.race=alaraune:}{if player.race=demon:}{if player.race=cow-taur:}{if player.race=dryad:}{if player.race=goo:}{if player.race=naga:}{if player.race=centaur:}{if player.race=neko:}{if player.race=wolf-taur:}{if player.race=dragon:}{if player.race=orc:}{if player.race=doll:}{if player.race=bee-taur:}{if player.race=drider:}

So I don't have to rewrite it out 5 million times.

For rooms, I do what Pixie does I think.

Part 1
   Room 1
   Room 2
   Room 3

Part 2
   Room 1
   Room 2
   Room 3

Since it keeps everything extremely organized into smaller sections.

I also recommend keeping all your turnscripts together (so you'll likely have to go into Code-View now and then and move separated turnscripts back into the group.

Hope that helps!

Anonynn.


One of the best things I can recommend is putting EVERY SINGLE VARIABLE in a Notepad document exactly as it appears in game (so you have consistent spelling). Divide it into categories, list all categories that pertain to whatever scene you are writing in Notepad++ when you go to write so you don't forget variables.

Related, always use the same convention for naming objects and attrributes, i.e., how you capitalise it, what you do with spaces, etc.

Another trick is to have a function that checks for issues. I always give rooms and objects aliases, so my checking function reports: any object/room without an alias; room without a description; object without a look; wearable without slots; topics that show or hide topics that do not exist; etc. I have the function run in game.start.


^ wants that function lol >.< !


ConvLib already has a function, TopicTest that checks topics. Here is an example, but it depends what you want to check in your game.

foreach (obj, AllObjects()) {
  if (not StartsWith(obj.name, "_")) {
    if (not HasString(obj, "alias")) {
      msg ("No alias for " + obj)
    }
    if (DoesInherit(obj, "editor_room")) {
      if (not HasString(obj, "roomtype")) {
        msg ("No room type for " + obj)
      }
      if (HasString(obj, "description")) {
        if (obj.description = "") {
          msg ("No description for " + obj)
        }
      }
      if (obj.usedefaultprefix) {
        msg ("usedefaultprefix set for " + obj)
      }
    }
    if (DoesInherit(obj, "editor_object")) {
      if (not HasString(obj, "look") and not DoesInherit(obj, "topic")) {
        msg ("No look for " + obj)
      }
    }
  }
}

I usually don't need extra rooms inside rooms or anything. I just use the computer's Find function.

Also, I too, use paper and pencil. I tend to draw everything out before making it.

Also, my work flow is very varying.... It has its ups and downs. My old game broke recently, so I am rebuilding it, slowly. I also have a side project now, which I'm also working on slowly.


//Put comments everywhere!

Make liberal use of test games so you can experiment/mess things up to your heart's content without fear!


Regularly make sure you can save games when playing. For some reason saving the game is especially sensitive to coding errors, and they are easier to track down if you know it was fine two days ago.


This topic is now closed. Topics are closed after 60 days of inactivity.

Support

Forums