I'm going to be busy with this wretched thing called "school" every Tuesday and Thursday from now until December. Furthermore, my weekends are continually booked thanks to Amtgard and helping Roswell73 come up with video ideas.
So progress is going to be severely limited to Mondays and Wednesdays, as well as the occasional update on Tuesdays and Thursdays during class, and on some Fridays when I'm not helping Roswell.
With that said, give a warm welcome to Diabolicomix, Wager Witch, and Irate Dog the official Anachrony Online illustrator, writer, and concept designer (respectively). Their work load will be practically nonexistent until I get the systems programmed, but their contributions to the project, both in content and in motivating me to get off my ass and program stuff, are a welcomed change to my "Program stuff, think about story and gameplay later" approach.
Tomorrow, I'll try to squeeze in the attack roll and armor class calculation algorithm in my spare time between my science and math classes.
Tuesday, August 25, 2009
Friday, August 21, 2009
Some Progress
I haven't made a lot of headway in the past 24 hours, but I did define and tell the script to generate values for $GCHAR["saves"]. With this, characters' saving throw values are easily accessed without having to keep recalculating them.
Saving throws are equal to 1/2 your total level in all classes, plus the modifier derived from the appropriate stat, plus whatever your equipment grants you. Boots that give you a +1 to AC and a +1 to Reflex saving throws are not uncommon.
Since I don't have much substance to give you guys, here's a screenshot of the left menu when you're logged in so far:

Wow, is that sexy or what?
Tomorrow I'll work on incorporating attack rolls, AC bonuses, and such stuff to the combat engine. Then I can begin weapon techniques, range-handling, and magic. It should be fun.
Saving throws are equal to 1/2 your total level in all classes, plus the modifier derived from the appropriate stat, plus whatever your equipment grants you. Boots that give you a +1 to AC and a +1 to Reflex saving throws are not uncommon.
Since I don't have much substance to give you guys, here's a screenshot of the left menu when you're logged in so far:

Wow, is that sexy or what?
Tomorrow I'll work on incorporating attack rolls, AC bonuses, and such stuff to the combat engine. Then I can begin weapon techniques, range-handling, and magic. It should be fun.
Wednesday, August 19, 2009
Dungeon Combat System: 33% Complete!
Hazzah! I have completed the hardest part of the system: Determining who attacks first, collecting a large script together from each combatant to determine the damage dealt and other such effects, and displaying the output for the player to read.
Both of the above are generated by the server and executed in a single battle turn. You wouldn't believe how difficult I've made the process by which the server generates this in the name of flexibility, and the entire thing only clocks in at about 32 KB so far, but that's still a lot of code. And I'm not an efficient programmer, either.
Still to do:
Then, I'll move on to leveling up and character development, and FINALLY begin the dungeon itself. You guys are gonna love it!
Zombah! strikes voodooKobra with his fist for 2 damage.
Zombah! strikes voodooKobra with his fist for 1 damage.
Generic Cohort strikes Zombah! with his fist for 4 damage.<?php
$GCHAR["d_data"]->player->hp -= 2;
$GCHAR["d_data"]->player->hp -= 1;
$GCHAR["d_data"]->cohort[0]->hp -= 4;
?>Both of the above are generated by the server and executed in a single battle turn. You wouldn't believe how difficult I've made the process by which the server generates this in the name of flexibility, and the entire thing only clocks in at about 32 KB so far, but that's still a lot of code. And I'm not an efficient programmer, either.
Still to do:
- Attack rolls, AC, etc.
- Saving throws
- Display the combat interface
- Interpret player input
- Specify -1 as the flag for "attack all enemies" and make it work
- Spell effects
- Appending to $COMBAT["script"]
Then, I'll move on to leveling up and character development, and FINALLY begin the dungeon itself. You guys are gonna love it!
Status Report: Combat System
Not much to say right now. I've picked up the combat system and I have it about 10% complete. The data-handling step of the combat engine is a real doozey. For example, here's the print_r() output for $COMBAT["cohort"][0] for an example cohort:
Looks easy enough, but the fact that I had to generate an identifier (used in scripts ran via gfmodulec) should indicate how process-intensive this is going to be. The "flag" is used in generating the Target field for User Input; nothing more. The player has a flag 0, each cohort increases it by 1, and the enemies continue where the cohorts leave off. Friendly helps determine whether or not to let the player cast healing spells on the target.
And now I return to my text editor.
[0] => Array
(
[id] => 1
[hp] => 30
[sp] => 10
[initiative] => 11
[type] => human
[attack] => SimpleXMLElement Object
(
[min] => 1
[max] => 4
[properties] => SimpleXMLElement Object
(
[prop] => martial
)
[closerange] => 1
[midrange] => 0
[farrange] => 0
)
[stats] => SimpleXMLElement Object
(
[str] => 14
[dex] => 10
[con] => 12
[int] => 10
[wis] => 10
[cha] => 10
)
[friendly] => 1
[ident] => $GCHAR["d_data"]->cohort[0]
[flag] => 1
)Looks easy enough, but the fact that I had to generate an identifier (used in scripts ran via gfmodulec) should indicate how process-intensive this is going to be. The "flag" is used in generating the Target field for User Input; nothing more. The player has a flag 0, each cohort increases it by 1, and the enemies continue where the cohorts leave off. Friendly helps determine whether or not to let the player cast healing spells on the target.
And now I return to my text editor.
Are You Talented?
I'm considering making an optional "plug-in" for the game that lets you choose what D&D 3.5 called Skills but I'm going to choose to call Talents for your character. This will be completely optional but implemented in the Arena and Character Sheet pages. It will automatically allow you to place X + IntModifier (X=2 for fighters/wizards, 8 for rogues, etc.) talent ranks per level in various talents.
They will not be used in the dungeon (as everything will be based on your base stats and saves), but the idea is to allow players to use this to make RPing convenient. When the plugin is enabled, they will be able to perform their talents (run, jump, swim, perform (lute), etc.) in the same way that players select spells during combat: Via a dropdown menu.
I'm still not 100% on this. What do you guys (and gals) think? It wouldn't be too tedious, and it should not hinder or clutter up the screens of people who aren't avid roleplayers.
They will not be used in the dungeon (as everything will be based on your base stats and saves), but the idea is to allow players to use this to make RPing convenient. When the plugin is enabled, they will be able to perform their talents (run, jump, swim, perform (lute), etc.) in the same way that players select spells during combat: Via a dropdown menu.
I'm still not 100% on this. What do you guys (and gals) think? It wouldn't be too tedious, and it should not hinder or clutter up the screens of people who aren't avid roleplayers.
Tuesday, August 18, 2009
Preview: Character Sheet
Status Report: ReXML
So far, I have successfully created a system that uses XML pseudofiles (which I will explain and document in a later post) to store data in a database, and the code to read the XML data and turn it into something meaningful for PHP is finished. Tonight, I work on the system that turns everything back into XML data and updates the database. I'm using a system of flags in an array called $REXML to assist in this process. It should be fun to program.
One of the biggest obstacles in picking this project back up is remembering the syntax. For example, dungeon data is stored in $GCHAR["d_data"]. Player data is $GCHAR["d_data"]->player, and the player's current HP is stored in $GCHAR["d_data"]->player->hp. Remembering the differences between arrays and SimpleXML objects is a bit of a pain.
Incidentally, one of my characters has a $GCHAR["d_data"] that looks like this:
While another's looks like this:
Things can get messy, but everything you see should be auto-generated by the server.
One of the biggest obstacles in picking this project back up is remembering the syntax. For example, dungeon data is stored in $GCHAR["d_data"]. Player data is $GCHAR["d_data"]->player, and the player's current HP is stored in $GCHAR["d_data"]->player->hp. Remembering the differences between arrays and SimpleXML objects is a bit of a pain.
Incidentally, one of my characters has a $GCHAR["d_data"] that looks like this:
<?xml version="1.0"?>
<ddata>
<player>
<hp>7</hp>
<sp>12</sp>
<encounter>0</encounter>
<initiative>0</initiative>
<x>0</x>
<y>0</y>
<dungeon>0</dungeon>
</player>
</ddata>While another's looks like this:
<?xml version="1.0"?>
<ddata>
<player>
<hp>17</hp>
<sp>2</sp>
<encounter>0</encounter>
<initiative>16</initiative>
<x>0</x>
<y>2</y>
<dungeon>1</dungeon>
</player>
<cohort>
<id>1</id>
<name>Generic</name>
<type>human</type>
<hp>30</hp>
<sp>10</sp>
<initiative>11</initiative>
<attack>
<min>1</min>
<max>4</max>
<properties>
<prop>martial</prop>
</properties>
<closerange>1</closerange>
<midrange>0</midrange>
<farrange>0</farrange>
</attack>
<xpdrop>100</xpdrop>
<gpdrop>300</gpdrop>
<itemdrops>
<item>
<id>1</id>
<rate>20</rate>
</item>
<item>
<id>2</id>
<rate>1</rate>
</item>
</itemdrops>
<stats>
<str>14</str>
<dex>10</dex>
<con>12</con>
<int>10</int>
<wis>10</wis>
<cha>10</cha>
</stats>
</cohort>
<monster>
<id>3</id>
<name>Zombah!</name>
<type>undead</type>
<type>human</type>
<range>1</range>
<hp>2</hp>
<sp>10</sp>
<initiative>12</initiative>
<attack>
<min>1</min>
<max>4</max>
<properties>
<prop>martial</prop>
</properties>
<closerange>1</closerange>
<midrange>0</midrange>
<farrange>0</farrange>
</attack>
<attack>
<min>2</min>
<max>6</max>
<spcost>2</spcost>
<properties>
<prop>fire</prop>
</properties>
<spcost>0</spcost>
<closerange>0</closerange>
<midrange>1</midrange>
<farrange>1</farrange>
</attack>
<xpdrop>100</xpdrop>
<gpdrop>30</gpdrop>
<itemdrops>
<item>
<id>1</id>
<rate>20</rate>
</item>
<item>
<id>2</id>
<rate>1</rate>
</item>
<item>
<id>4</id>
<rate>1000</rate>
</item>
</itemdrops>
<stats>
<str>10</str>
<dex>6</dex>
<con>0</con>
<int>12</int>
<wis>8</wis>
<cha>9</cha>
</stats>
</monster>
</ddata>Things can get messy, but everything you see should be auto-generated by the server.
Sunday, August 16, 2009
An overview of the accomplished
Okay, time to talk gameplay! What will AO offer that other text-based online RPGs won't? Here I will discuss two very distinct things: Ideas that have been implemented and ideas that WILL be implemented (unless someone gives me a really good reason to reconsider them). Let's begin with the former.
Implemented
Character Creation
Being that the game is heavily influenced by Dungeons and Dragons, the character creation process was the first thing I finished. To begin with, you select your character's race. At first, you only have access to six: Humans, Elves, Dwarves, Halflings, Tieflings, and the Eldarin (High Elves). However, as you play the game, you will encounter new worlds and, through questing, unlock the ability to play as new races.
Each race has its own strengths and weaknesses, although none of the latter are gameplay hindering. For example, Humans gain levels 1.5% faster than most races, while some sidequests are only available to Tieflings. Most of the unlockable races will be able to play through race-exclusive quests as they level up, to enhance replay value.
After you pick your race, a plethora of classes will be available. Multiclassing is allowed, and encouraged, with no penalty. However, spreading yourself too thin might prove to be problematic, especially if you desire the opportunity to play a prestige class. There will also be unlockable classes, such as Paladin and Blackguard.
Then, the server rolls 6 stats and you get to assign the values to STR, CON, DEX, INT, WIS, or CHA. If you don't like what you see, simply reroll until you're satisfied. Note that it's unlikely that you will get all 18s. This process is entirely server-side, so there's no chance of manipulating the results or creating a level 1 character with 200 STR or -64 CHA.
The next process in the character creation process is to select your feats. Some classes grant bonus feats at certain levels; others provide them automatically. Skills are learned from NPCs and automatically from leveling up (especially when you level Prestige Classes).
Ideas Yet to be Implemented
Cohorts
Suddenly 20 Ghouls swarm around you. Oh no! Luckily, you have 5 bodyguards with silver-coated weapons to help you dispatch them all.
Some NPCs will aid you in your questing. Some are useless VIPs whom you cannot let die, others are epic warriors who cut down hordes of enemies. Some will only accompany you for one battle, others will follow you beyond the ends of the earth until their dying breath. Some are summoned creatures and your familiar (if you're a spellcaster). The possibilities are endless. (Note: Most will want to stay in the level they joined.)
AJAX Arena
What's the fun in leveling up an awesome character if you can't kill your friends? Well, you can. Or at least, you will be able to when the AJAX-based Arena is completed!
The Arena will consist of a chatroom and a battle system in one. Private rooms will be allowed for RPing, but all fighting will take place on the Battlegrounds. That is, of course, unless the private room is opened by a GM for a special event. GMs-- either during special events or for general RPing in the Battlegrounds (main lobby)-- will also have the ability to grant experience points and conjure items into your inventory.
Okay, my writing is becoming less coherent, so I should end it here.
Implemented
Character Creation
Being that the game is heavily influenced by Dungeons and Dragons, the character creation process was the first thing I finished. To begin with, you select your character's race. At first, you only have access to six: Humans, Elves, Dwarves, Halflings, Tieflings, and the Eldarin (High Elves). However, as you play the game, you will encounter new worlds and, through questing, unlock the ability to play as new races.
Each race has its own strengths and weaknesses, although none of the latter are gameplay hindering. For example, Humans gain levels 1.5% faster than most races, while some sidequests are only available to Tieflings. Most of the unlockable races will be able to play through race-exclusive quests as they level up, to enhance replay value.
After you pick your race, a plethora of classes will be available. Multiclassing is allowed, and encouraged, with no penalty. However, spreading yourself too thin might prove to be problematic, especially if you desire the opportunity to play a prestige class. There will also be unlockable classes, such as Paladin and Blackguard.
Then, the server rolls 6 stats and you get to assign the values to STR, CON, DEX, INT, WIS, or CHA. If you don't like what you see, simply reroll until you're satisfied. Note that it's unlikely that you will get all 18s. This process is entirely server-side, so there's no chance of manipulating the results or creating a level 1 character with 200 STR or -64 CHA.
The next process in the character creation process is to select your feats. Some classes grant bonus feats at certain levels; others provide them automatically. Skills are learned from NPCs and automatically from leveling up (especially when you level Prestige Classes).
Ideas Yet to be Implemented
Cohorts
Suddenly 20 Ghouls swarm around you. Oh no! Luckily, you have 5 bodyguards with silver-coated weapons to help you dispatch them all.
Some NPCs will aid you in your questing. Some are useless VIPs whom you cannot let die, others are epic warriors who cut down hordes of enemies. Some will only accompany you for one battle, others will follow you beyond the ends of the earth until their dying breath. Some are summoned creatures and your familiar (if you're a spellcaster). The possibilities are endless. (Note: Most will want to stay in the level they joined.)
AJAX Arena
What's the fun in leveling up an awesome character if you can't kill your friends? Well, you can. Or at least, you will be able to when the AJAX-based Arena is completed!
The Arena will consist of a chatroom and a battle system in one. Private rooms will be allowed for RPing, but all fighting will take place on the Battlegrounds. That is, of course, unless the private room is opened by a GM for a special event. GMs-- either during special events or for general RPing in the Battlegrounds (main lobby)-- will also have the ability to grant experience points and conjure items into your inventory.
Okay, my writing is becoming less coherent, so I should end it here.
Saturday, August 15, 2009
Scripts, subscripts, and subsubscripts!
It's amazing what a short snippet of well-written code can do to make your life easier. For example, take my gfmodulec() function:
That might look intimidating at first, but it's actually quite simple. First, the "global" statement tells it to import a bunch of crap. All of those are either arrays or SimpleXML objects. Don't worry about them too much.
The $randomfilename is exactly what it sounds like. kcenc() is Kobra's Custom Encryption function, but the final output is an md5() hash, so it doesn't look too strange.
The rest is easy as pie. It creates a file with the data ($sdata) passed to the function, runs that file, then deletes it.
"What's the point in all this?" It's simple. By using data stored in MySQL, I can write weapons, spells, etc. that can do literally ANYTHING! A sword that randomly (1/10,000 chance) replaces your enemy with a level 1 slime but doesn't reduce its EXP or item gains? No problem. I throw some PHP into the SQL value for that weapon's "script" and viola, an interesting relic!
This means I can make abilities that only work in certain worlds, or on certain types of enemies, too. In fact, every skill, spell, feat, or attack (to the engine, though, there are just skills and feats) will be an include()d PHP script.
It's probably not the most optimal way to do things, but it sure as hell makes things interesting.
function gfmodulec($sdata)
{
global $GCHAR, $GDATA, $charlook, $GSWITCH, $GVAR, $COMBAT, $COMBATORDER, $NUMBER_OF_FLAGS, $NUMBER_OF_ENEMIES, $U, $PLAYABLE, $COOK, $VISIBLE, $SELECTABLE, $socache;
// Create a random file for inclusion and deletion; return its name.
$randomfilename = GAME_ROOT."/temp/".kcenc(microtime()."a".rand(1,10000)).".inc.php";
$fp = fopen($randomfilename, "w");
fwrite($fp, $sdata);
fclose($fp);
include($randomfilename);
unlink($randomfilename);
}That might look intimidating at first, but it's actually quite simple. First, the "global" statement tells it to import a bunch of crap. All of those are either arrays or SimpleXML objects. Don't worry about them too much.
The $randomfilename is exactly what it sounds like. kcenc() is Kobra's Custom Encryption function, but the final output is an md5() hash, so it doesn't look too strange.
The rest is easy as pie. It creates a file with the data ($sdata) passed to the function, runs that file, then deletes it.
"What's the point in all this?" It's simple. By using data stored in MySQL, I can write weapons, spells, etc. that can do literally ANYTHING! A sword that randomly (1/10,000 chance) replaces your enemy with a level 1 slime but doesn't reduce its EXP or item gains? No problem. I throw some PHP into the SQL value for that weapon's "script" and viola, an interesting relic!
This means I can make abilities that only work in certain worlds, or on certain types of enemies, too. In fact, every skill, spell, feat, or attack (to the engine, though, there are just skills and feats) will be an include()d PHP script.
It's probably not the most optimal way to do things, but it sure as hell makes things interesting.
Inaugural Blog Post
Let's cut right to the chase, shall we?
I am Kobra, the author of Kobra's Corner, and this is a developer's blog for a MMORPG I'm, well, developing. I have given the project the name "Anachrony Online," although that is likely to change as I come closer to finishing the game.
In the coming hours, or more likely, days, I will be posting some basic information about the game, some ideas I wish to implement, etc. in hopes of getting some feedback from the community.
But first, I would like to outline some goals I have yet to meet; mostly for my own convenience rather than for onlooker curiosity:
That is how it looks, currently.
I am Kobra, the author of Kobra's Corner, and this is a developer's blog for a MMORPG I'm, well, developing. I have given the project the name "Anachrony Online," although that is likely to change as I come closer to finishing the game.
In the coming hours, or more likely, days, I will be posting some basic information about the game, some ideas I wish to implement, etc. in hopes of getting some feedback from the community.
But first, I would like to outline some goals I have yet to meet; mostly for my own convenience rather than for onlooker curiosity:
- Finish the registration system.
- Finish the "level up" system.
- Start and finish the Dungeon's battle system.
- Start and finish the Dungeon!
- Switches, variables, etc.
- Subscripts and subsubscripts.
- Choicesets.
- Switches, variables, etc.
- Start the AJAX-based Arena.
- Finish the AJAX-based Arena.
- Make the first dungeon.
- Alpha testing!
- Tweaking.
- Complete the inaugural dungeons.
- Beta testing!
- More tweaking!
- Public release.
That is how it looks, currently.
Subscribe to:
Comments (Atom)


