csanyk.com

video games, programming, the internet, and stuff

Game design evolution during the cartridge era of consoles

Someone asked a question on the AtariAge facebook community:

For those of you that grew up on the 2600, you know that the system was constantly improving.

Did you ever look for any benchmarks in games, improvements that let you know the “next big step” had occurred?

For me, I always thought that games with any sort of text were huge back in the day (like the Activision logo at the bottom of the screen), as were multi-segmented, multi-colored humanoids in games (such as Pitfall Harry).

This became very important for playground bragging rights as the Intellivision became more and more popular and us VCS acolytes had to ‘defend’ our system.

As a kid, were there any big “steps” you guys used to look for in your 2600 games to know Atari had reached its next level?

This is an interesting question.

I got an Atari 2600 when I was in first grade, in 1981. By that time the console had been out for 4 years already. We played it until the Atari 7800 came out, in 1986, but then switched over to NES, about a year later.

There wasn’t much in the way of a “bragging rights” war on the playground where I grew up.

Most kids who had any video game system at all had an Atari 2600, and we were happy to have them. I think many of us didn’t have anything (apart from arcade coin-ops) to compare with. I knew one or perhaps two family friends who had an Intellivision, and one family friend who had a Colecovision. I knew a lot of kids who didn’t have any videogame console at home. And I knew a few kids who had a home computer of some type (PC, Apple ][, Commodore 64, Atari 8-bit).

And some kids just had those little handheld LED games made by companies like Coleco, that weren’t quite videogames, but pretended to be.

We played all of them, although the LED handhelds were obviously inferior, and we grew tired of them quickly. Everyone just thought that video games were cool and fun, and we didn’t pay much attention at all to whether one system had better graphics. It was enough that it existed at all, and if it was available, we played it as much as we could.

The Intellivision households had a console that offered better graphics, but had awkward controllers and a smaller library. Colecovision had the Atari 2600 adapter and slightly less awkward controls compared to the INTV, but still a far cry from the simple, rugged Atari 2600 joystick. It also had a 10-second delay when booting, which we found annoying. We maybe noticed that the graphics were a bit better, but overall it didn’t matter as much as you might think. Graphics were important, but gameplay was by far the most important quality.

And of course we were well aware that the original arcade game always had much better graphics than an Atari 2600 port of the same title. That was understood, to be expected, and forgiven, most of the time (Pac Man and Donkey Kong not so much). But also the arcade games were harder, and were designed to suck quarters out of our pocket, while Atari games were designed to be challenging without being too frustrating, and to give hours of enjoyable play.

Bottom line: If a game was fun, it didn’t matter if it didn’t have the best graphics, but a game with amazing graphics that wasn’t fun to play was something we looked down upon. This has always been true, and always will.

Since the 2600 had been out a few years before my family got ours, I wasn’t all that aware of the release date of different games. Games existed, and when I learned about them for the first time I wasn’t even thinking about whether the game had just come out, or if it had been out for a while, and I had only just heard of it. Games existed; they just were.

I paid a bit more attention to publishers, and liked games by Atari, Activision, Imagic, and M-Network, and Parker Bros. the most. But even the publisher didn’t matter so much as the quality of the game. I would play anything and everything I could get my hands on, and continued to play what I liked, and returned to re-play games that I enjoyed frequently.

That said, we did take note of certain games that seemed to evolve through sequels, such as Pac Man > Ms. Pac Man > Junior Pac Man, Defender > Stargate, and Pitfall > Pitfall II.

Sure, some games did have poorer graphics, or simpler play, or just sucked, but aside from the direct sequels where it was obvious, we weren’t all that aware that one game was older or newer, or that one game had extra chips inside the cartridge that enhanced the circuitry inside the console. That was something that I learned about much later, when I was old enough to appreciate the technology and understand it a bit better.

But for the most part I didn’t think of game technology improving over time, I just thought “Hey this game is better” or “They really packed a lot into this game” or “This game is very sophisticated compared to that game.” In other words, to me it felt more either a design choice to make a game more or less sophisticated, or a matter of the developer’s skill or work ethic to make a game better or worse, than what the technology allowed.

It only became apparent to me that newer hardware could do stuff that simply wasn’t possible on older hardware when the Atari 5200 came out. I don’t remember when I first played the 5200, but my cousin had one, and I got to play on it a number of times when we’d go over to visit. He was the only kid I knew who had one, and its graphics were amazing compared to the 2600, but again the library was limited and the controllers weren’t as good as the 2600’s joystick. We speculated at the time that the 5200 games could have better graphics because the cartridges were physically bulkier, but the reality was this had nothing to do with it. Although, reinforcing this errant belief, NES cartridges also were bulkier, and had better quality games overall. We would have been very surprised back in the day to see just how much empty space was inside those plastic shells.

It still didn’t occur to me that there could be extra chips inside certain carts that made them capable of more sophisticated graphics and game play within the Atari 2600 library. It was certainly one of the factors that enabled a popular, older 2600 to continue to stay relevant in the market years after newer consoles had been introduced. But it wasn’t like we knew why the games that came out in 1982-84 often had better graphics than games that came out in 1977-81; we just knew they were good games and it seemed like maybe the developers were getting better at making them as time went on, but it wasn’t like the best of the old games weren’t still great. And there was certainly a lot of titles that were released on the 2600 late in its life cycle that were inferior to games that had been released years earlier. What was possible continued to improve over time, but actual quality varied quite a bit over the life span of the system, and seemed to have more to do with how much the developer cared (or had budget for) than with the year the game was produced in.

When the 7800 came out, we felt that it was the best Atari to have, as it had backward compatibility with the old 2600 library (that was still every bit worth playing) plus decent joysticks (at least they centered automatically!)

Of course when the NES came out, it was obvious immediately that it was a quantum leap over even the 7800, due to its vastly superior sound capability, which allowed all games to have a musical soundtrack to it that could not be equaled on any Atari console. At first I didn’t care for the NES gamepad, which didn’t have a joystick, but instead featured this odd thumb-cross we didn’t yet know to call a D-pad, which at first I found very uncomfortable and even painful to use, although my hands quickly adapted and got used to it. Again, the quality of the game play was what hooked me and got me to play through the hand cramps and blisters until my hands developed the stamina to hold the uncomfortable little rectangle. NES games didn’t just offer superior graphics and music, but more sophisticated types of play, where exploring and adventure became the dominant style of play, ascending to on par with twitchy hand-eye coordination skill and action. When the NES came out, everyone knew that a new age had dawned, and that the venerable Atari was obsolete. Most of us moved on, but a few never forgot.

A tale of two GML scripts: code optimization through iterative development

Today I wanted to share two versions of a function that I wrote, in order to show how my iterative approach to software development works when I am doing code optimization to improve performance.

This example comes from my iMprOVE_WRAP asset. It’s a function that returns the shortest distance (taking into account the wrap capabilities of the calling object) between the calling instance and a target object.

The first implementation works, in that it correctly does what it’s supposed to do, but I never released it, because I wasn’t satisfied that it was good enough code to ship.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
///iw_distance_to_object(target_obj, x1, y1, x2, y2, do_wrap_h, do_wrap_v,)
 
///@description Returns the distance_to_object from an improve_wrap object calling this function to another instance. 
///Compares all relevant points for the iw_object and returns the nearest distance, taking the wrap range into account.
///@param target_obj id of the target object to determine the distance to.
///@param x1 left x boundary of wrap range
///@param y1 top y boundary of wrap range
///@param x2 right x boundary of wrap range
///@param y2 bottom y boundary of wrap range
///@param do_wrap_h set whether the horizontal wrap is on (true) or off (false)
///@param do_wrap_v set whether the vertical wrap is on (true) or off (false)
 
 
//get the distance from the nine virtual positions
//return the shortest distance
var obj = argument[0];
var iw_distance, iw_distance_up, iw_distance_down, iw_distance_left, iw_distance_right, 
    iw_distance_up_left, iw_distance_up_right, iw_distance_down_left, iw_distance_down_right;
var tempx, tempy, shortest;
var x1, y1, x2, y2, range_width, range_height, do_wrap_h, do_wrap_v;
 
//keep track of original location of target object
tempx = x;
tempy = y;
 
//set up wrap range
x1 = min(argument[1], argument[3]);
y1 = min(argument[2], argument[4]);
x2 = max(argument[1], argument[3]);
y2 = max(argument[2], argument[4]);
range_width = x2 - x1;
range_height = y2 - y1;
 
do_wrap_h = argument[5];
do_wrap_v = argument[6];
 
//check distances
//check center
iw_distance = distance_to_object(obj);
 
if do_wrap_h && do_wrap_v //wrap vertical and horizontal
{
  //check corners
  x = tempx - range_width;
  y = tempx - range_height;
  iw_distance_up_left = distance_to_object(obj);
 
  y = tempx + range_height;
  iw_distance_down_left = distance_to_object(obj);
 
  x = tempx + range_width;
  iw_distance_down_right = distance_to_object(obj);
 
  y = tempy - range_height;
  iw_distance_up_right = distance_to_object(obj);
 
  //check left and right
  y = tempy;
  x = tempx - range_width;
  iw_distance_left = distance_to_object(obj);
  x = tempx + range_width;
  iw_distance_right = distance_to_object(obj);
 
  //check up and down
  x = tempx;
  y = tempy - range_height;
  iw_distance_up = distance_to_object(obj);
  y = tempy + range_height;
  iw_distance_down = distance_to_object(obj);
 
  shortest = min(iw_distance, iw_distance_up, iw_distance_down, iw_distance_left, iw_distance_right, 
                iw_distance_up_left, iw_distance_up_right, iw_distance_down_left, iw_distance_down_right);
}
if do_wrap_h && !do_wrap_v //do_wrap_h
{
  //check left and right
  x = tempx - range_width;
  iw_distance_left = distance_to_object(obj);
  x = tempx + range_width;
  iw_distance_right = distance_to_object(obj);
 
  shortest = min(iw_distance, iw_distance_left, iw_distance_right);
}
 
if do_wrap_v && !do_wrap_h //do_wrap_v
{
  //check up and down
  y = tempy - range_height;
  iw_distance_up = distance_to_object(obj);
  y = tempy + range_height;
  iw_distance_down = distance_to_object(obj);
 
  shortest = min(iw_distance, iw_distance_up, iw_distance_down);
}
if !do_wrap_h && !do_wrap_v
{
  shortest = iw_distance;
}
 
//return calling instance to original location
x = tempx;
y = tempy;
 
return shortest;

Let’s take a moment to appreciate this function as it’s written. It’s well-structured, documented, and expressive. First we declare a bunch of variables, then we do stuff with the variables, then we get our answer and return it. And this gives a correct result…

So what’s wrong with the above? It’s an inefficient approach, which checks each virtual position of the wrapping object. If the calling instance wraps vertically and horizontally, it has to temporarily move the calling instance 9 times and check the distance from each of 9 virtual positions, then return it back to its original position, only to return the shortest of those 9 virtual positions.

There’s also a lot of code duplication.

Still, it’s not horrible code. But it’s up to 9x slower than the distance_to_object() function it’s based on, if you’re wrapping in both directions, which will probably be common. I didn’t think that was good enough.

Rather than check each virtual location to see which is the shortest distance, we just need to know whether the horizontal and vertical distances are more than half of the width and height of the wrap region. If they are, then it’s shorter to go around the wrap. To know this, you simply take the x and y values of the two positions, subtract one from the other, and compare to the size of the wrap range. Once you know which virtual position is the closest one, you can temporarily place the calling instance there, and use distance_to_object() to get that distance. Put the calling instance back where it was, and then return the distance.

I realized as well that depending on whether the calling object wraps in both directions, you may not need to check for a wrap shortcut in the horizontal or vertical. So we can potentially avoid doing some or all of the checks depending on whether the do_wrap_h and do_wrap_v arguments are true or false. As well, this means we can avoid declaring certain variables if they’re not needed, which conserves both execution time as well as RAM.

I usually create local script variables in a var declaration, and assign the arguments to them so the code will be more readable, but I wanted to avoid doing that so that this function could be as lean and fast as possible. This might be an unnecessary optimization, but that’s hard to predict since I have no way of knowing ahead of time how this function might be used in a future project. In a project with many wrapping instances, it could very well be called many times per step, and every optimization could be critical. Since the script is intended to be included as a function in an extension, once I have it working properly it shouldn’t be opened for future maintenance, so making the script readable is not as important. So I opted to remove the local variable declarations as much as possible and just use the argument[] variables directly.

Also, to ensure that the wrap range is defined properly, in the non-optimized version of this function, I declare x1, y1, x2, y2 and assign their values using min() and max() so that (x1, y1) is always the top left corner, and (x2, y2) is always the bottom right corner of the wrap range. Technically for this function, we don’t care precisely where the wrap range is, only what the width and height of the wrap range are. That being the case, I can further optimize what I have here, and rather than use min and max, I can just take the absolute value of the difference of these two values.

It turns out that the process I went through to optimize this function is pretty interesting, if you care about optimizing. So I’ll go into greater detail at the end of this article about the approach I took to get there. But for now, let’s skip ahead and look at the finished, optimized function. Here it is, re-implemented, this time doing only the minimum amount of work needed:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
///iw_distance_to_object(obj, x1, y1, x2, y2, do_wrap_h, do_wrap_v)
 
///@description iw_distance_to_object returns the shortest distance in room pixels between two objects in the wrap range, 
///taking into account the horizontal and/or vertical wrap properites of the calling object.
///@param obj the id of the target object
///@param x1 left x boundary of wrap range
///@param y1 top y boundary of wrap range
///@param x2 right x boundary of wrap range
///@param y2 bottom y boundary of wrap range
///@param do_wrap_h set whether the horizontal wrap is on (true) or off (false)
///@param do_wrap_v set whether the vertical wrap is on (true) or off (false)
 
 
if !(argument[5] || argument[6]) //not wrapping actually
{
 return distance_to_object(argument[0]);
}
else
{
 //We're going to figure out which virtual position is the nearest to measure from
 //To do that, we have to compare the h-distance and v-distance of the calling instance and the target position
 //If this distance is <half the range size, then the original position of the calling instance is closest
 //Otherwise we have to use one of the virtual positions
 //Then we're going to temporarily put the calling instance in that location, get the distance, and put it back 
 
 //arguments
 var tempx = x, tempy = y;
 
 if argument[5] //do_wrap_h
 {
   var range_width = abs(argument[3] - argument[1]);
   if abs(x - argument[0].x) > (range_width * 0.5)
   {
     x -= sign(x - argument[0].x) * range_width; 
   }
 }
 
 if argument[6] //do_wrap_v
 {
   var range_height = abs(argument[4] - argument[2]);
   if abs(y - argument[0].y) > (range_height * 0.5)
   {
     y -= sign(y - argument[0].y) * range_height;
   }
 }
 
 var d = distance_to_object(argument[0]);
 
 //return calling instance to where it was
 x = tempx;
 y = tempy;
 
 return d;
}

We don’t need to measure all nine distances to know which is the shortest; we can tell by comparing the direct distance to the size of the wrap zone — if it’s less than half as big as the wrap zone, the direct distance is the shortest. If not, then we need to wrap. We can check the x and y axes separately, and if both are called for then we can just combine them.

The second function should be much faster to execute, and uses less RAM. How much faster? Well, let’s do a test project using my Simple Performance Test and compare.

Download the iMprOVE_WRAP distance_to_object test project

It turns out that the improved code runs about 50% faster than the old code! That’s a measurable and worthwhile improvement. Although, that said, the old function ran well enough that I could have released it, and likely it would not have been a problem for many uses, particularly in Windows YYC builds.

Appendix: Optimization through Iteration

(more…)

iMprOVE_WRAP 2.2 released

iMprOVE_WRAP 2.2 has been released.

I’ve added two new GML functions to the asset: iw_point_distance() and iw_point_direction(). These functions work much like the built-in GML functions point_distance() and point_direction(), except they take into account the iMprOVE_WRAP wrap region.

Release Notes

Version Notes
2.2 New functions:

  • iw_point_distance(): returns the shortest distance between two points, taking into account the wrap zone.
  • iw_point_direction(): returns the direction of the shortest distance between two points, taking into account the wrap zone.

Get iMprOVE_WRAP

GameMaker Marketplace

itch.io

Full Documentation

iMprOVE_WRAP 2.1 released

iMprOVE_WRAP 2.1 has been released. Get it at GameMaker Marketplace or itch.io.

Full Documentation.

Release Notes:

1.0 Initial release
1.0.1 Updated iw_draw_self_wrap() to use image_blend rather than c_white for the color argument.
2.0.0 Added new functions:

  • iw_draw_sprite_wrap(): an iMprOVE_WRAP version of draw_sprite()
  • iw_draw_sprite_ext_wrap(): an iMprOVE_WRAP version of draw_sprite_ext()

Improvements:

  • Boundary drawing now occurs at wrap corners as well.
  • Phantom collison checking also occurs at wrap corners.
  • iw_collision_wrap() and iw_collision_wrap_map() functions now incorporate do_wrap_h and do_wrap_v arguments, and only perform collision checks where they are needed. They still return a value for all locations, but where no check is needed, they return noone.
2.0.1 Improvements:

  • iMprOVE_WRAP demo resources have been placed in folders to keep them tidy when importing the asset into a project.
  • oIMprOVE_WRAP_demo sprite has been updated to allow for more precise positioning. Sprite is semi-transparent, with a yellow pixel at the origin
  • oIMprOVE_WRAP_demo object now draws guide lines indicating the height and width of the wrap range. This is useful in confirming that clone drawings and wrapping is occuring where it should.
  • iMprOVE_WRAP demo dashboard text has been updated to be a bit more clear
2.1 New functions:

  • iw_distance_to_object(): returns the shortest distance to the target object from the wrapping object, taking into account all directions available.
  • iw_distance_to_point(): returns the shortest distance to the target point from the wrapping object, taking into account all directions available.

New demo room for the iw_distance_to_object() and iw_distance_to_point() functions

 

N-Key Quest

It appears that a major obstacle to getting laptop makers to provide better keyboards is getting them to understand what properties matter to users.

I’m just one small person, but I am trying to raise awareness of key rollover and why it matters to laptop users.

A while ago, I had a chat with Lenovo Support. I had noticed that they had added an additional keyboard option to the P-series ThinkPads, and was hoping (though not holding my breath) that it might mean the new keyboard SKU would be for a model with acceptable rollover. Spoiler: The new keyboard option is for backlit or non-backlit keyboard, but they appear to have the same, poor, unacceptable key rollover characteristics as when I purchased my P50 last March.

But at first when I discussed with Lenovo Sales Support, they didn’t even understand what rollover is. I guess that’s not terribly uncommon; it’s a geek thing. But when your customers are geeks, it’s important to be able to speak about things they are concerned with, understand those concerns, and care about them.

Sales Rep: Hello, thanks for contacting Lenovo. My name is Quentin E.. I am reviewing your information now.

Me: Hi Quentin

Sales Rep: Hello, my name is Quentin with Lenovo Sales REP ID# #2900723431, at the end of this chat there will be a short survey that will pop up, Survey ranges from 1-9 and 9 being the highest, if you don’t mind taking a second to let my managers know how I am doing.

Sales Rep: I will be more than happy to assist with your purchase today

Me: I have a question about the ThinkPad P50. Last spring, I bought a P50, and at the time there was only one option for the keyboard. I see now that you are offering the choice of a backlit keyboard.

Me: I am very satisfied with my purchase overall, but with the keyboard I was very disappointed that it does not support N-key rollover.

Me: I am wondering what the key rollover property of the current keyboard offerings is?

Sales Rep: Are you looking to purchase an new keyboard today?

Me: potentially, if it offers improved key rollover to my current keyboard.

Me: are you familiar with what key rollover is?

Me: https://en.wikipedia.org/wiki/Rollover_(key)

Sales Rep: No I am not familiar

Me: that article will explain; it is the ability of the keyboard to register multiple simultaneous key strokes

Sales Rep: Are you interested in wireless keyboard ?

Me: I am a video game developer, and I have found that for my work in programming and testing video games that I make, the built-in keyboard does not reliably catch key strokes when more than 2 keys are pressed down at the same time. I’m forced to use an external USB keyboard if I am testing games. But I would like to replace the built-in keyboard with a keyboard that can hadnle multiple keystrokes, if that were a possibility.

Me: i’m not interested in a wireless keyboard, to answer your question.

Sales Rep: http://shop.lenovo.com/SEUILibrary/controller/e/web/LenovoPortal/en_US/catalog.workflow:item.detail?hide_menu_area=true&GroupID=460&Code=0B47190

Me: Like I said, I’m currently using an external keyboard, since the built-in keyboard doesn’t support N-key rollover…

Me: I’m just trying to find out whether there are any replacement keyboards available for the P50 that support higher key rollover. i’d prefer N-key, but 5 or 6 key rollover would be a major improvement.

Sales Rep: This is the only keyboard option for the P50

Sales Rep: other than the wireless keyboard

Me: I am seeing that there is an option for a backlit keyboard on the P50 — I don’t recall that being available when I ordered mine. If you could tell me what the key rollover property is for your offerings, it would be very helpful.

Sales Rep: can you provide the part number

Me: I’m looking, but i don’t see the part number. In the “configure to order” options for the P50, I see two options now: “Keybaord with Number Pad – English” and “Backlit Keyboard with Number Pad – English”

Me: and under help me decide it says this:

Me: Lenovo has refreshed the keyset on all ThinkPad laptops, outfitting them with the ThinkPad Precision Keyboard.

Me: This new keyset allows a more comfortable, fluid and accurate typing experience with it’s slate of individually rounded, spacious, and low-set keys. The ThinkPad Precision Keyboard simultaneously delivers a modern look and feel to your ThinkPad.

Sales Rep: That is only an option when config

Me: So I am wondering if this means that they have improved the key rollover property of these refreshed keyboards

Me: Surely the keyboard is an FRU that can be ordered? I would be interested to do so if you could tell me the key rollover.

Sales Rep: You can contact the parts department for additional information keyboard

Sales Rep: 855-253-6686 op 4

Me: ok.

Me: would you be able to pass feedback along to the system engineers who design the ThinkPad line, to let them know that this is an important characteristic?

Me: I would be willing to pay as much as $100 extra for a keyboard that supports N-key rollover, it is essential for my work.

Sales Rep: You can give the information to the parts department also

Me: ok

Me: this matters a great deal to me. As a satisfied user of the T-61 model, I felt it had the best built-in keyboard of any laptop I’ve ever used.

Me: I even wrote a detailed article on why it is the best.

Me: https://csanyk.com/2015/06/the-best-laptop-keyboard-yet-devised-by-humankind/

Me: It is one of the most popular articles on my blog.

Me: I will mention this to the parts dept as well.

Me: does the parts dept have a web chat feature or or email? or just phone number to reach them?

Please wait while we transfer your chat to the next available agent.

Service Agent is your new agent for the chat session.

Customer Service Rep: Hello, thanks for contacting Lenovo. My name is Mikella T.. I am reviewing your information now.

Me: hi…

Me: i was chatting with Quentin a moment ago, and then I guess he transferred me to you. Are you in parts?

Customer Service Rep: Hello Chris

Me: hi

Me: are you able to see my questions?

Customer Service Rep: Are you trying to reach the parts department

Me: Not really. I am just trying to get an answer to a question about the characteristics of the built-in keyboard for the ThinkPad P50.

Me: in the “customization” options for this model, it says “Lenovo has refreshed the keyset on all ThinkPad laptops, outfitting them with the ThinkPad Precision Keyboard.

Me: This new keyset allows a more comfortable, fluid and accurate typing experience with it’s slate of individually rounded, spacious, and low-set keys. The ThinkPad Precision Keyboard simultaneously delivers a modern look and feel to your ThinkPad.”

Me: I purchased a P50 last year, and at the time there was no option; I’m now seeing an optional backlit keyboard, and the description above suggests that the keyboards you’re shipping now may be different from what were shipped a year ago.

Me: so I am interested to learn the “key rollover” property of the currently offered keyboards

Me: my P50 does not register keystrokes if I have more than 2 keys pressed simultaneously (it may or may not register a third keystroke at that point). This makes it a poor keyboard for playing games. I am a game developer, so spend a lot of time testing games that I am making.

Customer Service Rep: Ok , so we are not the appropriate department for that

Me: so if the keyboards now offered have improved rollover, i would be interested to purchase and replace the one that i have.

Customer Service Rep: Perhaps the number provided by sales can assist you with that inquiry

Customer Service Rep: As this is customer support

Me: Quentin did give me the number for parts, but only a phone number. it is better for me if i could use chat or email to reach them. is that possible?

Customer Service Rep: Sorry that is the only contact information that we have

Me: ok what was the number again?

Customer Service Rep: 855-253-6686 op 4

Me: ok thank you.

I give them credit for trying. Normally their sales support people are very helpful and can provide detailed information, but it doesn’t seem like anyone at Lenovo have bothered to document their keyboards rollover characteristic, as though they don’t care or aren’t even aware that rollover is a thing.

I did call the number the Customer Service Rep gave me, but it didn’t get me anywhere. Their technical people still could not answer the question.

I suppose I could try ordering one of the new “ThinkPad Precision” keyboards (with a name that has Precision in it, you’d really hope that it would mean that the keyboard is capable of detecting precisely which keys are down at any given time, no matter which or how many.)

Perhaps I will stop by a local computer store and test out their ThinkPads to see if their keyboards are registering new keystrokes.

Seems like a pretty long shot….

Even so, I hope my fellow keyboard geeks can raise their voices and make themselves heard. If Lenovo gets enough feedback from users, I think it could make a difference in their future offerings.

GameMaker Studio 2.0 officially released, no longer in Beta

Yesterday, YoYoGames announced that GameMaker Studio 2.0 is out of beta.

Perhaps not coincidentally, I’ve noticed a bit of an uptick in purchases of my assets on the GameMaker Marketplace in recent days.

I have not yet updated any of my Marketplace assets for GMS2, but I believe that most of them should still work, although they may require the use of compatibility scripts generated by GMS2 on import in order to run in GMS2.

If you happen to have downloaded any of my assets, and find an issue with it, I am easy to reach for technical support.

The best way to reach me would be to send a message through the asset page on the GameMaker Marketplace. My email address is also in the documentation for the asset. And you can also reach me via the Contact page on this website.

Thoughts on the Nintendo Switch now that it’s out

Nintendo Switch is out. I still haven’t bought one. Wasn’t planning to right away, as I’m habitually not an early adopter when it comes to game consoles. Here’s my thoughts anyway.

After reading reviews for Legend of Zelda: Breath of the Wild I figured I would definitely buy a Switch. Before, I wasn’t entirely sure. I’m very intrigued to give it a play. One thing that worries me is the fact that your equipment wears out and breaks. I think that has potential for an under-utilized play mechanic, but on the other hand I think it’s a design choice that runs the risk of turning the game into a never-ending grind fest to keep up maintenance on your kit, and I don’t necessarily like the feeling of being on a treadmill.

I never bought a Wii U, either, and I still have yet to hear an announcement that Super Mario Maker will be coming to the Switch, which is insane. How can they not bring SMM to the Switch? It has to happen, right? Only, I’ve heard nothing. Since LoZ:BotW is also on the Wii U, maybe I should just buy a Wii U on clearance, save money, and enjoy both games?

But there are a few other interesting new titles that will be coming out on Switch in the near future, like Blaster Master Zero, which looks like a phenomenal remake of the original.

I was at GameStop earlier today, and to my surprise they actually had the Switch and accessories in stock. I looked at them, but didn’t buy. I’m put off by reports that there are reliability issues with the right-JoyCon control. When it comes to game consoles, I am almost never an early adopter, and stuff like this are a chief reason why. But I am also struck by how absolutely tiny the controls are for the Switch. I understand the console needs to be small enough to be portable, and I read that the controls are small, but in person they’re still shockingly small, even forewarned. I haven’t actually held one to see how they feel in the hand, but my initial impression is, “Geez, I sure hope they come out with an adult-sized JoyCon pair.” But I’m doubtful this will come to pass.

I also just heard that game saves aren’t transferable between Switch consoles, which is pretty lame. I hope that Nintendo rectify this, and allow game saves to follow a user’s account, or even be shared between user accounts so that friends can send each other game saves.

Update 3/07/2017

I’m back to undecided on the Switch.

Early reports from users suggest that the Switch hardware has a number of issues that are simply not acceptable. I believe these issues are addressable, but Nintendo really needed a flawless launch if they wanted to have a hope of recapturing the marketshare that they lost due to the unpopularity of the Wii U.

Joy-con connectivity failures, attributable to how the devices were designed and/or assembled. Potentially fixable by re-routing some wires inside the controller, or by using a bit of soldering know-how. But really this is a warranty problem, plain and simple. These are defects that Nintendo should own responsibility for, and fix for free.

Dead pixels on the handheld screen. Maybe I shouldn’t care about this very much, since my main use of Switch would be as a TV console, but Nintendo’s policy is that dead pixels are a normal property of LCD displays, and that they don’t fix them because they don’t consider them to be broken. WTF, Nintendo.

The more I think about it, the more I wish the Switch weren’t trying so hard to be innovative. I think what Nintendo did to make it a viable console/handheld hybrid is amazing, but I think the result of hybridization is compromise. Switch compromises as a console because it lacks the processing power that full consoles like the PS4 and XBox1 have. It compromises as a handheld because of it’s somewhat inconvenient size and relatively short battery life.

That means that the only innovation left is with the joy-con. And while they do have some of the most clever design aspects we’ve seen on a controller to date, such as the HD rumble, their multi-use, multiple configuration design, and being packed with features, here too are compromises. The joy-con are tiny and not necessarily the best in ergonomics. And they have some reliability issues that Nintendo simply must address quickly and completely.

For what I would personally want out of a next-gen Nintendo console, it would be to be able to play games like Legend of Zelda: Breath of the Wild, at full 1080p, or even 4K resolution, with a good, full-size controller like the Switch’s pro controller. I’m very unlikely to take advantage of the portable/handheld aspect of the Switch, nor am I very likely to use Switch as a party/social game platform. I do think it’s cool that Nintendo are thinking about such use cases, but they are simply not use cases that I see myself doing much, if at all.

I find myself wondering what hackers like Ben Heckendorn will do with the Switch. Ben Heck has made himself into a minor celebrity over the last 10 years or so, by doing ingenious hacks of old gen consoles, minifying and re-building them into portable/handhelds. These are very cool projects, but the Switch already gives us this. Nintendo appeared to have beaten Ben Heck at his own game. Or have they? Perhaps a hacker like Ben will hack the portability out of a Switch, and add hardware to it — a beefier CPU, GPU, more RAM, improved cooling and overclocking, turning it into a more serious current-gen console system, to allow Breath of the Wild to run without slowdown.

That would be an interesting and worthy project.

YoYoGames announces license portability for GMS2

YoYoGames have announced in an update to their GameMaker Studio 2 FAQ that the beta for GMS2 for Mac OS X will be coming out in the near future. No exact date has been given yet. But their announcement also mentions that the Mac edition will be available to users of GMS2 who have already purchased a license for the Windows edition, at no extra charge. In other words, purchasing a license will entitle you to run GMS2 on whichever platform you prefer, and you don’t need to decide that at purchase time, and you can change your mind at any time, or even switch between OS X and Windows boxes.

GMS2: License FAQ

This seems to align with the GMS2 license model, which ties your GMS2 license to your YoYo Account, not your computer.

I think this is great for longtime users who wish to get off of Windows PCs, and are willing to switch to Mac. I only wish that YoYoGames had plans to port GMS2 to Linux, as had briefly been floated back in 2014.

Nintendo announces Switch launch date, price

Yesterday, Nintendo had their big announcement about their new console, Switch. It will be $299 on March 3, region free, online play will be paid, launch titles have been announced. The Joy-con controllers are more sophisticated than initially shown in the teaser video Nintendo released a few months ago. Joy-con have motion control and “HD” vibration features, and even a camera on the right side. Onboard there’s only 32GB of storage, which is expandable with SDHC the built-in screen is “only” 720p (which to be fair is plenty on a handheld screen, and should help with battery life to a degree) but does support touch.

The new Zelda title looks amazing. New Zeldas always do, but this one really does look very impressive. The new Mario looks a bit weird, like they put Mario in a GTA world, or that Halloween episode of the Simpsons from years ago, where Homer went through some dimensional warp and ended up in the 3D world. But also amazing. It won’t be out until later this year, unfortunately. There will be other sequels — surprised? Splatoon 2 is happening, as expected. Mario Kart 8 is being revised somehow and brought along for the Switch. Surprisingly, no word on whether Super Mario Maker is going to be ported as well. It really should be.

The biggest criticisms of the announced launch titles are how few they are, and that not enough Big Names have been announced. It seems Nintendo may be playing a game to maximize sales by spacing out their major releases so that each gets full attention.

I have some new questions. Because the Switch hardware is so reconfigurable and flexible, how will games adapt to it? Will Switch games be designed with the intent that the Switch be in one particular configuration in order to play them? Or will they have multiple modes, which can be played depending on which configuration you have your Switch in at the moment? I imagine it will probably be a bit of both. Although, if it drives costs up to make the software flexible enough to handle whichever mode the Switch is currently in, that could end up backfiring as developers target one specific mode only per title. How will supporting all of these different modes with one game work for developers?

There’s been a certain amount of WTF and ridicule following the announcement among Nintendo naysayers. Accessories for the Switch seem to be pricey. Over the last few months, since the initial announcement, there’s been a considerable amount of second-guessing among gamers. Initially the Switch seemed very exciting and innovative, a do-it-all, go-anywhere console with loads of innovative features and potential, but that initial impression wore off quickly as gamers wondered just how good the graphics and battery life would be, and what sort of capability the hardware would have relative to the competition.

Does Switch offer enough to get me to buy one? Maybe… Zelda: Breath of the Wild is the most attractive draw to the new console for me, by far. If they had Super Mario Maker, and maybe a new 2D Metroid game, that might be all it takes for me to put it on my want list. Hmm, how about a Super Metroid Maker? Or Mega Man Maker? Or literally any 8-bit franchise maker for that matter? I’d buy Switch in a heartbeat if they had something like that in the works. The small number of titles at launch isn’t that small, although the number of games that actually interest me is.

That’s a concern, but I’ve rarely been an early adopter when it comes to videogame consoles. My first console, the Atari 2600 had been out for several years before I was old enough that my parents bought one. I had no input into that decision, but it was a happy one. I think we got our NES in 1987, after a year of the Atari 7800, maybe we got a SNES the year it came out, the N64 came out when I was in college and my brother had one but I didn’t play it all that much compared to when I had free time.

I wouldn’t have bought myself a GameCube, which came out when I was probably the least interested in videogames that I’ve ever been in my life, but I received one for Christmas one year, 2002 or 03, I think, and didn’t buy a Wii until they stopped instantly selling out of stores…

I still haven’t, and likely won’t, buy a Wii U, ever, despite how much I’d like to play with Mario Maker.

And while I thought the Switch had an exciting design when I saw the trailer video for it a few months ago, I don’t feel all that excited about it. It’s capability as a mobile game platform doesn’t do anything for me — I’ve never been into mobile gaming. Its reconfigurable controllers are clever, but I don’t know that they truly offer anything new. And the multiplayer aspect, which seems to be another big part of Switch’s appeal, doesn’t do much for me, because I’ve always been more of a solitary gamer. For much the same reason, I haven’t been very into network games, either.

I just haven’t found much compelling about AAA games, really, for many years. A few exceptions, to be sure, but probably not even 1/year. I’m pretty deeply rooted in the old school, you might say. These days, I’m much more into retro-styled indie games, like Shovel Knight, Hyper Light Drifter, and Daniel Linssen’s brilliant Ludum Dare platformers, and classic 8- and 16-bit era games.

These days, I find I just don’t care as much for 3D games, analog joysticks, and voice acting and cutscenes in videogames. These things can be done well, but are so hard to do well, and age so poorly, compared to 2D games with low-res graphics, which seem timeless. Truthfully, most modern 3D games either feel crude and lacking in polish, or else cookie-cutter affairs lacking in soul, offering little that their predecessor didn’t also.

As such, I don’t feel that Switch is necessarily aimed at me. That’s fine. I’m pretty niche in my interests, and am served well by my existing library, as well as by the indie market. And I don’t know that that’s a miss on Nintendo’s part. I expect that if the exclusive titles are there, Switch will be a hit. But if Nintendo don’t get a lot of great first-party hits, and attract a strong lineup of 3rd party developers to release games on their platform, it could be a repeat of the Wii U.

I fully admit I know nothing about videogames as a business. I really liked the Ouya, and I still do. Time will tell.

csanyk.com © 2016
%d bloggers like this: