Created
April 30, 2017 10:43
-
-
Save ryzokuken/7ca5e4564892fca71c192566d5dd9d6e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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