Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ckb.pro
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ SUBDIRS = \
src/ckb-ripple \
src/ckb-wave \
src/ckb-gradient \
src/ckb-invaders \
src/ckb-pinwheel \
src/ckb-random \
src/ckb-rain
18 changes: 18 additions & 0 deletions src/ckb-invaders/ckb-invaders.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
TEMPLATE = app
TARGET = ckb-invaders

QMAKE_CFLAGS += -std=c99
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9

macx {
DESTDIR = $$PWD/../../ckb.app/Contents/Resources/ckb-animations
} else {
DESTDIR = $$PWD/../../bin/ckb-animations
}

CONFIG =
QT =
LIBS =

SOURCES += \
main.c
283 changes: 283 additions & 0 deletions src/ckb-invaders/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,283 @@
#include "../ckb/ckb-anim.h"
#include <math.h>
#include <string.h>

void ckb_info(){
// Plugin info
CKB_NAME("Invaders");
CKB_VERSION("0.1");
CKB_COPYRIGHT("2017", "Maksim Vladimirovich <[email protected]>");
CKB_LICENSE("GPLv3");
CKB_GUID("{54DD2975-E192-457D-BCFC-D912A24E33B9}");
CKB_DESCRIPTION("Space invaders - like game");

// Effect parameters
CKB_PARAM_AGRADIENT("color", "Color:", "", "ffffffff");
CKB_PARAM_BOOL("kphold", "Freeze until key is released", TRUE);

// Timing/input parameters
CKB_KPMODE(CKB_KP_NAME);
CKB_TIMEMODE(CKB_TIME_DURATION);
CKB_LIVEPARAMS(TRUE);

// Presets
CKB_PRESET_START("Default Settings");
CKB_PRESET_PARAM("color", "ff000000");
CKB_PRESET_PARAM("duration", "0.1");
CKB_PRESET_PARAM("stop", "0");
CKB_PRESET_PARAM("kpstop", "0");
CKB_PRESET_END;
}

int kphold = 0, kprelease = 0;

int bullet_row = 1;
float bullet_position = 0;
int enemy_row = 1;
float enemy_position = 12;
int fire = 0;
int enemies = 0;
int level = 0;

char* row1[14] = { "grave", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "minus", "equal", "back" };
char* row2[14] = { "tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "lbrace", "rbrace", "bslash" };
char* row3[13] = { "caps", "a", "s", "d", "f", "g", "h", "j", "k", "l", "colon", "quote", "enter" };
char* row4[12] = { "lshift", "z", "x", "c", "v", "b", "n", "m", "comma", "dot", "slash", "rshift" };

char* levels[12] = {"f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12" };

void ckb_init(ckb_runctx* context){
srand(time(NULL));
}

void ckb_parameter(ckb_runctx* context, const char* name, const char* value){
CKB_PARSE_BOOL("kphold", &kphold){}
CKB_PARSE_BOOL("kprelease", &kprelease){}
}

void ckb_keypress(ckb_runctx* context, ckb_key* key, int x, int y, int state){
// Start or stop animation on key
char* keyname = key->name;

if(strcmp(keyname, "esc") == 0) {
restart();
}

if(fire == 0) {
if (strcmp(keyname, row1[0]) == 0) {
fire = 1;
bullet_row = 1;
}
if (strcmp(keyname, row2[0]) == 0) {
fire = 1;
bullet_row = 2;
}
if (strcmp(keyname, row3[0]) == 0) {
fire = 1;
bullet_row = 3;
}
if (strcmp(keyname, row4[0]) == 0) {
fire = 1;
bullet_row = 4;
}
}
}

void ckb_start(ckb_runctx* context, int state) {
}

char* get_bullet_key_name() {
int bp = round(bullet_position);
if(bullet_row == 1) {
return row1[bp];
} else if (bullet_row == 2) {
return row2[bp];
} else if (bullet_row == 3) {
return row3[bp];
} else if (bullet_row == 4) {
return row4[bp];
}
return "esc";
}

char* get_enemy_key_name() {
int ep = round(enemy_position);
if(enemy_row == 1) {
return row1[ep];
} else if (enemy_row == 2) {
return row2[ep];
} else if (enemy_row == 3) {
return row3[ep];
} else if (enemy_row == 4) {
return row4[ep];
}
return "esc";
}

void restart() {
enemy_row = 1;
bullet_row = 1;
fire = 0;
enemy_position = 12;
bullet_position = 0;
}

void explode_enemy(){
enemy_row = rand() % 4 + 1;
enemy_position = 12;
bullet_position = 0;
fire = 0;
}

void game_over(){

}

void draw_level(ckb_runctx* context, int level) {
unsigned count = context->keycount;
for (unsigned i = 0; i < count; i++) {
ckb_key *key = context->keys + i;
char *key_name = key->name;
if (strcmp(key_name, "f1") == 0 && level > 0) {
key->a = 255;
key->r = 0;
key->g = 0;
key->b = 255;
}
if (strcmp(key_name, "f2") == 0 && level > 1) {
key->a = 255;
key->r = 0;
key->g = 0;
key->b = 255;
}
if (strcmp(key_name, "f3") == 0 && level > 2) {
key->a = 255;
key->r = 0;
key->g = 0;
key->b = 255;
}
if (strcmp(key_name, "f4") == 0 && level > 3) {
key->a = 255;
key->r = 0;
key->g = 0;
key->b = 255;
}
if (strcmp(key_name, "f5") == 0 && level > 4) {
key->a = 255;
key->r = 0;
key->g = 0;
key->b = 255;
}
if (strcmp(key_name, "f6") == 0 && level > 5) {
key->a = 255;
key->r = 0;
key->g = 0;
key->b = 255;
}
if (strcmp(key_name, "f7") == 0 && level > 6) {
key->a = 255;
key->r = 0;
key->g = 0;
key->b = 255;
}
if (strcmp(key_name, "f8") == 0 && level > 7) {
key->a = 255;
key->r = 0;
key->g = 0;
key->b = 255;
}
if (strcmp(key_name, "f9") == 0 && level > 8) {
key->a = 255;
key->r = 0;
key->g = 0;
key->b = 255;
}
if (strcmp(key_name, "f10") == 0 && level > 9) {
key->a = 255;
key->r = 0;
key->g = 0;
key->b = 255;
}
if (strcmp(key_name, "f11") == 0 && level > 10) {
key->a = 255;
key->r = 0;
key->g = 0;
key->b = 255;
}
if (strcmp(key_name, "f12") == 0 && level > 11) {
key->a = 255;
key->r = 0;
key->g = 0;
key->b = 255;
}
}
}

void ckb_time(ckb_runctx* context, double delta){
if(fire == 1) {
bullet_position += (0.4 + level * 0.02);
}
if(bullet_position > 12) {
fire = 0;
bullet_position = 0;
}
enemy_position -= (0.08 + level * 0.02);
if(enemy_position == 0) {
game_over();
} else if (round(enemy_position) == round(bullet_position) && bullet_row == enemy_row) {
explode_enemy();
enemies++;
if(enemies > 8) {
level++;
enemies = 0;
}
}
unsigned count = context->keycount;
for(unsigned i = 0; i < count; i++){
ckb_key* key = context->keys + i;
char* key_name = key->name;
char* bullet_key_name = get_bullet_key_name();
char* enemy_key_name = get_enemy_key_name();
key->a = 255;
if (strcmp(key_name, row1[0]) == 0) {
key->r = 255;
key->g = 255;
key->b = 255;
} else if (strcmp(key_name, row2[0]) == 0) {
key->r = 255;
key->g = 255;
key->b = 255;
} else if (strcmp(key_name, row3[0]) == 0) {
key->r = 255;
key->g = 255;
key->b = 255;
} else if (strcmp(key_name, row4[0]) == 0) {
key->r = 255;
key->g = 255;
key->b = 255;
} else if (strcmp(key_name, "scroll") == 0) {
key->r = 255;
key->g = 0;
key->b = 255;
} else if (strcmp(key_name, bullet_key_name) == 0 && fire == 1) {
key->r = 0;
key->g = 255;
key->b = 0;
} else if (strcmp(key_name, enemy_key_name) == 0) {
key->r = 255;
key->g = 0;
key->b = 0;
} else {
key->r = 0;
key->g = 0;
key->b = 0;
}
}
draw_level(context, level);
}

int ckb_frame(ckb_runctx* context){
// Draw key colors
unsigned count = context->keycount;
return 0;
}