Tuesday, 15 September 2015

Teemu news

With new confidence from experiences in Kaduria about handling messages in a new way I'm trying to apply that to Teemu. The last time I touched Teemu's source code was in March this year. Yes. It's been a long time.

The way I'm approaching the development of Teemu is through refactoring. It seems to be a better option than just continue with the current source code structure. The changes are quite minor I hope, but an important step to get past the writer's block.

The good thing about Teemu is that it's way simpler than Kaduria. It's so much easier to program. The bad thing is that it's still a roguelike-ish project and is going to be more roguelike with the new features. So it's easier, but only in the context of roguelikes.

My plan for allocating time for each of my projects could be something like a week for each project at a time? I don't know, because it never seems to go according to the plan. But it would be nice to get Teemu 1.3 ready and also the next version of Brick Atelier to get them out of the way, possibly giving space for entirely new side projects.

Saturday, 29 August 2015

How to exit a process on Windows

Reading Nethack 4's blog on this subject I wanted to be a bad person and tell how you can end a process in Windows (using Visual C++ of course). You should start the project with F5 to run in debug mode.

In case you get into a infinite loop you can exit the process with shift+F5 (debug - stop debugging in VC).

From programming perspective loops are something to watch out. It can be a typical programmer's idea to assume that a loop always has an exit condition. Just as it's difficult to control the index value of an array it's also sometimes hard to keep track of the exit condition. I'm always programming a panic exit logic in loops. It may sound like overdoing it, but it's a really good idea. Panic exit logic is a counter with max value which runs along the loop and exits when the max value is reached. For debug purposes it's also good to inform when panic exit was the result of the loop to find out the reason for the infinite condition.

Sometimes resource leaks in a loop can make the OS very slow. It happens in Windows, too. Programmers should be extra careful when there are resource management in a loop which I think sounds a bit odd, but then again I have more experience from C++ resource management which mostly happens in constructors and destructors - not in loops. This I think is another good thing about C++, because it's less likely to get into strange race conditions if the class hierarchy is a tree-like system where everything is released in a strict order.

This is getting into another topic, but C++ is not protected from certain type of leaks. When you think of dangerous things in C++ (which in C are typical everyday solutions) there are three things to be extra careful: passing and returning a new object and creating a clone of an object. In C++ returning a new object from a function is not a common style (and should be avoided), but passing object to another container is, as is creating a clone. You need to be careful to handle the ownership change (as it is called in C++) properly to avoid losing the object (and thus failing to release it).

Tuesday, 18 August 2015

Nethack 4.3 beta 1 notes

This version is old and there are new ones, but I wanted to write something about it since today I felt like playing something and found this one. NH4 is the other new version of Nethack, the another one is UnNethack.

NH4 opens a big screen full of information. The inventory screen is visible as side window. It's ok I guess, but can make the screen look more complicated mess of characters. The first problem I noticed was clipping of fonts. It must be a result of pseudo-console code, since real console never clips like that. Or it may, who knows. The programs looks a lot like console window, because you can set fonts as if using a console. Setting them smaller fixed it.

Keyboard commands in NH4 are somewhat different than in "my" classic Nethack (3.4.3). Kicking is 'n', but it doesn't even work. You can change all keys the way you want by opening Options, then hitting shift+I for keyboard command list. The default has hjlk-keys for movement which takes away 'k' as kick and others as well ('l' as loot). I really don't know why that should be default, because 95% of people who ever used hjkl-movement have died in old age by now.

I don't know why they changed AC to something else. In fact I didn't really pay attention to RPG system, have they changed it? The AC seems to be some kind of protection value with only positive numbers which is bananas.

Other than that it seems to be a regular Nethack, only with more bugs. Well I found one bug, but it was really strange. When hitting a floating eye I got this:

There was no save yet, since I had not saved the game. Maybe there is some kind of temp save and the final save game also went to... somewhere. Not in the game's directory. I hate when the program saves stuff to somewhere. In this case I didn't even find anything from AppData or those locations typical to Windows 7. Where the heck it saved the game? In registry?

It's really funny when people try to maintain the bullshit source code of Nethack and only manage to create more bugs. When will this end? What every Nethack variant programmer should do is completely restart the source code possibly not even using C or C++. The source code of Nethack is so bad and taking huge amount of time to fix bugs which keep increasing. The thing is that you need a better way to manage this kind of data and actions between them.

Not only that, I think NH4 also managed to make the user interface worse while developers should really concentrate to fix that shit if they want to create a better Nethack. For instance there should be a list of extended commands when you hit # and let player select from that list directly with a letter. Keyboard commands should be listed by category, so you don't have to scroll the entire list to find something. I could go on forever.

None of this would have happened if the Dev Team had not abandoned Nethack. I think it's time to let Nethack become history.

Monday, 10 August 2015

What happened to textattr?

While I was away from console programming they have removed textattr() function from conio.h. Reading some random explanations for why it's a DOS function. No, it's actually a console function. They (reptilians?) did keep printf and even cprintf which I vaguely remember is actually the color version of printf. When you look at conio.h it's not even that big and Microsoft has added bunch of irrelevant "secure" versions of functions in there. They could have kept textattr for sure, because WinAPI does have color actions, they are just more annoying with that WinAPI style.

I've had fun writing the tiny GUI for console. My plan is avoid (most) problems I've previously had. For example the output is strictly limited to Display_Matrix class which defines a rectangular area of CHAR_INFO (Microsoft's struct for letter and color data). It's a simple container where you can write characters and strings with color data. That rectangle is then output to actual console. With Display_Matrix each screen or window is its own area and I'm also including update flag in the Display_Matrix: when the matrix is changed the flag for updating is set. It prevents duplicate or more updates per turn in low level manner.

The usual problem in class programming is that you may start to add some stuff to class which clearly doesn't belong to it. In small projects it does reduce the amount of classes needed, but it's still less modular way to think programming. Classes should always be as modular as possible and do one task using various types of source data.

Saturday, 8 August 2015

Console font size

I've programmed a gui class for console, but setting the font size seems to be difficult. I guess it's supposed not to set by the program, but by user as you indeed can do for Windows console. Not only that I noticed the Code::Blocks gcc version doesn't even have SetCurrentConsoleFont declared. Maybe I was foolish to try the project with gcc's windows.h implementation which really does not have all stuff included.

Should I start the project again with VC2010. Or not to change the font but let the user do it. Maybe I'll go with that and think about the font size later.

Friday, 7 August 2015

Console programming in Windows

I'm planning a new roguelike with ascii text in a console window. I guess curses is the only library available as cross-compiler solution and for some reason I didn't want to go there. Rather than using any libraries I started to investigate the possiblity to use Windows native console API.

I've only taken the first step and found out that you actually can set the console windows size other than default 80x25 from within the program. It's an important step, because I plan to make the size static, possibly smaller than 80x25.

The next step is a gui class to restrict all that ugly Windows API code in one class if there ever is need to change that to something else or port the game to other platforms. My prediction is that creating the gui is going to take some time because WinAPI, but once it's done it will be easier than working with graphical roguelikes as I've done this far.

This time I'm also going to use external script files, unlike in my current projects with only C++ data structures. In scripting I don't see any other advantages but "default" values which means you only have to write the data that is different from default type. Some people say it's good that you don't have to recompile the project to change data, but I think it's a non-issue in a modern IDE where only files that were changed are compiled.

The gameplay idea I have for this project is quite simple, so we are not talking about a major roguelike. If I can get the gui and parser for data done before abandoning the project it may be finished some day.

Saturday, 6 June 2015

OSX developer experiences

I tried to install CodeLite, but because it's from unknown source OSX didn't allow me to do that. You can override that by installing with admin or whatever, but I just didn't have the energy. Besides I have Code::Blocks installed. When started it wanted to install some kind of developer tools (compiler I guess?) which I thought I had installed before. Or didn't I start C::B when I installed it earlier?

I wanted to try wxWidgets, but couple of reasons made me stop trying. First you have to compile it from sources to OSX. I tried quickly to search some kind of "how-to" for OSX, but no luck. Then I was looking at wx docs and while it's C++ it seems to be an overcomplicated system. I guess full GUI libraries are like that, but it's just so depressing.

I wish there were something like SDL2, but with simple dialogs, menus and above all a file dialog. That would be great for people who don't want to install an operating system (like wx), but on the other hand don't want to code everything from the scratch (like with SDL2 if you want a GUI).

There has been some talk about OSX becoming worse for desktop developers, because Apple is concentrating more on mobile platforms like tablets and phones. I think it is kind of hostile environment for developers, because at the same time Apple assumes that you want to use XCode and their technologies, but then also you have a unix system working in the background which allows pesky command line hacking I'm really not willing to handle myself. It's not for me, because I've been using IDEs since 1990's.

I was planning to move Brick Atelier to OSX and SDL2, but then again it would be easier to ditch SDL2 and try more advanced GUI library. Not wxWidgets I guess. Or who knows it might be easy when you get over the first impression?