Updating the link in my post with this, thanks!Amp version of the page is a bit messy on desktop. Normal link for those who want it: https://www.pcgamer.com/all-this-ti...pid-ai-may-have-been-caused-by-a-single-typo/
Updating the link in my post with this, thanks!Amp version of the page is a bit messy on desktop. Normal link for those who want it: https://www.pcgamer.com/all-this-ti...pid-ai-may-have-been-caused-by-a-single-typo/
It's understandable that it could happen in the first place, but not that the typo remained there for half a decade before being noticed. I mean, the devs surely must have noticed at some point that the game footage people were capturing of the game's AI was off compared to what they'd put in the game.
Unless the difference isn't that big, which I guess remains to be seen.
I'm pretty damn sure some games i've played have had stuff labeled weirdly internally. Typos, swapped designations (Command&Conquer 1 has two units whose internal designations match the other unit better for reasons unknown), funny internal names for things, perfectly working code for balanced game feature commented out intentionally for no fathomable reason (parts of Skyrim's vampire script), modified copied version of a thing using slightly altered designation...Not least of which because sometimes spelling errors are intentional.
I suppose this is one of the problems of putting this kind of stuff in config rather than actual code...
In case of Colonial Marines, it really doesn't help the game has been very rushed and development outsourced. QA was probably nearly non-existent, even if they had figured out the AI had issues, devs probably didn't have time to figure out the issue.
Putting things like this in "actual code" is a very poor programming practice. Loading stuff externally from config files is done for several reasons. It affords a degree of flexibility that would otherwise make game development a nightmare.
this.I am still never going to play this game, but I'd be curious to see a comparison video of the different behavior.
You don't need to tell me, I'm very aware, I wasn't suggesting it's wrong at all (otherwise I'd be somewhat of a hypocrite.. configuration loading and support is one of the first things I set up in my projects).
Just that it's a balance worth considering when you decide WHAT to put in config, what are the risks of taking something out of an environment which will check your references before allowing you to proceed to one that doesn't? The risk here being that you break your game in ways that aren't necessarily super obvious and might make debugging harder. But balanced against all the other development benefits, it's probably one worth taking.
You can make the exact same mistake in actual code. I posted a page ago about how I did that with a printf statement inside my executable, not from an external file. Again, this looks like a key error in some sort of container list. That's not the type of thing which would be checked, really. Depends on how the key is used.
I only glanced over the config but got reminded by a real world issue I came across. In a largish java application, someone dynamically (and poorly) loading classes based on an array of strings in a config file using reflection, it wasn't a commonly hit bit of code - but it resulted in the application being shipped with a typo in the config and an uncaught exception bringing the application down.
There was actually no need to dynamically load these classes.. especially not based on values in config.. so it was all pulled out and done properly. This issue in the OP is obviously largely irrelevant to this - you're right, it just triggered a funny memory :)
The game had very troubled development, did it not? I would guess devs may have been aware of things being wrong but lacking time and resources to figure it out (and/or perhaps will too, wouldn't blame 'em if it was troubled production).It's boggling how no one caught this before now. Even if they didn't know what was causing it, surely someone noticed that the AI wasn't behaving the way they'd programmed it?
I'm curious to try this now.
Yeah, it seems that the project was just horribly mismanaged, so I guess that's the real answer here; whoever directed this game shouldn't be directing anything anymore. I even tried looking up who the director was and couldn't find a clear cut answer, what a weirdly managed development project.This wasn't just a programming error but a sign of something else.
Yeah their movement still looks weird, but at least they do a much better job at tracking targets.So I reinstalled this just because of this nonsense.
The AI is still dumb as nails, but it's definitely better than before. The game is so damn awful on so many levels. AVP 2010 is still the GOAT.
Also the human brain will autocorrect spelling errors without us even noticing unless it is exceptionally bad. That's why even highly acclaimed authors and scientist's use editor's for important submissions.The guy that wrote the .ini file is probably the guy that had to find his own error. He thought the word was spelled correctly the whole time so he didn't do shit about it.
Or their fucked Homeworld re-releases, absolute shitlords that they are.
Before
Here's how the xenomorphs behave to begin with. As Chris said in his review, they're all over the place, they're sluggish, and all around they come across as kinda dopey.
Now look at how they behave after fixing the typo. In my experience, they're not only considerably more aggressive, they're also much better at tracking the player. As an experiment, I tried just running away from one, a maneuver which would normally confound a xenomorph, and it stayed right on my tail.
They have the same files in some form.So like, what's the excuse for the console versions? I assume they don't use inis. Maybe I shouldn't assume...
So like, what's the excuse for the console versions? I assume they don't use inis. Maybe I shouldn't assume...
So like, what's the excuse for the console versions? I assume they don't use inis. Maybe I shouldn't assume...
This. Remarkably common, but at least it's getting fixed usually.I know what it's like to work with programmers that can't spell. This kind of stuff is frighteningly common. It isn't an unusual thing to see programmers that proudly display their ineptitude for language and communication, because apparently logical thinking and effective expression are incompatible.
AVP'10 is such a fucking good game. Like at the time I really enjoyed it but it's held up incredibly, it plays great for the most part, it's beautiful, atmospheric, and does so much so well. With the right direction and time, those guys could have made one hell of a colonial marines style game.So I reinstalled this just because of this nonsense.
The AI is still dumb as nails, but it's definitely better than before. The game is so damn awful on so many levels. AVP 2010 is still the GOAT.
That's funny. I can't even fault anyone for that - shit happens, and it sucks. It's easy to make simple mistakes.
I haven't ever worked on anything that's anywhere near as complicated as a game is, so I know nothing about working with anything so complex. That being said, something I don't understand is why no exceptions were thrown and caught down the road. In the dumb, simple code I write, if I try to call a function that doesn't exist, I get an error. Does it have to do with the function call being in an external file? Or is it something else I can't think of?
#include <stdio.h>
#include <tchar.h>
#include <map>
#include <string>
//Function number 1
int FunctionToCall1()
{
printf("Called function 1");
return 1;
}
int FunctionToCall2()
{
printf("Called function 2");
return 1;
}
//Create a typedefinition for a function pointer
typedef int(*Func)(void);
int _tmain(int argc, _TCHAR* argv[])
{
//create a map with strings for keys, values being function pointers
std::map<std::string, Func> FuncMap;
//Map "Test1" string to call Function1;
FuncMap["Test1"] = &FunctionToCall1;
//Map "Test2" string to call Function1;
FuncMap["Test2"] = &FunctionToCall1;
//Map "Test3" string to call Function2;
FuncMap["Test3"] = &FunctionToCall2;
//Create an iterator to traverse through out map of function pointers
auto it = FuncMap.begin();
//advance iterator twice
++it;
++it;
//run function that iterator is pointing to
it->second();
return 0;
}
#include <stdio.h>
#include <tchar.h>
#include <map>
#include <string>
//Function number 1
int FunctionToCall1()
{
printf("Called function 1");
return 1;
}
int FunctionToCall2()
{
printf("Called function 2");
return 1;
}
//Create a typedefinition for a function pointer
typedef int(*Func)(void);
int _tmain(int argc, _TCHAR* argv[])
{
//create a map with strings for keys, values being function pointers
std::map<std::string, Func> FuncMap;
//Map "Test1" string to call Function1;
FuncMap["Test1"] = &FunctionToCall1;
//Map "Test2" string to call Function1;
FuncMap["Test2"] = &FunctionToCall1;
//Map "Test3" string to call Function2;
FuncMap["Test3"] = &FunctionToCall2;
printf("%i\n", (int)FuncMap["Test1s"]);
//Create an iterator to traverse through out map of function pointers
auto it = FuncMap.begin();
//advance iterator twice
++it;
++it;
//run function that iterator is pointing to
it->second();
return 0;
}
Let me show you one way something like this could have an unintended effect without causing a crash, let's assume the following program:
-snip-
Just one of many, many ways this could mess everything up without actually causing any compiler error.