Archive for the ‘Computers’ Category

Star Wars The Old Republic

Friday, December 23rd, 2011

I’ve been playing World of Warcraft on an off for over 5 years, before that I played Anarchy Online and Eve Online for a couple of years.

After that I got a lifetime subscription for Star Trek Online, which kinda turned me off MMO’s altogether :)

I’ve been playing a couple of the SWTOR beta weekends and got early access 6 days before release, and I’ve made it to level 30 so far (think there are around 10-20 lvl 50′s on my server (Scepter of Ragnos)).

And so far I must say… SWTOR is fucking awesome!


Riding a shuttle between two areas of the map

If you just gave me the game and let me play the first 10 levels (Starting planet), I would be 99% sure the game was made by Bioware. Unlike for example WOW where you just accept quest, go kill/collect and return, the quests in SWTOR are really amazing. The quest chains make up wonderful stories in classic Bioware style (Baldurs Gate, Neverwinter Nights, KOTOR, Dragon Age), and you can very often choose different ways to do the quest. The NPC voice acting also adds to your total immersion in the stories.

The class quest, which is a long quest line that follows your character between level 1 and 50, is absolutely brilliant, I’m playing as a Bounty Hunter and the story is comparable to a really good single player RPG. Also the companion system is great, and you get a really close connection to your characters, much more so than in KOTOR / Mass Effect.


Me and my kickass companion Mako

So far I can only judge the lvl 1-30 part of the bounty hunter class quest, but I’ve heard the other classes (which have totally different class quests) are equally good. So I’ll probably be making alts just to play the story lines.

The instances I’ve been in so far are all good, like the quests you can also affect how the instance unfolds by choosing dark side / light side.

I’m playing as a Bounty Hunter Bodyguard (healer), and the healing mechanic is really good, each time you use a healing ability you gain heat and you need to keep your heat level low and not overheat to be able to heal. This means you can heal forever if you manage your heat properly, but dealing with big damage spikes is a bit hectic (but very doable).

The graphics are really nice, although some people complain it’s too cartoony (mostly WOW fanboys it seems, which is ironic beyond belief). I’m glad the graphics is not realistic (skyrim, age of conan), I don’t think that would be a good look for this game.


I'm trying to be a ruthless bounty hunter, but Mako with her big puppy eyes makes it hard at times

So far I haven’t experienced a single disconnect (saw 2 lag spikes during 1 beta weekend, that lasted about 5 seconds), so for me the launch has been close to perfect. I came across 1 bug in a class quest, but the forum had a workaround.

I’m really looking forward to seeing what the end game is like.

To sum it all up in one sentence, “I’ve played many MMO’s, but I would say this is the first MMORPG I’ve played”

Origin.. never again!

Thursday, December 22nd, 2011

Even though it means I’m basically throwing Battlefield 3 out the window, I just uninstalled the piece of shit Origin client.

I pre-ordered SWTOR (Star Wars The Old Republic) on Origin in July, and today I had to get the product code for it so I could continue playing.

SWTOR appears under my games, but for some reason it says it’s unreleased when it was released 2 days ago (Also notice the goddamn BF3 beta game that I could find no way to remove from “my games”).

I click the info button and it says I purchased it on July 28th, and gives me a product code.

But the product code is not working, and says it’s already been used. And after 30 minutes with EA live chat support they say I haven’t ordered it, despite being able to say why it shows up under my games and gives me a registration code.

So now I have to go to the mall tomorrow and get a physical copy of the game. I could probably have ordered it on origin, but then I would end up having 2 battlefield games (1 not working) and 2 swtor games (1 not working) under “my games”. Also the downloadable game is 15$ MORE expensive than the on in the store.

Fuck you Origin!

The waiting game

Friday, August 19th, 2011

EA Origin

Just 2 more months…

Pentecost programming

Monday, June 13th, 2011

For some reason almost everyone in Norway have the day of on “Pentecost Monday”. Not that I’m complaining, I slept until noon, got up to watch Doctor Who and Game of Thrones, but also managed to get lots of work done on my Startrek Game.

The game is almost ready for a little pre-alpha test which I’ve got about 15 volunteers ready for. Today I completed the final feature that will be implemented before this test, and maybe the most important feature of them all.

Trekwar Ship Combat

It was nice to see those stupid fleets that have been moving around my screen finally do something violent. My technologically superior (I cheat) scoutship blew that poor Klingon while taking almost no damage.

Implementing the combat between spaceships took about 5-6 hours of work today (lots of rules for selecting which ships to fight, calculate if they hit, calculate damage, etc..), so now I can start working on the testing scenario that all the testers will be playing through before the big multiplayer test starts.

Toodledo API (simple java version)

Sunday, June 5th, 2011

Wanted to get a list of all the bugs for my Star Trek game, that I have registered at Toodledo and have them listed on the Trekwar wiki.

Toodledo offers a nicely done API, but there was no java implementation, there were a couple of unofficial ones, but I decided to write my own very simple basic program for connecting to Toodledo and getting all the tasks as XML, and parsing them into a simple Java object. So if you’re doing something similar, this program might be a nice place to start. To keep it as short as possible, comments and exception handling is pretty much not there :)

download the file: Toodledo2html.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
 
class Task {
    String id;
    String title;
    String modified;
    String completed;
 
    String folder;
    String context;
    String tag;
    String status;
    String priority;
    String length;
    String note;
}
 
public class Toodledoo2html {
    // TODO you must get the 4 values below from Toodledo
    private static String appID = "x";
    private static String userID = "x";
    private static String userPW = "x";
    private static String applicationToken = "x";
 
    private static String fields = "folder,context,tag,status,priority,length,note"; // get these fields when downloading tasks
 
    private static String sessionToken;
    private static String key;
 
    private static String toodledoTokenURL = "https://api.toodledo.com/2/account/token.php";
    private static String toodledoGetTaskURL = "https://api.toodledo.com/2/tasks/get.php";
 
    public static void main(String[] args) {
        sessionToken = getSessionToken(md5(userID+applicationToken));
        key = md5(md5(userPW)+applicationToken+sessionToken);
        ArrayList<Task> tasks = getTasks();
        // do whatever to tasks
    }
 
    private static ArrayList<Task> getTasks() {
        try {
            String data = "?key=" + key + ";fields=" + fields + ";f=xml";
 
            System.out.println("Getting tasks: " + toodledoGetTaskURL + data);
 
            URL url = new URL(toodledoGetTaskURL + data);
            URLConnection connection = url.openConnection();
            connection.setDoOutput(true);
 
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuilder xml = new StringBuilder();
            String line = in.readLine();
            while( line != null) {
                System.out.println(line);
                xml.append(line);
                line = in.readLine();
            }
            in.close();
 
            ArrayList<Task> tasks = xmlToTasks(xml.toString());
 
            for(Task t : tasks) {
                System.out.println(t.id + " " + t.title);
            }
            return tasks;
 
        } catch (MalformedURLException ex) {
            System.out.println(ex);
        } catch (IOException ioe) {
            System.out.println(ioe);
        }
        return null;
    }
 
    private static ArrayList<Task> xmlToTasks(String xml) {
        ArrayList<Task> taskList = new ArrayList<Task>();
 
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new InputSource(new StringReader(xml)));
 
            Element root = doc.getDocumentElement();
 
            NodeList tasks = root.getElementsByTagName("task");
            for (int i = 0; i < tasks.getLength(); i++) {
                Element task = (Element) tasks.item(i);
 
                Task t = new Task();
                t.id = getDomTextValue(task, "id");
                t.title = getDomTextValue(task, "title");
                t.modified = getDomTextValue(task, "modified");
                t.completed = getDomTextValue(task, "completed");
 
                t.folder = getDomTextValue(task, "folder");
                t.context = getDomTextValue(task, "context");
                t.tag = getDomTextValue(task, "tag");
                t.status = getDomTextValue(task, "status");
                t.priority = getDomTextValue(task, "priority");
                t.length = getDomTextValue(task, "length");
                t.note = getDomTextValue(task, "note");
                taskList.add(t);
            }
 
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(Toodledoo2html.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch(SAXException se) {
 
        }
        catch(IOException ioe) {
 
        }
 
        System.out.println("xmlToTasks got " + taskList.size() + " tasks");
        return taskList;
    }
 
    private static String getSessionToken(String signature) {
        try {
            String data = "?userid=" + userID + ";appid=" + appID + ";sig=" + signature + ";f=xml";
 
            System.out.println("Getting session token: " + toodledoTokenURL+data);
 
            URL url = new URL(toodledoTokenURL + data);
            URLConnection connection = url.openConnection();
            connection.setDoOutput(true);
 
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String xml = in.readLine();
            in.close();
            String token = xml.substring(xml.indexOf("<token>")+7, xml.indexOf("</token>"));
            return token;
        } catch (MalformedURLException ex) {
            System.out.println(ex);
        }
        catch(IOException ioe) {
            System.out.println(ioe);
        }
        return "";
    }
 
    private static String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(input.getBytes());
 
            byte byteData[] = md.digest();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < byteData.length; i++) {
                sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException nse) {
            System.err.println("ERROR. MD5 ALGORITHM NOT FOUND");
            return "";
        }
    }
 
    public static String getDomTextValue(Element element, String tag) {
        if (element != null) {
            NodeList nl = element.getElementsByTagName(tag);
            if (nl != null && nl.getLength() > 0) {
                Element el = (Element) nl.item(0);
                if(el != null && el.getFirstChild() != null) {
                    return el.getFirstChild().getNodeValue();
                }
            }
        }
        return "";
    }
}

Note: This program was made to run once per hour.. running this program many times in a row will cause Toodledo to ban you for about 1 hour. When that happens there will be a IndexOutOfBoundsException -7 from the method that gets the session token. This can be fixed by saving the token you get between requests, and not asking for a new one each time (which is what causes the short ban).

Looking forward to E3 2011

Tuesday, May 31st, 2011

It’s almost time for E3, where the Gaming studios release lots of new info, screenshots and videos from the games they are working on.

This year I only got a few games I’m following:

X-Com (2K Games/Take-Two):
Huge fan of the original X-Com games, but so far I’ve been unimpressed by the video (the black blob being chased around). But hopefully some more interesting gameplay footage will be released.

Battlefield 3 (Electronic Arts):
Not really a huge FPS gamer, but I enjoyed Bad Company 2 alot, and Battlefield 3 looks awesome.

The Elder Scrolls V: Skyrim (Bethesda):
Never finished Oblivion (was not a huge fan of the combat system), but if time permits I might play Skyrim.

Dead Island (Deep Silver):
Got noticed for their really awesome trailer, but not so sure about the game itself. Seems like Left 4 Dead with minor RPG elements added. And it seems to focus very much on melee combat, and afraid it will be to much of a hack and slash game (not a fan).

Star Wars: The Old Republic (Electronic Arts):
Saved the best piece for last.. I hope they will provide LOTS of new information, and gameplay from the latest builds. This is the game I’m looking the most forward to as of 2011, and I’m definitely going to play it when it’s released.

Google calendar update

Sunday, May 29th, 2011

Google Calendar got a really REALLY nice feature last week (I think):

Google calendar Even Color

Now you can set a color for each event (individual or recurring). Previously you had to have several calendars to do color coding, and that made it awkward for sharing.

Yay!

Game Review: Majesty 2

Friday, May 13th, 2011

I recently got Majesyt 2 on steam. And to sum it up in 1 sentence: “Majesty 2 sucks!”

Majesty 2 is a RTS game which calls itself a “kingdom simulator” with RPG elements.  You build structures, but never control the units directly. The units live their own lives, level up, buy gear at the blacksmith and generally just go around like little tiny virtual idiots.

The graphics are charming and gives the game a nice fantasy atmosphere, building is fun, researching techs are pleasant and the RPG features of the heroes you recruit seems really good. Also the concept of not controlling units directly but by placing out flags (putting bounties on enemy structures or creatures, or putting up exploration flags) does seem pretty interesting.

However there are three major issues that are just bad game design and ruins what could have been a pretty enjoyable game:

Majesty 2

1) Sewer entrace spawn points
The first thing I noticed that I knew instantly was going to grid my gears for the entire game was one or two spawn points that always pop up in your town. These frequently release various rats that will kill your peasants, damage your buildings and just be a constant source of annoyance the entire mission, for ALL missions. Don’t get me wrong, sewers is a classic RPG setting, and if done correctly it could have been very entertaining, but it ends up being a steady stream of annoyance without any reward or fun. Imagine 3 zerg popping up in your base in Starcraft EVERY fucking minute, worst idea ever.

2) AI
Another annoying factor is the AI. It’s piss poor… You have ranged/melee dps and a healer class, but watching them trying to do anything is like watching the worst PUG of noobs trying to down a boss in WOW.. It’s just ends up being a painful display of ineptitude. And the cloth users seems to have a particularly strong death wish, and constantly go in for some melee dps.
The enemy AI is even worse than your own heroes. I saw 3 skeletons chase a wounded ranger across the map while their home was being destroyed by a warrior.

3) Borders + combat
Let’s get one thing straight, you will not be able to have any clearly defined zones of combat, fronts or build a good defense for your town like you can in for example Starcraft, Warcraft, Age of Empires or basically any RTS game. The enemies will be many, they will be spread out all over the map, new enemies will spawn pretty much constantly even when their spawn points are taken out. The enemies are stupid as hell and just consists of groups of enemies that attack in waves without any form of strategy.

4) Voice acting
Not as big a problem as the 3 above, but it’s still a bit funny :)
It seems they have hired a single voice actor to do the game, he will tell you your quest objectives and talk during all cut scenes, intros, etc.. Now this would not be a problem, except they got a goddamn Sean Connery sound-alike who does an excessive Scottish accent. He sounds like “Sean Connery” from the Saturday Night Live sketch, and it get’s really hard to take anything he says seriously.. I keep expecting him to say something like “The minotaurs has destroyed the village, Suck it Trebek!”

Rating: 3.7 / 10

SDCC ticket registration

Monday, November 22nd, 2010

Again, I tried to get my tickets for SDCC, but the server was taken down after 2 hours of fail (much like on November 1st.)
This is because the people responsible for this are a bunch of morons who are unable to handle a simple problem.

The problem:
you have tens of thousands of people trying to use a web server at a single moment.

This is not really a new problem, and unless your web application is utterly retarded, getting a webserver to handle 5000+ requests per second is no problem even on a single quad-core server. Getting a virtual server (cloud computing) that could take tons more would be dirt cheap since it would only be needed for a short while (1 day).

The solution:
It would be relatively simple to fix this, Just open the site to registrations. Let users enter Name and email address. Then send them a  confirmation. Don’t do any of the “heavy” back-end stuff like charging credit cards which can take some time. Then when everyone have registered, just e-mail them (in the order in which they registered) a link to a page where they can pay for the ticket and enter all the details (address, etc..). That way the initial flood of requests can be dealt with very efficiently and the stuff that takes longer time can be spread out over several days/weeks.

Now maybe the existing registration software they chose this time does not support this, but jeez.. Letting people enter their info and connect this to a payment is not fraking brain surgery. Any programmer could do this in 1-3 days without a problem.

Or if you insist upon using a heavier system, at least use some sort of load balancing..  Let the main server accept connections, organize them in a queue and then gradually transfer the users to the server that actually handles registrations. I’m completely baffled that a huge event like SDCC is unable to find someone who is able to do such a simple task in this day and age.

The conclusion:
Someone stupid took on the job of handling the registrations (epicreg.com) when they clearly had no way of handling that many requests, and there is no excuse cause they know what happened on November 1st. What does it all mean in the end, nothing. What are we going to do? boycott Comic Con? yeah right… I’m pretty sure SDCC could get away with literally crapping on the visitors, without having problems selling all the tickets.