Monday, August 24, 2009

Champiosn Online Update

Alright,

I played with a friend last night who has more of the game figured out. The GUI is awful so I don't blame myself for not finding these, but she showed me how to turn off the ugly black lines. She also says there is a way to get all the powers in power selection but its hidden.

We played together for a bit. The game was faster and easier with a team... but it wasn't a whole lot more fun. In the end its still the same-old same-old boring MMO play and very very reminiscent of the CoH experience.

So while some details have changed my report stays more or less the same. They are scheduled to launch this puppy in a few weeks and sst way too early. I think id maybe pay $5 a month for the experience as is, but no more.

Saturday, August 22, 2009

Champions Online (not so) Mini-review

[Note: This was intended to be a short review, but it turned out a bit longer then I had planned.]

I've been a fan of the Hero games HERO roleplay game system since I was part of a play-test group in high school for the original Champions rules. I've also often lamented that the MMORPG developers could learn a lot from the traditional pen and paper game designers if they ever bothered to talk to them.

Thus, it was with some hope and excitement that I entered the Champions Online open beta last week.

Unfortunately, I guess I have to start this by saying I'm pretty disappointed with the game on a number of fronts.

Because I have the game pre-ordered I was sent an "early" invite to the beta... which began last week and is also open to anyone who goes to file planet. My pre-order "perq" came down to being able to dl a locked copy of the game early and get maybe a few hours jump on those who had to dl it when it "opened." Seems to me its more that I did THEM a favor by pre-downloading and decreasing the hit on their servers at launch, then the other way around.

But okay, so I log on and make a character. First thing I am struck by is the lack of options in the character editor. It seems very reminiscent of my CoH experience but with an even more limited the range of options then CoH at launch. To be fair, there are some options like tails and wings that only came later in CoH. But the range of clothing seems to have been proportionately reduced. Perhaps to make room for these specialty pieces in the art budget. Net effect is a narrow range of general costume options. Struggling and compromising, I come up with something that seems vaugely right for my character conception... a classic sneaky thief type ala Lady Christina in Dr. Who and the Planet of Death. A character type I've played many times in pen and paper Champions games.

Then I hit character stat assignment. Second disappointment. Unlike a pen and paper HERO session, I can't assign stats as I like. Instead I have to pick from a limited list of stat packages according to archetypes they pre-selected. They all seem distressingly combat oriented, but I finally decide that the "acrobat" type fits my character the best.

Next, I go on to pick abilities. The choice is again distressingly narrow and all combat focused. I pick a gun skill and a martial arts skill because this is supposed to be highly skilled human, not some mutant over-the-top power blaster or similar silliness.

For a game that was touting how open ended their character system is, this again feels distressingly like CoH redux ( but there was more range in choice within that system then in this one.) There I picked an “archetype" and then starting powers from that archetype All thats happened here is that it is turned upside down. As I discovered when I later got my first level, my choice of initial powers limited me to guns and martial arts for all future powers. So I'm still stuck in an archetype, its just that it was inferred from my initial power selections.

Alright. That was less then exciting, but maybe the game will play interestingly, I think...

More fool me. As I enter the tutorial it looks almost EXACTLY like the opening of City of Heroes. Im standing in the end of a blind alley-way and directly in front of me is a policeman with a "talk to me" sign over his head.

I won't go into details on this because I don't want to spoil it for people. The tutorial is a bit longer with a bit more storyline. And actually the story line is mildly amusing.... but it feels distressingly like a single player game as I move through it and I start wondering why exactly I'd pay monthly for a single player experience...

I finish the tutorial, complete with fanfares and trumpets about what a wonderful "hero" I am. And here I need to digress because there is a pattern. City of Heroes praised the players as "heroes" for everything they did... some of which was heroic like saving lives and some of which the heroism could be seriously argued like breaking into buildings and confiscating materials all without warrants or chasing down and beating up people on the streets just for belonging to a gang or having an unpopular political affiliation.

Jack Emmert likes to put canned applause in his games. Enough, Jack, really. The only people to whom this player-fawning game behavior has any value really need professional help, not yours. How about making a game for well adjusted adults rather then ill-adjusted 14 year olds?

But I digress. After the feelings-of-deja-vu tutorial I am sent into the “real game" and I go to "Canada." Again, the game play is remarkably familiar. I've been playing MMOs since their inception on AOL. And they are all distressingly the same. This is no different.

The HERO system is one of the most strategically complex roleplaying systems out there. As a HERO player I was hoping to see actual HERO mechanics in play. No luck. The game has me running around clicking attack buttons, and an occasional pick-up or respawn button. There is no evidence that is visible to me, the player, of the timing chart, which is a central part of the HERO system.

My only "maneuver" is the dodge key, which I have to hit and hold at just the right time. Close timing is not really a good idea for a game which has to deal with net-lag. This mechanic worked okay for me but I expect results will vary depending on net-geography of the players. In any event, there is nothing terribly strategic about this.

I mentioned leveling earlier. HERO system is a point system and incremental, there is no "leveling". The same cannot be said for Champions Online. It has exactly the same D&D derived level system every other MMORPG has. At each level you don't get to assign your own points but instead have to chose from a limited selection of new "powers" that are pre-built for you. This again feels a WHOLE lot like City of Heroes, and nothing like the Champions game I know.

About the only place the HEro system surfaces its head is in the stats of items you pick up. And yes, just like every other MMO it has items you acquire to improve your stats. Again, this breaks with the unified point-system of HERO and makes it feel like a D&D/D20 type game. The items are descirbed as stat pluses in somewhat HERO terms, but this leads to a new problem which is context. You have no idea how much "4.2 energy defense" is in the context of the attacks around you because enemies never reveal the stats of their attacks. This makes it a blind numbers game that could be ANY system underneath. Again, very MMO-like, very HERO-unlike.

Im not going to go on much further, I think you probably get my point that this feels like CoH II (and in some ways an inferior sequel) not like any sort of HERO game I was envisioning. But I can't end this without one last gripe...

The game is UG-LY. City of Heroes had some of the nicest, most believable looking human characters I've ever seen in a game. It still stands up well against more modern competitors with much higher graphics requirements like Age of Conan. (Though I must admit that Conan's environments are much lusher and more believable. Thats the prettiest human-scale game I've seen to date.)

Someone decided to go a different route with Champions online and make it more "comicbooky." Ugly cell-rendering draws thick black lines around everything and the characters are much flatter in appearance. To me, this is a step backwards. I couldn't get into WOW in part because of its cartoony look. This in its own way is almost as bad.

Now, it is reminiscent of some of the classic Champions artwork... but that was a game made back in the days when RPG publishing was an amateur garage-shop thing and you didn't *expect* art to look great. This is a big budget computer game. I want a virtual world I can believe in. And reminding me that its a comic book doesn't help that. On the other hand and to be fair, maybe what they are doing is putting me on notice that this isn't a game for me.. a mature thoughtful adult. That their goal is to reach 13 yr old pimply faced comic book junkies of all ages.

If so, then I have to admit they have succeeded well.






Monday, August 17, 2009

An MMO Solliloquey

To level or not to level,
this IS a question.
Whether to suffer the drudgery and boredom of outrageous grinding,
Or to make short your content and by the players end it.

To die, to Lose.
No more, and by a raise to say
we end permadeath and all consequences
of play that is crap.
Tis of the masses devoutly wished.

To die, to raise.
To raise, perchance to bore.
Aye there's the rub.
For in this state of invulnerability,
what dramatic tension may come
when death hath lost all its sting.

That the masses cannot imagine: there's the fact
That makes an experience so devoid of Roleplay;
For who would suffer a 13 yr old in battle,
The talk of trash, the accent innane,
The sp33k of l33t, the P of K,
The insolence of the child and the childish
That patient and mature player does take,
When he himself might his exit make
to a game of mature adults? who would roleplayers bear,
To grief and annoy under a desperate need for attention,
But that the dread of leveling again,
In the undiscover'd game which fares no better?

That those dissatisfied yet pay monthly puzzles the will,
And makes us rather bear those ills we have
Than fly to others that we know not of?
Thus economics does make cowards of us all;
And thus the native player of roles
Is sicklied o'er with the wants of the masses,
And enterprises of great pitch and moment
With this regard their currents turn awry,
And lose the name of improvement.[1]

Thursday, August 13, 2009

Inaugural post

It seems appropriate that my inaugural post of my new blog page be something related to the presidency.

The special interests and the loons who believe them are out in full feather trying to scare people off of actually getting proper health care  in this country.  In response, the Whitehouse has done a nice job of creating a "mythbusters" website.

If you have any questions or concerns that health care reform might hurt you and not help you... I highly recommend this site.

If you distrust ALL politicians (and I wouldn't entirely blame you) then here is an excellent site from a group whose only partisanship has ever been to the american consumers.





SMF creation tool

OpenSoalris (and Solaris 10) have a brand new XMl based way of describing system services. Its a lot more powerful then the old Unix start script system but building the descriptive file (called an SMF) is a bit daunting.

But someone has come up with an answer. This tool builds simple SMFs for you.

Very handy.

Wednesday, August 12, 2009

Eclipse 3.5 and Flex Builder

Well, today was shot to hell wrestling with Eclipse, Maven and Flex Builder.

Have I mentioned how much i dislike build configuration?

Anyway, I managed to at least get Eclipse and Flex Builder 3 working. It turns out that thats easier then it looks. Here are the steps I used:

(1) Download and install Eclipse 3.5. I used the J2EE install.
(2) Download and run the Flex Builder 3 installer.
(3) Ignore all the warnings that it only supports Eclipse 3.3 and 3.4. Just keep telling it that you know what you are doing and want to install it anyway. It will end with a scary message about failing and suggest you do a manual install from inside of eclipse. Don't do that!
(4) Here is the magic, when it is done there will be a file in your eclipse/links directory called
com.adobe.flexbuilder.feature.core.link
Open that file in wordpad and you will see it contains one line:

C:/Program Files/Adobe/Flex Builder 3 Plug-in

Edit that line so it looks like this:

path=C:/Program Files/Adobe/Flex Builder 3 Plug-in

Save the file and start eclipse. Voilla!

Sunday, August 9, 2009

Updated Script Sandbox

The one fixes a minor bug and adds support for code from Readers and support for compiled scripts:

import groovy.util.GroovyScriptEngine;

import java.io.Reader;
import java.io.StringReader;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.CodeSource;
import java.security.Permission;
import java.security.Permissions;
import java.security.PrivilegedAction;
import java.security.ProtectionDomain;
import java.security.cert.Certificate;
import java.util.Collection;

import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class ScriptSandbox {
    ScriptEngine _scriptEngine;
    AccessControlContext _accessControlContext;
   
    public ScriptSandbox(String engineShortName) throws InstantiationException{
         ScriptEngineManager sem = new ScriptEngineManager();
         _scriptEngine = sem.getEngineByName(engineShortName);
         if (_scriptEngine==null){
             throw new InstantiationException("Could not load script engine: "+
                     engineShortName);
         }
         setPermissions(null);
    }
   
    public boolean isCompilable(){
        return _scriptEngine instanceof Compilable;
    }
   
    public void setPermissions(Collection<Permission> permissionCollection){
        Permissions perms = new Permissions();
        perms.add(new RuntimePermission("accessDeclaredMembers"));
        if (permissionCollection!=null){
            for (Permission p : permissionCollection){
                perms.add(p);
            }
        }
        // Cast to Certificate[] required because of ambiguity:
         ProtectionDomain domain = new ProtectionDomain(
                 new CodeSource( null, (Certificate[]) null ), perms );
         _accessControlContext = new AccessControlContext(
                 new ProtectionDomain[] { domain } );
    }
   
    public Object eval(String code){
        return eval(new StringReader(code));
    }
   
    public Object eval(final Reader rdr){
        return AccessController.doPrivileged(new PrivilegedAction(){
            @Override
            public Object run() {
                try {
                    return _scriptEngine.eval(rdr);
                } catch (ScriptException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }}, _accessControlContext);
    }
   
    public CompiledScript compile(String str) throws ScriptException{
        return ((Compilable)_scriptEngine).compile(str);
    }
   
    public CompiledScript compile(Reader rdr) throws ScriptException{
        return ((Compilable)_scriptEngine).compile(rdr);
    }
   
    public Object execute(final CompiledScript script){
        return AccessController.doPrivileged(new PrivilegedAction(){
            @Override
            public Object run() {
                try {
                    return script.eval();
                } catch (ScriptException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }}, _accessControlContext);
    } 
}


Friday, August 7, 2009

Java Scripting API Sandbox

Well, I am adding generic scripting to my DarkMMO client. 

The server passes the name of the scripting language being used and then the script code.  The client finds the script engine and then executes the code using the Java Scripting API that is built into JDK 6.

This was all pretty straight forward and easy, however if I let the client execute any code the server sent it coudl be a BIG security hole.  Therefor I decided to try to sandbox the code.  It has been a frustrating few days but I posted a request for help to users@scripting.dev.java.net and got back a very useful link froma helpful soul there.

From that I was able to figure out how to do it, so here is the result. A generic Java Scripting Sandbox!  (Code below)  This sandbox is intiialized with the name of the scripting engine you want to use and then can be set to run any code you pass it with any permission set you chose,. In fact, the permission set can be changed on the fly by the main program.

In order for this to work, you need to have a security manager enabled.  I do this in DarkMMO with the VM argument -Djava.security.manager

Once you enable the security manager you have to give the code of the program and libraries it depends on permissions or it wont work.  I do that with a security.policy file that grants all permissions to the app like so:

grant {
    permission java.security.AllPermission;
};

Finally, I tell the VM to use that security.policy file with this VM argument:
-Djava.security.policy=security.policy
  

With that in place, the following class runs scripts in a sandbox.  All it handles is eval(String) because that's the only kind of script I need to handle, but its extension to the other kinds of evals aught to be intuitively obvious.

import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.CodeSource;
import java.security.Permission;
import java.security.Permissions;
import java.security.PrivilegedAction;
import java.security.ProtectionDomain;
import java.security.cert.Certificate;
import java.util.Collection;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class ScriptSandbox {
    ScriptEngine _scriptEngine;
    AccessControlContext _accessControlContext;
   
    public ScriptSandbox(String engineShortName) throws InstantiationException{
         ScriptEngineManager sem = new ScriptEngineManager();
         _scriptEngine = sem.getEngineByName("groovy");
         if (_scriptEngine==null){
             throw new InstantiationException("Could not load script engine: "+
                     engineShortName);
         }
         setPermissions(null);
    }
   
    public void setPermissions(Collection permissionCollection){
        Permissions perms = new Permissions();
        perms.add(new RuntimePermission("accessDeclaredMembers"));
        if (permissionCollection!=null){
            for (Permission p : permissionCollection){
                perms.add(p);
            }
        }
        // Cast to Certificate[] required because of ambiguity:
         ProtectionDomain domain = new ProtectionDomain(
                 new CodeSource( null, (Certificate[]) null ), perms );
         _accessControlContext = new AccessControlContext(
                 new ProtectionDomain[] { domain } );
    }
   
    public Object eval(final String code){
        return AccessController.doPrivileged(new PrivilegedAction(){
            @Override
            public Object run() {
                try {
                    return _scriptEngine.eval(code);
                } catch (ScriptException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }}, _accessControlContext);
    }  
}


Tuesday, August 4, 2009

Well thats the game industry

I've spent a long time in the game industry, about 15 of my total 25 years as a professional software engineer. And one thing you get used to in this industry is instability. The average job in this business lasts 2.5 years. Seldom less then 2, seldom more then 3.

As you might have noticed, CampFU is down. Sadly, the economy has forced us to shut the doors on the Camp and I have moved to my next position.

The good news is, its a VERY exciting one at a really amazing game company. The company is Blue Fang Games in Waltham, MA. Founded by ex-papyrus people, Blue Fang has made a name for themselves in the animal games space with their hits Zoo Tycoon and Zoo Tycoon II. World of Zoo, the companies first WII product is going to be launched soon and is really, really neat. It takes the animal game experience to a very close and personal level that I think will be a big winner with both kids and adults.

I have joined Blue Fang as BFG's first Chief Online Technical Officer. I can't tell you what I'm working on yet except to say that its going to be Blue Fang's foray into the exciting world of online games.

So this monkey is in a new monkey house. Stay tuned for more information!