Showing posts with label Civ5. Show all posts
Showing posts with label Civ5. Show all posts

Monday, 14 July 2014

Gaming Update - WarThunder, World of Tanks, CivV and MechWarrior

I slept like a log last night, I think finally having picked to support a Team in Germany and their winning a match satisfied me... I did actually shout out when they scored... Though I didn't like the propensity of the commentators on both BBC and ITV to support Argentina because they apparently like Messi... But, each to their own I suppose, I don't think he was worthy of "player of the tournament", I actually think his performance looked somewhat lacklustre over all.  I don't doubt there were bursts of brilliance, but the radiant glow out of his backside didn't shine so bright as to eclipse others.

Anyway, football aside, I played games... I played World of Tanks, I played WarThunder, I played Civilization V and I played MechWarriorOnline...

WarThunder
I spent the most of my time in WarThunder, initially I got my Track IR4 and my Seitek X45 out and set about setting up the simulator standard controls.  I've got to be honest, I still find setting up the controls in WarThunder to feel very soppy, its not a clean interface... There are ways to slide and slip "yes" to "no", but to my eye the indicators point backwards, and the axis auto-detect was okay, but I kept second guessing what I was doing... "Put your axis...bla"... And you're looking and wondering is that "bla" or "bla"... but Bla was BLA!... Just doesn't sit right, I'd have to say perhaps a native English speaker should have a trawl through the process there and give Gaijin a flow chart to improve it for English speakers... As I have spoken to a native Russian speaker and they informed me that it made perfect sense to them... One can only say it's a culture thing perhaps?

One thing I am certain of however, and its something SideStrafe mentioned in his latest Strafing Run that Gaijin don't like to be told there are problems with their product... I'd love to know what SideStrafe found issue with and reported to them, but I have a fair few items sent their way - both privately and openly on the moderated bug forums - and the more I see such issues, and the more evidence of them I seem to have sent, the less feedback I get.


It is rather strange to have a group so eager to talk to you, but the moment you find fault they sent you into Coventry.  I'd call it rude, but then I'm English and what we consider rude seems to engulf half of modern day fashion & life styles.  But having spoken to a few peeps it seems to perhaps be an Eastern European thing... Folks working on the Witcher didn't like criticism... WarGaming don't like it... and it seems Gaijin don't either.

So, what of the games I've played, well first of all, the latest patch to WarThunder, allowing queuing on specific servers has cured one problem.  I used to play the game set to "Any Available" server, now I can set it to use five different servers and I'm getting a whole lot more games a whole lot faster.

For a long time queues in the client looked like this:




As you can see the American bent on the nations being queues was obvious.  Now however numbers are much higher in all tiers and nations, and one can pick and choose to play however one wants, which is very much a welcome sight.

I've also spent a lot of time playing Arcade Ground Forces, to unlock and skill up my Russians.  I've pushed right up the T34 line and really enjoyed playing!

I have to say there's a huge difference in the fire power of Russian to German Tanks, the Russians are much more fun to play in the low tiers, and it was not until I got hold of the 50mm L11 gun on the Panzer III did I have as much fun with the Germans.  Though I do love to jump out in a Panzer II with its 20mm and kill Stugs which other players are battering over and over to no avail... Just shoot the optics folks!


Another issue has been the number of players who are just seemingly inert to the positions around them, above you see me in one of my T34's taking the conquest point... We actually won this game... because I stopped and took the point and then held it... The chap there in the other T34, he had been sat by the side of the cap - even with enemy tanks in the cap circle - and was just sniping over at any enemy approaching... GET IN THE CAP CIRCLE PEOPLE!

Another activity I partook of was in test flight mode, trying to land various aircraft on carriers:


Like a Spitfire IX... bring them in low and slow, almost at the stall, and then drop them onto the deck, it worked most of the time, and proves you could reload some of the most unexpected aircraft on a carrier (at least in realistic mode, I doubt its possible in Simulator)...


Sometimes it went a bit wrong, but a repair is a repair, and off you go again... (Note: You don't have to take off from the deck, it puts you about 5km behind the ship going at full speed around 1000ft).

Another WarThunder item was the magic bullet, yet there's more ricochets sometimes than in an episode of the A-Team, here we see my T70... The indicator says I'm getting shot from my right... I'm already burning... So why am I not looking right?...


Well, firstly, I find the feedback system for tank damage in WarThunder to be wholly inadequate, it gives too little feel for where the damage it coming from, and though the sound effects are good they're not very directional - I've sat in a tank being hit with a 12lb lump hammer - you can tell which direction the hammer blows are coming from, it is not; as modelled in the game; like being in a bell chamber with reverberation all around.

But, here the red indicator is enough I know where the enemy is, so why is my camera looking the other way?...

Well, first of all, I was trying to see HOW the guy to my right was shooting me... well he was shooting me through a rock and a piece of ground... But worse still the animation for the shot was not coming from the right of my tank, it was coming out of that black pock marked rock to my left!...


I checked my replay, and it did not show this, it must have been a quirk at the time of playing in the actual engine... But it damned annoyed me.

World Of Tanks
Enough of WarThunder, I also played some World Of Tanks... I played two games... You know what, I don't think I'm going to play that game much more... Compared to ground forces its not very good, there's too elitist an undertow, you have to know the maps, you have to grind like crazy... and it doesn't leverage the full power of my machine to play, plus to have any hope of getting along decently you have to have memorised maps of the terrain in your minds eye, and a bunch of mods added which should be there by default... All in All, I think WarGaming need to improve dramatically as I'm swinging wildly towards playing WarThunder almost exclusively for my Air and Ground battles...

Civilization V
When I bought Civ5 (digitial pre-release) I was so excited, but I didn't get along with it... I think Civ2 remains the best in the series... and I liked Civ3 a lot too... But Civ5, I simply do not like, the hex's are okay I lived with that... The graphics are good, but the whole experience seems .. I dunno... Spongy to me... Don't like it, and I think the controls are a step too far away from the older series - I know a lot of them are common - but city controls are different.


However, I came back to play again try the game on maximum graphics settings and DirectX11 mode on my new Graphics card... Meah, still not impressed... So parked that one.

MechWarrior Online
The next title I dropped my eyes across, and which I've left installed, is MechWarrior Online. 


I came across this game from SideStrafe's coverage on YouTube, and I was always a big fan of MWO - played them years ago on my 486!  But this update was online, multiplayer and free to play!


I signed up and soon found myself in battle - more about that later.


My initial impressions are promising, I like the game, I like the look... And the battles are fairly easy to get into...I have a bone to pick with the interface again, in the hangar it is really complex, I've yet to find out how to customise a mech, and the myriad (literally hundreds) of mechs listed I'm not entirely sure what's going on.

I've roughly figured how to pick a mech and get playing, but I've no idea really what's going on... I need to investigate further.

My other problem with the game is that someone else has the name "Xelous"... I am Xelous, who the hell are they?!?!?!?!?!  So I had to sign up as "LordXelous" in that game.  I hate when my username is taken like that.

Saturday, 29 January 2011

Happy - Belated - New Year

Sorry, Sorry Sorry, I'm sorry to the masses of phantom no-ones not reading my blog, this is a very belated welcome to the new year.  I have not been blogging, I've not been writing, I've not been on the Internet.  I have however had a jolly good Christmas and been very busy at work.

I'm sorry to say that work took the majority of time, I'll not go into details, but lets just say that a person at work, whom had a couple of months to provide part of a system didn't deliver, and I was roped in with a week to go to get it done (which I did by the way - but I don't think anyone realises that my two day lash job code was over a third of this major project... Aaaaaanyway, enough said about that.

What have I been up to?  Well, on the 26th of this Month, I became an Uncle for the first time.  My little brother's wife gave birth to a beautiful baby girl (Awwwwww).  So, tomorrow I'm going over to meet her.

My dog has also been ill, he had to have an operation to remove a lump from his belly.  All it well however, he's bounced back and the lab work says it was just a fatty lump.  So all good.

I myself have been ill also, I've indeed been to the doctor today and been put on a few strange and strong pills.  I took one and then floated around Morrisons doing the weekly shop, I have no idea what I've bought.

In personal gaming time I've not actually had that much time, I did however receive a 60 day time card for World of Warcraft for Christmas... I didn't get Cataclysm! Just time.  So I have been really really really enjoying myself maxing out all my achievements on my various characters.  I've also created a new alt, whom I'm playing utterly solo (no help from my other characters money pots or skills)... and it's a bit of a new one for me, it's a Dwarf... My first Dwarf... and a Shaman... I've never played Shaman.  And I'm really enjoying that.



I'm happy to see that my predictions of the level to item level gap were correct, as people march about with 110K health, I'm also bemused to see people in "LFG" channels demanding a certain level of item... "Not got six months of raiding done on this three month old expansion?  Well fuck off noob"... It is not a pretty sight.

When the WoW time expires I have a line up of things to do, if you'll remember I bought a new gaming rig (Core i7 - 12Gb of RAM etc etc), well one of my RAID array hard drives gave up the ghost two weeks ago, so I've had the joy of a complete reinstall of my OS.  This means that apart from WoW I have no games on the machine.

So, Civ5 and Dragon Age are going to be my two games for February and March.



I have also spent an inordinate amount of money and purchased Microsoft Visual Studio 2010 Professional.  I'm not going to tell you how much it cost me, because just writing it down will make me feel sick.  But I have sort of fallen in love with it as a development environment.

Its not perfect, there are problems with building (sometimes) and its doing its intellisense with SQL Server... and even with 12GB of RAM and 8 CPU cores it is slow at updating the hints as it goes.  But for visualising your code, organising your development and debugging (watches especially) it is brilliant.

It is the first application I've been using which I know is using the new Direct2D and DirectWrite interfaces (themselves build on top if Direct3D 10.1 and DXGI.  And that elegance and low impact on the system (for what its doing there's very little impact on my system) has inspired me to go back to native programming.

So, I've taken my C# hat and decided to leave it in the office each night, and I come home and put on my C++ hat.  I've been thoroughly enjoying Scott Meyers book "Effective C++".



It is an excellent way to wrap your head back into proper progamming technique after a break into C# or Java.  Indeed the items contained within will often make reference to how "other languages" do things and how to attain the same thing in C++.

The net upshot of this return to my love of hard core programming has been a small C++ (Win32 - not CLR) wrapper system around Direct2D, which can take a handle from a C# form and draw the Direct2D graphics defined by the C# calls within.  Its so nifty I've been given a new project at work to make it a commercial grade project... which is nice.

Indeed right now, while writing this blog I'm researching something which I've never really used in C++, the function pointers.  As Meyers points out, its is a travesty that the C++ Compiler doesn't support proper delegate functions, it is in fact easier to implement proper delegates rather than function pointers... but still delegates are not part of the C++ standards.  Though I am going to be looking at what TR1 and Boost might be offering.

Anyway, for anyone puzzling all the information out there, here's how to call a "void function" which you've pointed at from another function.  The function "A::DoSomethingWithA" takes a void pointer to a function as a parameter and calls that function.   The function is "DoIt" and I just declare a class A and pass "DoIt" as the parameter, so here you go:


class A
{
public:

A ()
{
}

~A ()
{
}

// Call a void function pointer... so we run the exteral code given
void DoSomethingWithA ( void(*ExternalFunctionPointer)(void) )
{
ExternalFunctionPointer();
}
};


// The function we are going to be passing to be called from inside A
void __cdecl DoIt (void)
{
printf_s("Hello World");
}

// The main function, which declares a class A and Does something with a function passed as a pointer
int main(int argc, char* argv[])
{
A* a = new A();
a->DoSomethingWithA(&DoIt);
delete a;

getch();

return 0;
}

Wednesday, 15 December 2010

Civ and Code

So, what have I been up to?  Well, since the yule tide is rolling over us I've been incredibly busy at work.

I have however been enjoying Civ5, I'm reasonably happy to play the game, though in DirectX 10 mode is does crash out sometimes.  Hopefully the up coming patch for it will sort somethings out.

In the world of code, especially at work though, I have been very busy.  I have a project to put together, but as an aside I've been looking at the boost C++ libraries, one little ditty I recently had to sort out was a hostname resolver for IPv4, here is that C++ for anyone interested in boost:

// Investigation into Boost - 14/12/2010
// (c)2010 - Jon Bond

///
/// Function to resolve a URL as an IP Address
///
std::string ResolveURLAsIPv4 (const std::string& URL, const int Port)
{
#ifdef _DEBUG
char* msg = Debugging::AssignMessage(128);
sprintf_s (msg, 128, "ResolveURLAsIP (%s : %i)", URL.c_str(), Port);
OutputDebugStringA (msg);
DWORD StartTick = GetTickCount();
#endif


std::string result = "127.0.0.1";

try 
{
// Construct the resolver service we're going to run
boost::asio::io_service IOService;
boost::asio::ip::tcp::resolver resolver(IOService);

// Set up the IP query we're going to run on the resolver service
boost::asio::ip::tcp::resolver::query query(
boost::asio::ip::tcp::v4(),
URL,
boost::lexical_cast(Port) );

// Set up the query we're going to iterate through
boost::asio::ip::tcp::resolver::iterator i = resolver.resolve(query);

// Iterate through all the end points returned by the DNS query
boost::asio::ip::tcp::resolver::iterator endIterator;
for ( ;
i != endIterator;
++i)
{
// Get the current end point indicated
boost::asio::ip::tcp::endpoint currentEndPoint = *i;

// Process the result
if ( currentEndPoint.address().is_v4() )
{
result = currentEndPoint.address().to_string();
// break out of the loop
break;
}
}
}
catch (std::exception e)
{
#ifdef _DEBUG
sprintf_s (msg, 128, "Error in ResolveURLAsIP.");
OutputDebugStringA (msg);
delete msg;
#endif

throw e;
}

#ifdef _DEBUG
DWORD Diff = GetTickCount() - StartTick;
sprintf_s (msg, 128, "ResolveURLAsIP Complete [%d] %s => %s", Diff, URL.c_str(), result.c_str() );
OutputDebugStringA (msg);
delete msg;
#endif

return result;
}
Please note, I know I could cut down the number of boost::asio:: whatever indirections by using 'using' statements, but this is fully written out so I could understand what was going on.

The other ditty I've been playing with is Direct2D as part of DirectX 10 on Vista & Windows 7... here's my class to initialise the Direct2D interface:

// Investigation into Direct2D - 3/12/2010
// (c)2010 - Jon Bond

#pragma once

// The program main
#include "..\Program\Program.h"

// Include the header
#include "D2D1.h"

// Include the library
#pragma comment (lib, "d2d1.lib")

namespace GuiMain
{

// The gui
class Gui
{
private:
// Shows whether there has been an error
bool m_Error;

// The window handle
HWND m_WindowHandle;

// The factory
ID2D1Factory *m_Factory;

// The render target
ID2D1HwndRenderTarget *m_Target;

// Factory handlers
void SetupFactory();
void CloseFactory();

// Create the resources
void CreateDeviceResources();
void ReleaseDeviceResources();

// Get the window size
D2D1_SIZE_U GetWindowSize ();

// A white solid brush
ID2D1SolidColorBrush* m_WhiteBrush;

public:

// The gui constructor
Gui (HWND WindowHandle);

// The gui destructor
~Gui ();

// Draw something
void Render ();

};


}

Code:

// Investigation into Direct2D - 3/12/2010
// (c)2010 - Jon Bond
#include "GuiMain.h"

namespace GuiMain
{

// Constructor
Gui::Gui(HWND WindowHandle)
{
m_Error = false;

// The window handle
m_WindowHandle = WindowHandle;

// Set up the factory
SetupFactory();
}

// Destructor
Gui::~Gui()
{
// Release the device drawing resources
ReleaseDeviceResources ();

// Close the factory
CloseFactory ();

m_WindowHandle = NULL;
}

// Set up the COM class factory for this interface
void Gui::SetupFactory()
{
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_Factory);
if ( hr == S_OK )
{
CreateDeviceResources ();
}
}

// Close the factory
void Gui::CloseFactory()
{
// Release the factor, if it exists
if ( m_Factory != NULL )
{
m_Factory->Release();
m_Factory = NULL;
}
}

// The device resources
void Gui::CreateDeviceResources()
{
HRESULT hr ;

hr = m_Factory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(m_WindowHandle, GetWindowSize()),
&m_Target);
if ( hr != S_OK )
{
m_Error = true;
}
else
{
// Create the white brush
hr = this->m_Target->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF::White),
&m_WhiteBrush);

if ( hr != S_OK )
{
m_Error = true;
}
}
}

// The release the device resources
void Gui::ReleaseDeviceResources()
{
m_WhiteBrush->Release();
// Dispose of the tar
if ( m_Target != NULL )
{
m_Target->Release();
m_Target = NULL;
}
}
// Return the screen size
D2D1_SIZE_U Gui::GetWindowSize ()
{
RECT rect;
GetClientRect (m_WindowHandle, &rect);
return D2D1::SizeU(rect.right-rect.left, rect.bottom-rect.top);
}
// Render something
void Gui::Render ()
{
m_Target->SetAntialiasMode(D2D1_ANTIALIAS_MODE::D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
m_Target->BeginDraw();
m_Target->Clear(D2D1::ColorF(D2D1::ColorF::Black));
m_Target->SetTransform(D2D1::Matrix3x2F::Identity());
D2D1_SIZE_U size = GetWindowSize();
m_Target->DrawLine (
D2D1::Point2F(0.0f, 0.0f),
D2D1::Point2F(size.width, size.height),
m_WhiteBrush,
0.5f
);
m_Target->EndDraw();
}
}

Please note, all my code here is copyright 2010 - Myself, but you may use it as you see fit.  So long as you leave my copyrght notices and name on the code.