Wednesday, August 22, 2012

Heroic Deeds // Inheriting Objectives // Tied Achievements

Hi!

Heroic Deeds
I've added the option to set categories to "heroic". This means their Achievements will only be displayed when they are complete instead of showing the list of all possible Achievements. Also heroic deeds do not award Yubopoints.

Inheriting Objectives
While working out some achievements I found a flaw in the system. When we look at an Achievement with three Tasks:

Boss Mobs:
- Kill one of the bosses listed below
- Kill 15 of the bosses listed below
- Kill all of the bosses listed below

Currently this would require for every Task to have its own Objectives. In this case one would have to add the same boss mobs as Objectives for every one of the three Tasks.

To solve the problem it is now possible to let a Task inherit the Objectives of his parent.

Tied Achievements
Another issue that is currently adressed is a problem with the cult/civ ties of achievements.
I'll be moving the ties to the Tasks to avoid duplication of Achievements just because their Tasks differ for different tie combinations.

Yours Cotare

GSoC 2012 has ended

Hiho!

The Google Summer of Code has ended now and I am quite satisfied with what has been accomplished. Most things are working, though there are also many small details I'll keep working on.

Also the real-time-tracking of achievements using Ryzom's server services will be one of the next milestones.

I'll keep posting news every now and then...

Yours Cotare

Monday, July 16, 2012

Ryzom achievements @ Facebook

Hiho!

Here comes a preview from the FB app for the Ryzom achievements:


yours Cotare

Tuesday, July 10, 2012

Data handling inside the PHP classes

Hi!

I improved the data handling inside the PHP classes. Each class normally has a list containing its child nodes. eg: AchAchievement has a list of AchTask nodes.

They are now organized in a doubly linked list. In addition to that an AVLtree is built to find nodes by their ID number. This allows later manipulation of the nodes and even reorganization. We need that for the admin tool, since changes to the structure will first be reflected within the actually loaded structure and the stored in the database.

yours Cotare

Achievement Tracker (redone)

Hiho!

The achievement tracker has suffered some vital changes. We are now strictly event driven, which should give a nice performance boost.

XML data gets processed using SAX. This way we can avoid building a DOM tree inside the RAM while extracting data.

The parser knows two different types of data: values and entities. Values are simple values like "key=>value". Entities are dataset that belong together like "pet"=>(x,y,z,sheet_id,satiety,....)

Instead of asking the parser to extract information from the XML, the atom scripts now register which values or entities they are interested in, providing a callback method. Once all atoms have been registered, the parser is started. It will extract the data from top to bottom, sending it to the dispatcher which passes it on to the atoms. Worst case: no atom wants the data => nothing happens.

Well, that's ist basically :)

yours Cotare

Monday, June 25, 2012

Achievement xmlAPI

Hi!

The xml API to query achievement structure and player progress is done.
Here is an example output from the progress script:
<ryzom_progress>
    <character id="1"/>
    <tasks>
        <task id="2" date="600"/>
        <task id="5" date="100"/>
    </tasks>
    <objectives>
        <done>
            <objective id="4" date="500"/>
            <objective id="7" date="500"/>
            <objective id="11" date="500"/>
        </done>
        <open>
            <objective id="13" value="1"/>
        </open>
    </objectives>
</ryzom_progress>

 Yours Cotare

Class schemes 2.0

Hi!

While working on the admin tools, I found some obstacles. I wanted to use the base classes that load the structure of the achievements and extend them to support administrative functions.
Therefore I did some restructuring. I modified some abstract classes and made use of PHP traits.

So here comes the new class scheme:



There will probably be some further changes though, since the admin tool is still WIP.

Yours Cotare

Ingame rendering

Hello!

Finally also the ingame rendering for the achievement app is ready. Here it comes:


Yours Cotare

Monday, June 18, 2012

Admin Tools

Hiho!

The Achievement Tracker is almost done (except for testing) so now I focus on the admin tools. Once they are finished I can test and debug the Tracker too.

Admin tools will basically allow for two different things:
  • Achievement settings / Achievements editor
  • CSR tool to manipulate a character's progress
I decided to implement the admin tools as another WebIG app. That way I may reuse the authentication system of WebIG. Also CSR tools ingame might come in quite handy.

I'll be posting new schemes and layouts for the PHP classes within the next few days.

cya then,
yours Cotare

Monday, June 4, 2012

Achievement Tracker / PHP-cronjob

Hiho!

Well, currently the achievement tracker is under development, so here comes some information on that:

The tracker is used to evaluate a character's progress with the achievements. Basically this is done using a cronjob. Ok, actually it's not a real cronjob. We need a cronjob though to handle our tracker and monitor it. The tracker script is set to call itself before terminating. So we have a powerful way to handle load on the server.

There are three core components of the tracker: the DataHandler, DataSources and Atoms

DataHandler:
The DataHandler is set up to provide access to actual game data. This allows us to query for things like "a characer's dappers" without knowing where the data is stored or how it is returned to us. DataHandler does that for us.

DataSource:
DataSources are created by the DataHandler. They are defined in the config file, so you may add as many DataSources as you like. By default there will be three DataSources: XMLapi, ValueCache and RingOpen. Each datasource reports to the DataHandler which data they can provide and also offer a function to retrieve and even write (if possifle) data. The DataHandler does the rest.

Atoms:
Atoms define our triggers, so the script will know when an achievement is triggered. Like their name suggests, Atoms are the most atomic bricks. The can be granted or denied. This is still work in progress, so here is just a short preview how Atoms might be scripted:
VALUE dappers = c_money
IF(dappers >= 5000) {
    GRANT
}

VALUE tmp = c_fame[scorchers]
IF(tmp == 0) {
    DENY:3600
}

VALUE x = c_pos_x
VALUE y = c_pos_y
SCRIPT inside(x,y) {
    IF(MSG == "Majestic Garden") {
        GRANT
    }
}

EVENT player_death
ON player_death {
    UNLOCK
}

EVENT region_changed
ON region_changed {
    IF(MSG == "Majestic Garden") {
        GRANT
    }
}
Ok, that's all for the moment. I'll be posting more information on this topic a soon as I make progress.

Yours Cotare

Tuesday, May 29, 2012

Frontend Class Scheme

For all that are interested, here comes the curent class scheme used to render the achievement frontend:


Sunday, May 27, 2012

Frontend Preview #1

Hiho!

Here comes the first frontend preview that should demonstrate what the system is capable of. Ejoy!


Friday, May 25, 2012

Database Scheme

The database layout is getting finished :) So here it comes:

Category:
The category allows us to build the achievement sidemenu, grouping achievements. Submenus are supported.

Achievement:
Achievements are tied to a category in which they get displayed. They may have a parent achievements so they won't show up until the parent is completed.
Also achievements may be tied to a race, cult or civilization (eg. Reach 100 fame with XX while being Matis/Karavan aligned)

Tasks:
Tasks are considered to be "subachievements". This allows us to define various "levels" of an achievement (eg: Obatin 1,000/10,000/100,000/.... dappers). Achievements like "Break a pick" just have one task.

Objectives:
Since tasks are only a "container", they do not define what has to be done. Objectives are tied to tasks and are used to define the objectives needed to complete a task. The display options for an objective are "simple" (just text), "meta" (tied to another achievement) and "value" (tied to a value that's shown on a progress bar).

Atoms:
Atoms are invisible to the player but the most essential part of the achievements system. Each objective may have 1 to infinite atoms which hold the information needed by the achievement tracker. Atoms may be granted of denied, either progressing an achievement or preventing further progress based on conditions. This may be used by eg. boss scripts to handle complex achievements. Anyhow, atoms basically define the "data source", the "expected value" and "which value" (eg.: XMLapi;>10000;character:money). This part is still WIP.

Tracker:
For now I defined four tables to be filled by the tracker. They store the character's progress with the achievements. The "player_valuecache" can be used to compare changes of a value over time.

Monday, April 30, 2012

setting up...

Well, let me see:

Ryzom Core Shard running, Client working, WebIG is still refusing to do so. At least most things are now set up and I'm able to compile everything from source too.