you have to use real money to directly buy the DLC (4$ i think)
About the client, OOO please, answer us
I think there's a topic about that already... you might have missed it because it has a rather provoking name like "description on steam wrong now, remove f2p tag!!!111" or something...
Anyway, wrong place to discuss that here.
This topic is about players that use the nonsteam client not being able to get the expansion for ce, while steam players can do that.
I suppose that now they will be looking into that.
Does that mean it doesn't make sense to keep bumping this thread then?
OOO Has confirmed that they are looking into a client version for DLC trading.
So yes- it's quite a good idea to stop bumping, but it's your choice.
Hmmm... But how will they know that still not everyone [purchased / bound to steam / quit the game] yet and it still needs fixing if noone bumps this thread? Maybe in 20 years when they're almost done with it, they'll look into this thread and think: "They stopped bumping, OH MY GOD, we are too late, they are all dead!!!111 Well, nothing we can do about it now but grieve, so let's just delete that almost finished patch that fixes everything and forget about the whole thing" :3
public static final int NUM_BUGS = 0;
public static final int NUM_PROBLEMS = 0;
NumTiers = 4;
kk all done :3
The DEVs do not seem to be interested to apply your patch to the main project at the moment because they have other priorities... please fork the git tree from the latest stable version and submit your code there directly so we can see if it works.
tl;dr: bump :P
LOLOL, if only if that where a real function. It would make programming TOO easy. Hey all of you who don't know how to program! I'm not even 18 yet, end I'm learning how to do THIS:
(Oh and, this is a VERY VERY simple game, it doesn't even use sprites! And the setup I'm using makes it much simpler than it normally is to make one.)
#include "Tank.h"
//drawtank function
//construct the tank using drawing functions
void drawtank(int num)
{
int x = tanks[num].x;
int y = tanks[num].y;
int dir = tanks[num].dir;
//draw tank body a turret
rectfill(screen, x-11, y-11, x+11, y+11, tanks[num].color);
rectfill(screen, x-6, y-6, x+6, y+6, 7);
//traw the treads based on direction
if (dir == 0 || dir == 2)
{
rectfill(screen, x-16, y-16, x-11, y+16, 8);
rectfill(screen, x+11, y-16, x+16, y+16, 8);
}
else
if (dir == 1 || dir == 3)
{
rectfill(screen, x-16, y-16, x+16, y-11, 8);
rectfill(screen, x-16, y+16, x+16, y+11, 8);
}
//draw te turret based on direction
switch (dir)
{
case 0:
rectfill(screen, x-1, y, x+1, y-16, 8);
break;
case 1:
rectfill(screen, x, y-1, x+16, y+1, 8);
break;
case 2:
rectfill(screen, x-1, y, x+1, y+16, 8);
break;
case 3:
rectfill(screen, x, y-1, x-16, y+1, 8);
break;
}
}
//erasetank function
//erase the tank using rectfill
void erasetank(int num)
{
//calculate box to erase
int left = tanks[num].x - 17;
int top = tanks[num].y - 17;
int right = tanks[num].x + 17;
int bottom = tanks[num].y + 17;
//erase the tank
rectfill(screen, left, top, right, bottom, 0);
}
//movetank function
//move the tank in the current direction
void movetank(int num)
{
int dir = tanks[num].dir;
int speed = tanks[num].speed;
//update tank postion based on tank direction
switch(dir)
{
case 0:
tanks[num].y -= speed;
break;
case 1:
tanks[num].x += speed;
break;
case 2:
tanks[num].y += speed;
break;
case 3:
tanks[num].x -= speed;
break;
}
//keep tank inside the screen
if (tanks[num].x > SCREEN_W-22)
{
tanks[num].x = SCREEN_W-22;
tanks[num].speed = 0;
}
if (tanks[num].x < 22)
{
tanks[num].x = 22;
tanks[num].speed = 0;
}
if (tanks[num].y > SCREEN_H-22)
{
tanks[num].y = SCREEN_H-22;
tanks[num].speed = 0;
}
if (tanks[num].y < 22)
{
tanks[num].y = 22;
tanks[num].speed = 0;
}
}
//explode function
//display random boxes to simulate an explosion
void explode(int num, int x, int y)
{
int n;
//get location of enemy tank
int tx = tanks[!num].x;
int ty = tanks[!num].y;
//is bullet inside the boundary of the enemy tank?
if (x > tx-16 && x < tx+16 && y > ty-16 && y < ty+16)
score(num);
//draw some random circles for the "explosion"
for (n = 0; n < 10; n++)
{
rectfill(screen, x-16, y-16, x+16, y+16, rand() % 16);
rest(1);
}
//clear the area of debris
rectfill(screen, x-16, y-16, x+16, y+16, 0);
}
//updatebullet function
//update the position of a bullet
void updatebullet(int num)
{
int x = bullets[num].x;
int y = bullets[num].y;
if (bullets[num].alive)
{
//erase bullet
rect(screen, x-1, y-1, x+1, y+1, 0);
//move bullet
bullets[num].x += bullets[num].xspd;
bullets[num].y += bullets[num].yspd;
x = bullets[num].x;
y = bullets[num].y;
//stay within the screen
if (x < 5 || x > SCREEN_W-5 || y < 20 || y > SCREEN_H-5)
{
bullets[num].alive = 0;
return;
}
//draw bullet
x = bullets[num].x;
y = bullets[num].y;
rect(screen, x-1, y-1, x+1, y+1, 14);
//look for a hit
if (getpixel(screen, bullets[num].x, bullets[num].y))
{
bullets[num].alive = 0;
explode(num, x, y);
}
//print the bullet's position
textprintf(screen, font, SCREEN_W/2-50, 1, 2,
"B1 %-3dx%-3d B2 %-3dx%-3d",
bullets[0].x, bullets[0].y,
bullets[1].x, bullets[1].y);
}
}
//checkpath function
//check to see if a point on the screen is black
int checkpath(int x1, int y1, int x2, int y2, int x3, int y3)
{
if (getpixel(screen, x1, y1) ||
getpixel(screen, x2, y2) ||
getpixel(screen, x3, y3))
return 1;
else
return 0;
}
//clearpath function
//verify that the tank can move in the current direction
void clearpath(int num)
{
//shortcut vars
int dir = tanks[num].dir;
int speed = tanks[num].speed;
int x = tanks[num].x;
int y = tanks[num].y;
switch(dir)
{
//check pixels north
case 0:
if (speed > 0)
{
if (checkpath(x-16, y-20, x, y-20, x+16, y-20))
tanks[num].speed = 0;
}
else
//if reverse dir, check south
if (checkpath(x-16, y+20, x, y+20, x+16, y+20))
tanks[num].speed = 0;
break;
//check pixels east
case 1:
if (speed > 0)
{
if (checkpath(x+20, y-16, x+20, y, x+20, y+16))
tanks[num].speed = 0;
}
else
//if reverse dir, check west
if (checkpath(x-20, y-16, x-20, y, x-20, y+16))
tanks[num].speed = 0;
break;
//check pixels south
case 2:
if (speed > 0)
{
if (checkpath(x-16, y+20, x, y+20, x+16, y+20))
tanks[num].speed = 0;
}
else
//if reverse dir, check north
if (checkpath(x-16, y-20, x, y-20, x+16, y-20))
tanks[num].speed = 0;
break;
//check pixels west
case 3:
if (speed > 0)
{
if (checkpath(x-20, y-16, x-20, y, x-20, y+16))
tanks[num].speed = 0;
}
else
//if reverse dir, check east
if (checkpath(x+20, y-16, x+20, y, x+20, y+16))
tanks[num].speed = 0;
break;
}
}
//fireweapon function
//configure bullet's direction and speed and activate it
void fireweapon(int num)
{
int x = tanks[num].x;
int y = tanks[num].y;
//ready to fire again?
if (!bullets[num].alive)
{
bullets[num].alive = 1;
//fire bullet in direction tank is facing
switch (tanks[num].dir)
{
//north
case 0:
bullets[num].x = x;
bullets[num].y = y-22;
bullets[num].xspd = 0;
bullets[num].yspd = -BULLETSPEED;
break;
//east
case 1:
bullets[num].x = x+22;
bullets[num].y = y;
bullets[num].xspd = BULLETSPEED;
bullets[num].yspd = 0;
break;
//south
case 2:
bullets[num].x = x;
bullets[num].y = y+22;
bullets[num].xspd = 0;
bullets[num].yspd = BULLETSPEED;
break;
//west
case 3:
bullets[num].x = x-22;
bullets[num].y = y;
bullets[num].xspd = -BULLETSPEED;
bullets[num].yspd = 0;
break;
}
}
}
//forward function
//increase the tank's speed
void forward(int num)
{
tanks[num].speed++;
if (tanks[num].speed > MAXSPEED)
tanks[num].speed = MAXSPEED;
}
//backward function
//decrease tank's speed
void backward(int num)
{
tanks[num].speed--;
if (tanks[num].speed < -MAXSPEED)
tanks[num].speed = -MAXSPEED;
}
//turnleft function
//rotate the tank counter-clockwise
void turnleft(int num)
{
tanks[num].dir--;
if (tanks[num].dir < 0)
tanks[num].dir = 3;
}
//turnright function
//rotate the tank clockwise
void turnright(int num)
{
tanks[num].dir++;
if (tanks[num].dir > 3)
tanks[num].dir = 0;
}
//getinput function
//check for player input keys(for 2 players)
void getinput()
{
//hit ESC to quit
if (key[KEY_ESC])
gameover = 1;
//WASD / SPACE keys to control tank 1
if (key[KEY_W])
forward(0);
if (key[KEY_D])
turnright(0);
if (key[KEY_A])
turnleft(0);
if (key[KEY_S])
backward(0);
if (key[KEY_SPACE])
fireweapon(0);
//arrow / ENTER keys control tank 2
if (key[KEY_UP])
forward(1);
if (key[KEY_RIGHT])
turnright(1);
if (key[KEY_DOWN])
backward(1);
if (key[KEY_LEFT])
turnleft(1);
if (key[KEY_ENTER])
fireweapon(1);
//short delay after keypress
rest(10);
}
//score function
//add a point to the specified player's score
void score(int num)
{
//update score
int points = ++tanks[num].score;
//display score
textprintf(screen, font, SCREEN_W-70*(num+1), 1, BURST,
"P%d: %d", num+1, points);
}
//setuptanks function
//set up the starting condition of tank
void setuptanks()
{
//player 1
tanks[0].x = 30;
tanks[0].y = 40;
tanks[0].dir = 1;
tanks[0].speed = 0;
tanks[0].color = 9;
tanks[0].score = 0;
//player 2
tanks[1].x = SCREEN_W-30;
tanks[1].y = SCREEN_H-30;
tanks[1].dir = 3;
tanks[1].speed = 0;
tanks[1].color = 12;
tanks[1].score = 0;
}
//setupdebris function
//set up the debris on the battlefield
void setupdebris()
{
int n,x,y,size,color;
//fill the battlefield with random debris
for (n = 0; n < BLOCKS; n++)
{
x = BLOCKSIZE + rand() % (SCREEN_W-BLOCKSIZE*2);
y = BLOCKSIZE + rand() % (SCREEN_H-BLOCKSIZE*2);
size = (10 + rand() % BLOCKSIZE)/2;
color = makecol(rand()%255, rand()%255, rand()%255);
rectfill(screen, x-size, y-size, x+size, y+size, color);
}
}
//setupscreen function
//set up the graphics mode and game screen
void setupscreen()
{
//set video mode
int ret = set_gfx_mode(MODE, WIDTH, HEIGHT, 0, 0);
if (ret != 0) {
allegro_message(allegro_error);
return;
}
//print title
textprintf(screen, font, 1, 1, BURST,
"Tank War - %dx%d", SCREEN_W, SCREEN_H);
//draw screen border
rect(screen, 0, 12, SCREEN_W-1, SCREEN_H-1, TAN);
rect(screen, 1, 13, SCREEN_W-2, SCREEN_H-2, TAN);
}
//main function
//start point of the program
void main(void)
{
//initialize everything
allegro_init();
install_keyboard();
install_timer();
srand(time(NULL));
setupscreen();
setupdebris();
setuptanks();
//gameloop
while(!gameover)
{
//erase the tanks
erasetank(0);
erasetank(1);
//check for collisions
clearpath(0);
clearpath(1);
//move the tanks
movetank(0);
movetank(1);
//draw the tanks
drawtank(0);
drawtank(1);
//update the bullets
updatebullet(0);
updatebullet(1);
//check for keypresses
if (keypressed())
getinput();
//slow the game down (adjust as necessary
rest(30);
}
//end program
allegro_exit();
}
END_OF_MAIN();
And suddenly I just got an idea for a SK-themed tank game, in which you pilot little tanks against gremlin tanks on large open clockwork battlegrounds.
Hardy har har. I should say that that program you just saw came from the Game Programming All in One book. (I'm just saying because, you know.) Anyway, if something is wrong, if there is a bug, you have to scan ALL of that, and some games(such as this one, I guess) can go up over 10,000 lines. This game could be adapted to being an SK game, but, I need to learn a bit more first.
Anyone still "Investigating"? It's getting hard to believe that still no one knows whether this is even "possible".
Yeah, its pathetic. A foregin steam client has more funcionality than official site client. Not mentioning about long forgotten kongregate client.
And they even let possibility that its 'not possible to implement'? Its some kind of sick joke.
Not to mention the utter lack of voice chat on all other clients :(
Yeah, its like OOO getting paid for forcing players to go to steam???
Because i dont see a reason why OOO cares so much for some third party application and gives their steam SK client so much benefits over regular official site client.
Steam and EVEN SITE client gets all the good stuff (justified with site having wiki and forum access blah blah)
As a player who's main is from Kongregate I have to actually make an alt to use wiki/forum etc
Give Kongregate players some love too.
Pweeeeease?
Main point
Steam client gets more stuff, ie. Trade of OCH
Site client gets wiki usage (exclusive to site accounts, I think)
Kongregate client has no benefits. /think Does OOO remember they have a kong client...?
I'm not even whining so much. YET. harharhar.
side note: is bumping this even neccessary :v
Sure, why not, start a discussion about "what's a necro and what isn't",those are always "helpful"... :P
So: I say this isn't a "necro" because:
- There is relevant (dev) info about unfinished business in this thread here which means both: the "business" isn't finished yet AND it would be bad to open a new thread because there we'd "lose" the info (which is in this thread here ;))
- The "official" answer in this thread sort of implies, that at some point "things will have been looked into and then 'we' should know more" (which hasn't happened yet)... it's been a while, so it's adequate to express that we didn't loose interest in this here topic yet to encourage the poor people that have to do the hard work of "looking into stuff".
OK, now that we've established that noone is interested in useless discussions about what's a necro and what's not... back to the topic:
So, how'd those investigations turn out? Any news? Haven't been here for a while, did I miss something?
Any plans to at least make it available at reduced price for nonsteam customers (on steam it seems to be 75% off ATM), too?
I was going to post my usual link to a necro post but then saw that you brought up a good point...go figure! U_U
Refactoring. As a software developer-in-training, I can say personally that "simple" implementation of a new mechanic, system or mission that changes the layout of the original software is daunting to say the least. To be really blunt, adding new features without breaking anything AND getting those features to work correctly -CAN- be impossible without partial-complete rewrite of game code, from the ground up, and sometimes that just isnt feasible. The last thing you'd want to do is be impatient for new content or more comfortable content while the Devs are trying to figure out if it can be done correctly; that would be like asking a car mechanic to put a monster truck engine in your Smart Car because you'd like the option of going a bit faster.The end result may be something you desire, but the mechanics required to make that a reality may just not be possible without danger.
Blahblahblah
"I cannot give you a date as I do not even know if it's possible. We are are only investigating the possibility of implementing the feature at this time."
Blahblahblah
Its been already few weeks while ALL PLAYERS p2p of f2p can buy OCH expansion mission pack WITH CE on asian servers.
While here, on OFFICIAL SITE, OOO is supposed to "think if its even possible"
Sorry but something is wrong in here. Are they trying to do it? Or they are just giving us crap to make us wait forever and they just DONT WANT to make f2p players have OCH.
Did you know Steam has an offer going on that if you purchase now Crimson Hammer you can get it at like 75% discount? Or something like that. Maybe after that it will be avaiable... or not! Dunno if already ended too.
Even now after the steam price is back up, for customers that use the official client this expansion costs twice as much as for steam customers. Least thing to do would have been to make the prices match - including during the 75%off - Period. I find this way of handling customers is just insulting.
This game did not become officialy a p2p game for one reason: DLC is completely optional, and it can be obtained via trade (without using real money), if you HAD to buy the dlc to play the game (take world of warcraft's expansions for an example), SK would officialy be a p2p game.