Temple of The Roguelike Forums
Announcements => Traditional Roguelikes (Turn Based) => Topic started by: Robot on February 11, 2010, 08:25:58 AM
-
Hello all! this is my first public release of a game, The Atomic Knight. It's ASCII and I coded it in C++ from scratch a few weeks ago. I didn't know about curses at the time, but I'm hoping to implement that in a future release.
Unlike most roguelikes, there are not a lot of stats or simulation. The game is primarily a strategy/arcade/adventure game, but I the presentation is definitely similar to roguetypes.
The environment, like a roguelike, is randomly generated. On top of that, I give the player control over some of the creation functions which allows for extreme pinpoint customization on the style of game played.
You are the Atomic Knight (A) and you shoot projectiles at the Trolls (T) which have a decent enough AI, avoid shots, and can be very effective at killing the player.
In addition, there are 3 power ups to use 8,4,X, which have different effects that I'll let you discover. Keep in mind this is a Beta release, and I'm planning more updates. Once the game is improved I'll be releasing the source code as well.
Finally, you can customize the colors of the text and background to suit your mood. A small feature, but I think it's a nice little touch.
The game tracks High Score, Highest Level reached, and most kills.
It's a 32-Bit Windows application right now. Enjoy! I'd love to hear and feedback, comments, or questions about the game.
The Link: http://8bitcity.blogspot.com/2010/02/atomic-knight-beta-30-release.html (http://8bitcity.blogspot.com/2010/02/atomic-knight-beta-30-release.html)
I'll post updates to the game on 8bitcity.blogspot.com in the future!
-
The download link at filesdrop doesn't seems to work!
-
Thanks for the heads up! I re-uploaded the file as a temp solution but I'll move it to a permanent place when I get the chance.
I included the source in this upload on accident, so enjoy!
-
No problem.. but the links still redirects to the empty page.
Please fix this, I want to try your game! :)
-
Okay, forget about filedropper.
http://sites.google.com/site/postmodernsoftware/
Google sites is much more reliable. Enjoy! I included the source but I didn't clean it up.
-
I played around with it a bit, after dying 3 or 4 times due to general disorientation :P
The full refresh is really killing it, but it is still playable
I like the semirealtimeness of the bullets. gotta add some color to distinguish atomic knights, trolls, prizes
got 5154152, 186 dead trolls!
-
Thanks for the feedback! I have a few updates planned for the game:
First, implement the curses library and therefore fix the refresh bug. I know it sucks, but I hope that it doesn't stop one from enjoying the game now. On a faster computer (also, it would seem, on windows xp) the console can actually run really quickly and the refresh is barely noticable. However, on the machine I programmed the game on (a toshiba nb205 netbook running win7starter) the console runs much slower.
I didn't know how to program individual colors for different parts of the output in C++ and I still don't. Hopefully I can learn how to do this and give the player the option of customizing each object in the game.
However, if you look at the source, the game doesn't even use objects. The graphic determines how the program reacts. Still, assigning individual colors seems perfectly reasonable and should satisfy everyone.
That said, I don't really feel like that is a priority. The game already allows 256 color combinations, and the color menu is the easiest and menu to access. The color menu can be accessed at startup, or at death, allowing for the player to easily experiment with different ways of viewing the game. For example, running in the traditional colors makes the game seem like a roguelike, but inverting the colors creates the illusion of a notepad, or "world of text"-type arena. You can even play in pink and neon green to match your pink and green laptop. On a philosophical level, it allows the player to set the mood of the experience. My direct influence on this would be REZ, Lumines, and many other modern games, which offered a multitude of color options and skins, but still don't allow the complete color customization of most operating systems. I think this level of user control is essential to the increasing the success of any piece of software, particularly artistic and recreational software.
Consciously, the motivation behind the color setting was inspired by Microsoft's windows 7 starter os, which does not allow the user any easy access to the desktop wallpaper and several other graphics settings.
Anyway, I encourage everyone to play around with the settings, you will DEFINITELY enjoy the game more!
-
Hi, I kind of ported your game to linux :) (Although the exe ran fine with Wine too). All you need to do is to include the following short file instead of conio.h and windows.h (it shouldn't break anything as conio is included here if in windows and I don't think you used windows.h for anything, but if you did, you can add an #ifdef WIN32):
/// This file provides a getch() function
/// which gets character from stdin in a
/// non-blocking way.
/// In Windows, conio.h is used, but in
/// Linux, a custom function is needed.
#include <iostream>
#ifdef WIN32
#include <conio.h>
#else
#include <cstdio>
#include <termios.h>
#include <unistd.h>
int getch() {
struct termios oldt, newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}
bool kbhit() {
return true;
}
#endif
Colors didn't work though, and I didn't bother to look into it. :( Anyway, I didn't have problems with screen refresh.
As for the game, the player character is hard to spot and I think the default settings have way too many trolls, but it is a nice start and the projectiles moving turn-by-turn is rarely seen and as such, refreshing.
-
It's a fun game.
there are just two habits I'm uncertain of the reason for.
Why do you declare the control variable of the for loop outside of the loop?
Did you write out the code to move the missiles 4 times, because you prefer it that way or because you didn't think of a way to use the same code for each direction? If it's the latter I can show you an easier way.
-
Fun game, cool idea.
I agree completely with the color change idea submitted by Slash.
COLOR FOR LINUX:
printf("\033[22;31mHello, world!");
/* this will print hello world in red
other colors:
\033[22;30m - black
\033[22;31m - red
\033[22;32m - green
\033[22;33m - brown
\033[22;34m - blue
\033[22;35m - magenta
\033[22;36m - cyan
\033[22;37m - gray
\033[01;30m - dark gray
\033[01;31m - light red
\033[01;32m - light green
\033[01;33m - yellow
\033[01;34m - light blue
\033[01;35m - light magenta
\033[01;36m - light cyan
\033[01;37m - white */
COLOR FOR WINDOWS:
Further Information: http://msdn.microsoft.com/en-us/library/ms686047%28VS.85%29.aspx
#include <windows.h>
int main()
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// change color
SetConsoleTextAttribute(hConsole, color);
}
// colors:
//0 = Black 8 = Gray
//1 = Blue 9 = Light Blue
//2 = Green a = Light Green
//3 = Aqua b = Light Aqua
//4 = Red c = Light Red
//5 = Purple d = Light Purple
//6 = Yellow e = Light Yellow
//7 = White f = Bright White
clear screen is a killer, kinda irritating, thankfully not TOO distracting from gameplay.
Thanks for the fun!
-
Wow! Thanks everyone, I'll definitely get to work on porting the game to Linux.
As for the code, I'm embarrassed by it and it will be cleaned up over time. Everything I did was "quick and dirty" and I've avoided condensing the code because I'm thinking about reworking the entire system to use actual objects instead of just characters.
Anyway, I did this a few days ago, but beta 4.0 is released. I didn't think to check this topic so I didn't have any of the feedback since my last post but I think this version is more enjoyable.
[link]http://8bitcity.blogspot.com/2010/02/atomic-knight-beta-40.html[/link]
It now runs in DOS, no windows, which should make it easier for nix users right now (but the Linux port is forthcoming, thanks again aave!)
-8laser greatly improved
-default settings changed (less trolls, less powerups, less buildings)
-ENDING added (or cheat and look in the source code)
If you don't want to just look in the source for the ending, you need to do one of the following:
1. Kill 1000 Trolls
2. Reach level 100
3. Achieve 100000000 points.
Hi: I don't know why I declare the variable outside of the for loop. I was taught that way in high school and it stuck I suppose. As to your question about move missiles, THANKS for spotting a bug! Right now it's a series of if statements and it checks each square for times, I see the problem with that for sure. I meant to make it a series of if-elses so that it would break after one true case. I can think of a few ways to make it more streamlined, but my thought was that movemissiles wasn't broken so...
There are a bunch of simple functions I would have realized I needed (for example, a simple inBounds(int j, int k) function, etc.
-
It's not bad code, I just really enjoy reading other people's code because they think differently than me and as I was reading yours I was also trying to fit as much on the screen at once as possible. My solution isn't the best solution it's just the one that I came up with.
int moveMissiles()
{
char tempGrid[20][80];
char missle;
int newj;
int newk;
for(int j=0; j<20; j++)
{
for(int k=0; k<80; k++)
{
tempGrid[j][k]=' ';
}
}
for(int j=0; j<20; j++)
{
for(int k=0; k<80; k++)
{
newj=j;
newk=k;
missle = theGrid[j][k];
if (missle=='^') //up missile
newj = j-1;
else if (missle=='v') //down missile
newj = j+1;
else if (missle=='>') //right missile
newk = k+1;
else if (missle=='<') //left missile
newk = k-1;
else
continue;
if (newj >= 0 && newj < 20 && newk >= 0 && newk < 80)
{
tempGrid[newj][newk]=missle;
if (theGrid[newj][newk]=='T') // a hit!
{
score += 1000 + rand()%100000; //wtf lol!
kills++;
tempGrid[newj][newk]=' ';
}
else if(theGrid[newj][newk]=='#' || theGrid[newj][newk]=='4' || theGrid[newj][newk]=='8' || theGrid[newj][newk]=='X')
tempGrid[newj][newk]=' ';
}
theGrid[j][k]=' ';
}
}
for(int j=0; j<20; j++)
{
for(int k=0; k<80; k++)
{
if (tempGrid[j][k] != ' ')
theGrid[j][k] = tempGrid[j][k];
}
}
}
-
That's an elegant solution, I like it. I think you
one line should read
else if(theGrid[newj][newk]=='#' || theGrid[newj][newk]=='4' || theGrid[newj][newk]=='8' || theGrid[newj][newk]=='X' || theGrid[newj][newk]=='A')
but yea, thanks for that code, I remember using something similar years ago in a game of life program.
.... I can think of many applications :)
-
woops, I forgot that I changed how projectiles work, if you want them to work the same as before take out any line that says
theGrid[newj][newk]=' '