Mass Effect
After completing Dead Space, I finally got around to wanting to complete Mass Effect. Up until this point, I had found it really boring, with an impossibly large galaxy with planets to explore, and many quests which made no sense. The navigation didn't make sense, but after putting some effort in, I figure everything out, and made us of the quick alternate transport methods when in the Citadel, since using the elevator was as spontaneous as dead frog in a fly farm.
The story started to grip me, and I finally figured out how to complete the mission on the snow planet with the laboratories, when I realised the car had two guns, which made taking out shields a lot easier. One thing I did notice though when driving around planets I landed on, no matter what I did, I couldn't get the car to turn over, I could drive off mountains, and not even take a hint of damage. Still I'm sure that would have annoyed me more than the relentless driving across rough terrain to discover every listed on the map, plus additional things I found along the way on the minimap.
Nearing the end of doing lots of pointless missions which helped me level up vastly and gain superior weapons, armor and upgrades, I soon realised I wanted more story since this was starting to get boring, and began to play the storyline rather than side missions of "killing someones sister since they made them look bad", which gave me a morally grey reputation. I had fun with this on the first planet I went to, where I gave up the name of a guy who had information about someone breaking the law, and then using the points I had gained to improve my charm talents, and getting the guy with the information to convict the one who had just rewarded me for helping him out.
The story gets deeper until you find out that this galaxy is like the Matrix and its not the first time that a superior race has gone extinct, and now the same is destined for the humans too, and is long overdue, due to a secret facility made by the Prometheans. Finally a showdown ensues, and you get to decide who lives and who dies (I chose them to die, apart from the love interest who I failed to make have sex with me, it was probably the weird blue alien consort who Shepherd bedded earlier that put her off).
The game was overall very fun, and I look forward to the sequel to find out what happens next. Though I hope they add more to do, doing missions that involve travelling to other regions of space, then entering buildings and killing the same basic enemies over and over, just isn't as fun as it use to be, and the rewards are little. Though I did like the weapon and upgrades system when I worked out how it worked.
Dead Space
Dead Space is the first survival horror I've played since the Silent Hill series. The game starts as you, an engineer sent to fix a ship that apparently has a technical problem with its communication array. Only to find out after you dock, that the dead crew have somehow morphed into necro-something and want to kill you. Unlike usual shooters, unloading entire clips in the chest of an enemy doesn't kill them, and if it does, you've wasted a lot of ammo. The correct method is to shoot off their limbs, and not their head (which it turns out makes them more dangerous since despite being blind, still manage to find you in a 100 foot square room).
One thing that really must be mentioned about this game, is the amazing menu system, which appears in front of the character, and doesn't pause the game, which can be annoying when you want to heal, but its nicely done. Despite the story being practically like Aliens, only with a zombie virus that mutates the dead and makes the living go mad.
After fighting the enemies a few times they become predictable, you can tell that if a room is empty, it soon won't be or a brute is nearby. And if there is someone on the floor, it is best to shoot them anyways, just to be sure. One thing I didn't expect was the fact they can survive in the vacuum of space, which would make sense since they are already dead, but if that was true, why would removing their limbs stop them, but when you first enter and vacuum and then return via the same route, you don't expect to see one in front of you, as well as not being able to hear them (one nice feature I like that is in there). And for some reason, everytime you enter a quarentine room you can always bet that the doors will lock, and despite being designed to keep things within getting in or out, they have surprising amount of air vents that allows enemies in but hold you there.
Not even babies were safe from this thing, and for some reason this ship either carries one hell of a slutty crew compliment and the worlds largest abortion clinic onboard where they store the dead fetus', or they were transporting a breeding colony since when you enter the medical area, you suddenly notice all the dead babies on the wall, and the necro-baby version of them running on the walls.
The game is very linear, there is not much chance to explore, and I did not realise I had to shoot the green XBoxes boxes to gain what was inside of them, or that anything that glows blue contains something I can use till I got to the second level, at which point I got on the tram to go back, only to realise that I couldn't. However it is easy to get around thanks to the lazer you can project on the ground to show you were to go, and the game makes good use of the ambient sound, so much so that walking around usually I keep the gun ready, even when going through areas where I had already killed everything.
Occasionally you come by crew members that have somehow survived, that have either gone mad and worship these necros as life after death because of some weird religion based on a guy who said he saw a UFO, or they die the moment they meet you since your bad luck apparently.
The one thing thats annoying, but in a good way, is the lack of ammo up until near the end of the game, most of the time I'm spending my money to upgrade my character so I don't die as quickly. When I reached the barracks on the solider ship, I knew I was about to be bombarded by hordes of enemies, mainly super fast necro zombies.
The last boss was too easy in my opinion, just a combination of knowledge of enemies already faced, I felt the indestructable necro zombie was more of a challenge, and even he was easy to hold back when you realise that the time-freeze gun is what to use against him. Still there was a great choice of weapons, though I stuck with the basic starter one to get the achievement for completing the game only using that one. A lot of the achievements available seems impossible to get on the first run through, but as usual you get an achievement for every chapter you complete, which I don't count, you might as well get an achievement to kill every enemy you come by in the game, not like you have a choice anyways with the stupidly long delays in opening a critical door when a boss is chasing after you.
Still, I really enjoyed this game, and it scared the hell out of me in some places, with enemies jumping out that I didn't expect. I recommend you also watch the mini film, Dead Space: Downfall, which gives the backstory mory padding when you've completed it, at which point you will will understand everything (if you didn't read all the logs lying around).
Mirror’s Edge
I finally got around to completing this game. It is a nice concept, I do love the free running, which they did very well. I found that after a while, I didn't need to the red runner vision stuff, I could just blind jump and plan once in the air (although sometimes falling to my death). Some paths appeared to be fixed in how to get to them, whilst others seem to be more flexible. Falling seemed a little dubious, I made a 4 story fall and survived, I'd still like to know how that happened, and I find a pipe I could fall on top of, then shimmy backwards enough to fall down and grab the pipe. I think there may be a way to street level if I tried so I might go back and have a go.
The combat annoyed me, even with time slowed down, disarming police/guards seemed near impossible, even though I pressed Y when their weapons were red, it just didn't seem to work, to the point where I just gave up, got their gun and decided to shoot them instead. I don't understand how you are suppose to stop the machine gunnist on the hard mode, they're hard enough to get to as it is, and if you want that Complete the game without killing anyone achievement, that will just make the game a whole lot harder.
The ending seemed rushed, I didn't get the big battle I like, or having to do an epic free run chased after the helicopter, but at least it left it open for a third.
Visually I loved the contrast of colours, how the world either appeared or did turn white when in pursuit, and even the evil runners from Project Icarus. I loved to read the little messages when in the elevator too, like how to tell if your child is a runner, which reminded me of how to tell if your child is a hacker. Do they have a fondness of the colour red? Despite the annoying combat, and the repetitiveness, I look forward to a sequel, hopefully they'll flesh it out more, and maybe give more of a free roaming city, rather than levels that tie you to one area.
Gears of War 2
I loved the first Gears of War, although not my usual kind of game I buy and plan, I liked how the story was progressing, and the combat situations. Even though linear, it is fun. Gears of War 2 expands and leaves off from Gears of War 1. The lightmass bomb from the first one didn't destroy the locusts, it just pissed them off more.
One thing I liked about the new one is that there is clippings and articles, explaining the origin of the locusts. In the first one, I thought maybe they were an invading alien race, or possible COG was invading their planet. But turns out they are actually genetic experiments gone wrong at a COG facility, possibly to create a master race.
In this one I found I run out of ammo more, so I got use to using the chainsaw whenever I could, and despite keeping an eye out for clippings, I have missed a lot of them which I plan to go back and get. There are some really fun weapons such as the flamethrower which is great against weavers. A lot more reaver attacks too.
The game seemed more focused on vehicle combat near the end, first on the bastile or whatever its called, and the reaver fights, and the awesome gun tank.
I can't help but think if the real army chainsaw guns and badass gears for you to wear, more people would join up. Killing the worm was an enjoyable storyline, when I was watching my friend John doing it, I remember saying "wait don't worms have multiple hearts", at which point after destroying the first, a second one working twice as hard could be heard.
The ending left it open again like in GoW, so I guess I have a few years before GoW3, but I look forward to it.
AGT: Using XBox360 Pad with XInput
For my AGT assignment I've decided to use a XBox 360 pad for input since I found out it can be used in Windows. To do this requires use of the XInput library that comes with DirectX.
So after setting up my input manager which automatically updates all input devices (there can be a maximum of four pad devices, defined by the variable XUSER_MAX_COUNT in the XInput header), I began work on the controller class to manage the state information about the pad.
The following header is my source for this class, when a controller is created, an id is passed to it that is used as the pad index for XInput.
#ifndef CONTROLLER_H_INCLUDED
#define CONTROLLER_H_INCLUDED
// --- [ libraries ] ------------------------------------------
#pragma comment(lib, "XInput.lib")
// --- [ includes ] -------------------------------------------
#include <windows.h>
#include <XInput.h>
// --- [ class ] ----------------------------------------------
class Controller
{
//
public:
enum Button
{
kButton_DPad_Up = 0,
kButton_DPad_Down,
kButton_DPad_Left,
kButton_DPad_Right,
kButton_Start,
kButton_Back,
kButton_Thumb_Left,
kButton_Thumb_Right,
kButton_Shoulder_Left,
kButton_Shoulder_Right,
kButton_X,
kButton_Y,
kButton_A,
kButton_B
}
enum AxisType
{
kAxis_Left = 0,
kAxis_Right,
kNumAxisTypes
};
enum MotorType
{
kMotor_Left = 0,
kMotor_Right,
kNumMotorTypes
};
enum TriggerType
{
kTrigger_Left = 0,
kTrigger_Right,
kNumTriggerTypes
};
struct AxisData
{
double x;
double y;
};
// Attributes
private:
const unsigned int m_id;
bool m_isConnected;
unsigned int m_currentButtons;
unsigned int m_previousButtons;
AxisData m_axis[kNumAxisTypes];
float m_triggers[kNumTriggerTypes];
double m_motorSpeed[kNumMotorTypes];
// Functions
public:
// Constructor
Controller( const unsigned int inControllerId );
// Check button has just been pressed
bool IsButtonDown( const Button inButton ) const
{
return ( ~m_previousButtons & m_currentButtons ) & ( 1 << inButton );
}
// Check button has just been released
bool IsButtonUp( const Button inButton ) const
{
return ( m_previousButtons & ~m_currentButtons ) & ( 1 << inButton );
}
// Check button is pressed
bool IsButtonPressed( const Button inButton ) const
{
return m_currentButtons & ( 1 << inButton );
}
// Get Thumb Axis
void GetAxis( const AxisType inType, AxisData & outData ) const
{
outData = m_axis[inType];
}
// Get Trigger Values
float GetTrigger( const TriggerType inType ) const
{
return m_triggers[inType];
}
// Get Motor Speed
double GetMotorSpeed( const MotorType inType ) const
{
return m_motorSpeed[inType];
}
// Set MotorSpeed
void SetMotorSpeed( const MotorType inType, const double inValue );
// Check Controller is Connected
bool IsConnected() const
{
return m_isConnected;
}
// Get Controller Id
unsigned int GetId() const
{
return m_id;
}
// Update
void Update();
private:
// Update an Axis
void UpdateAxis( const AxisType inType, const short inX, const short inY );
// Update a Trigger
void UpdateTrigger( const TriggerType inType, const unsigned char inValue );
};
All values that are variable are values between 0.0 and 1.0 in the case of triggers and motor speeds, and -1.0 and 1.0 in the case of axis components. You may have noticed that there is only one function that can change values explicitly, SetMotorSpeed(), the only other way to change values is direct input from the controller, so Update() must be called every frame.
You may notice that the division used to normalise the speed is 0x7FFF instead of 0xFFFF, this is because the number is signed, not unsigned like the other values we normalise.
Calling Update() more than once will break the IsButtonUp() and IsButtonDown() calls to always return false since they are based on the previous button states gotten by an update call.
The following is the source code for the controller class source file.
// --- [ includes ] -------------------------------------------
#include "Controller.h"
// --- [ constructor / destructor ] ---------------------------
Controller::Controller( const unsigned int inControllerId )
:
m_id( inControllerId ),
m_isConnected( false ),
m_currentButtons( 0 ),
m_previousButtons( 0 )
{
for( unsigned int i = 0; i < kNumAxisTypes; ++i )
{
m_axis[i].x = 0.0;
m_axis[i].y = 0.0;
}
for( unsigned int i = 0; i < kNumTriggerTypes; ++i )
{
m_triggers[i] = 0.0f;
}
for( unsigned int i = 0; i < kNumMotorTypes; ++i )
{
m_motorSpeed[i] = 0.0f;
}
}
// --- [ functions ] ------------------------------------------
void Controller::Update()
{
XINPUT_STATE state;
// Get new controller state and check if it is connected
m_isConnected = XInputGetState( m_id, &state ) == ERROR_SUCCESS;
if( !m_isConnected )
{
return;
}
// Set New Axis Positions and normalise
UpdateAxis( kAxis_Left, state.Gamepad.sThumbLX, state.Gamepad.sThumbLY );
UpdateAxis( kAxis_Right, state.Gamepad.sThumbRX, state.Gamepad.sThumbRY );
// Set New Trigger Values and normalise
UpdateTrigger( kTrigger_Left, state.Gamepad.bLeftTrigger );
UpdateTrigger( kTrigger_Right, state.Gamepad.bRightTrigger );
// Set previous button states to m_currentButtons, and current button
// state to new button state.
m_previousButtons = m_currentButtons;
m_currentButtons = static_cast<unsigned int>( state.Gamepad.wButtons );
}
void Controller::SetMotorSpeed( const MotorType inType, const double inValue )
{
XINPUT_VIBRATION vibration;
m_motorSpeed[inType] = inValue;
vibration.wLeftMotorSpeed = static_cast<WORD>( 0xffff * m_motorSpeed[kMotor_Left] );
vibration.wRightMotorSpeed = static_cast<WORD>( 0xffff * m_motorSpeed[kMotor_Right] );
XInputSetState( m_id, &vibration );
}
void Controller::UpdateAxis( const AxisType inType, const short inX, const short inY )
{
const short kAxisDeadzones[kNumAxisTypes] =
{
XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE,
XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE
};
m_axis[inType].x = 0.0;
m_axis[inType].y = 0.0;
if( inX < -kAxisDeadzones[inType] || inX > kAxisDeadzones[inType] )
{
m_axis[inType].x = static_cast<double>( state.Gamepad.sThumbLX ) / static_cast<double>( 0x7fff );
}
if( inY < -kAxisDeadzones[inType] || inY > kAxisDeadzones[inType] )
{
m_axis[inType].y = static_cast<double>( state.Gamepad.sThumbLY ) / static_cast<double>( 0x7fff );
}
}
void Controller::UpdateTrigger( const TriggerType inType, const unsigned char inValue )
{
m_triggers[inType] = 0.0f;
if( inValue > XINPUT_GAMEPAD_TRIGGER_THRESHOLD )
{
m_triggers[inType] = static_cast<float>( inValue ) / static_cast<float>( 0xff );
}
}
And that is all that is required for getting state information from a XBox 360 pad.



