Skip to content

Instantly share code, notes, and snippets.

@ryzokuken
Created April 30, 2017 10:43
Show Gist options
  • Save ryzokuken/7ca5e4564892fca71c192566d5dd9d6e to your computer and use it in GitHub Desktop.
Save ryzokuken/7ca5e4564892fca71c192566d5dd9d6e to your computer and use it in GitHub Desktop.
#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Vital {
int current;
int maximum;
};
double get_fraction (struct Vital v) {
return (double) v.current / (double) v.maximum;
}
struct Character {
char name[20];
struct Vital health;
int power;
};
struct Character new_character (char *name, int health, int power) {
struct Character new_char;
strncpy(new_char.name, name, 20);
new_char.health.current = health;
new_char.health.maximum = health;
new_char.power = power;
return new_char;
}
struct Player {
struct Character character;
int level;
};
struct Node {
struct Character character;
struct Node *next;
};
struct Node *append (struct Node *queue, struct Character c) {
struct Node *node = (struct Node*) malloc (sizeof(struct Node));
node->character = c;
node->next = NULL;
if (queue == NULL) {
return node;
} else {
struct Node *temp = queue;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = node;
return queue;
}
}
void print_queue (struct Node *queue) {
while (queue != NULL) {
printf("%s\n%d/%d\n%d\n",
(queue->character).name,
(queue->character).health.current,
(queue->character).health.maximum,
(queue->character).power);
queue = queue->next;
}
}
struct Node *create_queue () {
struct Node *queue = NULL;
queue = append (queue, new_character ("Prof. X", 30, 10));
queue = append (queue, new_character ("Magneto", 100, 50));
queue = append (queue, new_character ("Storm", 50, 80));
queue = append (queue, new_character ("Iron Man", 70, 20));
return queue;
}
/* This callback quits the program */
static gboolean delete_event ( GtkWidget *widget, GdkEvent *event, gpointer data ) {
gtk_main_quit ();
return FALSE;
}
void attack_enemy (gpointer *queue) {
printf("%p\n", queue);
printf("%p\n", (struct Node *)queue);
}
GtkWidget *get_player_box (gchar *name, int level, gdouble healthFraction, int power) {
GtkWidget *player_box = gtk_vbox_new (TRUE, 0);
char level_string[12];
sprintf(level_string, "Level: %d", level);
char power_string[12];
sprintf(power_string, "Power: %d", power);
GtkWidget *player_name = gtk_label_new (name);
GtkWidget *player_level = gtk_label_new (level_string);
GtkWidget *player_health = gtk_progress_bar_new ();
gtk_progress_bar_set_fraction ((GtkProgressBar*) player_health, healthFraction);
GtkWidget *player_power = gtk_label_new (power_string);
gtk_box_pack_start((GtkBox*) player_box, player_name, TRUE, FALSE, 2);
gtk_widget_show(player_name);
gtk_box_pack_start((GtkBox*) player_box, player_level, TRUE, FALSE, 2);
gtk_widget_show(player_level);
gtk_box_pack_start((GtkBox*) player_box, player_health, TRUE, FALSE, 2);
gtk_widget_show(player_health);
gtk_box_pack_start((GtkBox*) player_box, player_power, TRUE, FALSE, 2);
gtk_widget_show(player_power);
return player_box;
}
GtkWidget *get_enemy_box (gchar *name, gdouble healthFraction, int power, struct Node *queue) {
GtkWidget *enemy_box = gtk_vbox_new (TRUE, 0);
char power_string[12];
sprintf(power_string, "Power: %d", power);
GtkWidget *enemy_name = gtk_label_new (name);
GtkWidget *enemy_health = gtk_progress_bar_new ();
gtk_progress_bar_set_fraction ((GtkProgressBar*) enemy_health, healthFraction);
GtkWidget *enemy_power = gtk_label_new (power_string);
GtkWidget *attack_button = gtk_button_new_with_label ("Attack");
g_signal_connect (attack_button, "clicked", G_CALLBACK (attack_enemy), (gpointer*) queue);
gtk_box_pack_start((GtkBox*) enemy_box, enemy_name, TRUE, FALSE, 2);
gtk_widget_show(enemy_name);
gtk_box_pack_start((GtkBox*) enemy_box, enemy_health, TRUE, FALSE, 2);
gtk_widget_show(enemy_health);
gtk_box_pack_start((GtkBox*) enemy_box, enemy_power, TRUE, FALSE, 2);
gtk_widget_show(enemy_power);
gtk_box_pack_start((GtkBox*) enemy_box, attack_button, TRUE, FALSE, 2);
gtk_widget_show(attack_button);
return enemy_box;
}
void add_enemies (GtkWidget *table, struct Node *queue) {
int index = 0;
while (queue != NULL) {
GtkWidget *enemy_box = get_enemy_box (queue->character.name, get_fraction(queue->character.health), queue->character.power, queue);
gtk_table_attach_defaults (GTK_TABLE (table), enemy_box, index % 3, (index % 3) + 1, (index / 3) + 1, (index / 3) + 2);
gtk_widget_show(enemy_box);
queue = queue->next;
index++;
}
}
int main( int argc, char *argv[] ) {
struct Node *queue = create_queue ();
// print_queue (queue);
GtkWidget *window;
GtkWidget *table;
gtk_init (&argc, &argv);
/* Create a new window */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "SpiderQuest");
g_signal_connect (window, "delete-event", G_CALLBACK (delete_event), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 20);
/* Create a 4x3 table */
table = gtk_table_new (4, 3, TRUE);
gtk_container_add (GTK_CONTAINER (window), table);
GtkWidget *player_box = get_player_box ("Spiderman", 4, 0.75, 50);
gtk_table_attach_defaults (GTK_TABLE (table), player_box, 1, 2, 0, 1);
gtk_widget_show(player_box);
add_enemies (table, queue);
gtk_widget_show (table);
gtk_widget_show (window);
gtk_main ();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment