Streamii 1.0.
This commit is contained in:
parent
12bb3a8e23
commit
d4365b0efa
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
streamii.log
|
||||
tamagotchi.log
|
30
Makefile
Normal file
30
Makefile
Normal file
@ -0,0 +1,30 @@
|
||||
CC = gcc
|
||||
CFLAGS = -Wall -Wextra -std=c11 -D_DEFAULT_SOURCE
|
||||
LDFLAGS = -lncurses
|
||||
|
||||
# Executable name
|
||||
TARGET = streamii_tamagotchi
|
||||
|
||||
# Source files
|
||||
SRCS = main.c tamagotchi.c ui.c
|
||||
|
||||
# Object files
|
||||
OBJS = $(SRCS:.c=.o)
|
||||
|
||||
# Default target
|
||||
all: $(TARGET)
|
||||
|
||||
# Linking the target executable
|
||||
$(TARGET): $(OBJS)
|
||||
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
|
||||
|
||||
# Compiling source files
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c $<
|
||||
|
||||
# Clean up
|
||||
clean:
|
||||
rm -f $(OBJS) $(TARGET)
|
||||
|
||||
# Phony targets
|
||||
.PHONY: all clean
|
95
main.c
Normal file
95
main.c
Normal file
@ -0,0 +1,95 @@
|
||||
#include <ncurses.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include "tamagotchi.h"
|
||||
#include "ui.h"
|
||||
|
||||
int main() {
|
||||
// Open a log file for debugging
|
||||
FILE *log_file = fopen("streamii.log", "w");
|
||||
if (!log_file) {
|
||||
perror("Failed to open log file");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Log start of the game
|
||||
fprintf(log_file, "Streamii game started\n");
|
||||
fflush(log_file);
|
||||
|
||||
// Initialize Tamagotchi
|
||||
Tamagotchi streamii;
|
||||
init_tamagotchi(&streamii);
|
||||
fprintf(log_file, "Streamii initialized\n");
|
||||
fflush(log_file);
|
||||
|
||||
// Initialize UI
|
||||
init_ui();
|
||||
fprintf(log_file, "UI initialized\n");
|
||||
fflush(log_file);
|
||||
|
||||
// Game loop
|
||||
while (streamii.is_alive) {
|
||||
// Update Tamagotchi stats
|
||||
update_tamagotchi_stats(&streamii);
|
||||
fprintf(log_file, "Updated Streamii stats\n");
|
||||
fflush(log_file);
|
||||
|
||||
// Clear and redraw screen
|
||||
clear();
|
||||
|
||||
// Draw Tamagotchi
|
||||
draw_tamagotchi(&streamii);
|
||||
|
||||
// Draw stats
|
||||
draw_stats(&streamii);
|
||||
|
||||
// Display menu
|
||||
display_menu();
|
||||
|
||||
// Refresh screen
|
||||
refresh();
|
||||
|
||||
// Get user input
|
||||
int ch = get_user_input();
|
||||
fprintf(log_file, "User input received: %d\n", ch);
|
||||
fflush(log_file);
|
||||
|
||||
// Handle user input
|
||||
switch (ch) {
|
||||
case KEY_F(1): // F1 to feed
|
||||
feed_tamagotchi(&streamii);
|
||||
fprintf(log_file, "Fed Streamii\n");
|
||||
break;
|
||||
case KEY_F(2): // F2 to sleep
|
||||
sleep_tamagotchi(&streamii);
|
||||
fprintf(log_file, "Made Streamii sleep\n");
|
||||
break;
|
||||
case KEY_F(3): // F3 to play
|
||||
play_with_tamagotchi(&streamii);
|
||||
fprintf(log_file, "Played with Streamii\n");
|
||||
break;
|
||||
case KEY_F(4): // F4 to clean
|
||||
clean_tamagotchi(&streamii);
|
||||
fprintf(log_file, "Cleaned Streamii\n");
|
||||
break;
|
||||
case 'q': // Q to quit
|
||||
case 'Q':
|
||||
streamii.is_alive = 0;
|
||||
fprintf(log_file, "User quit the game\n");
|
||||
break;
|
||||
}
|
||||
|
||||
// Small delay to control game speed
|
||||
usleep(200000); // 200ms
|
||||
}
|
||||
|
||||
// Show game over screen
|
||||
show_game_over();
|
||||
fprintf(log_file, "Game over\n");
|
||||
|
||||
// Cleanup
|
||||
cleanup_ui();
|
||||
fclose(log_file);
|
||||
|
||||
return 0;
|
||||
}
|
BIN
streamii_tamagotchi
Executable file
BIN
streamii_tamagotchi
Executable file
Binary file not shown.
100
tamagotchi.c
Normal file
100
tamagotchi.c
Normal file
@ -0,0 +1,100 @@
|
||||
#include <stdlib.h>
|
||||
#include "tamagotchi.h"
|
||||
|
||||
// Initialize Tamagotchi with default stats
|
||||
void init_tamagotchi(Tamagotchi *tama) {
|
||||
tama->hunger = 50;
|
||||
tama->energy = 100;
|
||||
tama->happiness = 75;
|
||||
tama->cleanliness = 100;
|
||||
tama->state = HAPPY;
|
||||
tama->age = 0;
|
||||
tama->is_alive = 1;
|
||||
}
|
||||
|
||||
// Feed the Tamagotchi
|
||||
void feed_tamagotchi(Tamagotchi *tama) {
|
||||
if (!tama->is_alive) return;
|
||||
|
||||
tama->hunger += 20;
|
||||
if (tama->hunger > MAX_STAT) tama->hunger = MAX_STAT;
|
||||
|
||||
tama->cleanliness -= 10;
|
||||
if (tama->cleanliness < MIN_STAT) tama->cleanliness = MIN_STAT;
|
||||
|
||||
tama->happiness += 5;
|
||||
if (tama->happiness > MAX_STAT) tama->happiness = MAX_STAT;
|
||||
}
|
||||
|
||||
// Make Tamagotchi sleep
|
||||
void sleep_tamagotchi(Tamagotchi *tama) {
|
||||
if (!tama->is_alive) return;
|
||||
|
||||
tama->energy += 30;
|
||||
if (tama->energy > MAX_STAT) tama->energy = MAX_STAT;
|
||||
|
||||
tama->hunger -= 10;
|
||||
if (tama->hunger < MIN_STAT) tama->hunger = MIN_STAT;
|
||||
}
|
||||
|
||||
// Play with Tamagotchi
|
||||
void play_with_tamagotchi(Tamagotchi *tama) {
|
||||
if (!tama->is_alive) return;
|
||||
|
||||
tama->happiness += 15;
|
||||
if (tama->happiness > MAX_STAT) tama->happiness = MAX_STAT;
|
||||
|
||||
tama->energy -= 15;
|
||||
tama->hunger -= 10;
|
||||
|
||||
if (tama->energy < MIN_STAT) tama->energy = MIN_STAT;
|
||||
if (tama->hunger < MIN_STAT) tama->hunger = MIN_STAT;
|
||||
}
|
||||
|
||||
// Clean Tamagotchi
|
||||
void clean_tamagotchi(Tamagotchi *tama) {
|
||||
if (!tama->is_alive) return;
|
||||
|
||||
tama->cleanliness += 30;
|
||||
if (tama->cleanliness > MAX_STAT) tama->cleanliness = MAX_STAT;
|
||||
|
||||
tama->happiness += 5;
|
||||
if (tama->happiness > MAX_STAT) tama->happiness = MAX_STAT;
|
||||
}
|
||||
|
||||
// Update Tamagotchi stats each game cycle
|
||||
void update_tamagotchi_stats(Tamagotchi *tama) {
|
||||
if (!tama->is_alive) return;
|
||||
|
||||
// Gradually decrease stats
|
||||
tama->hunger -= 5;
|
||||
tama->energy -= 3;
|
||||
tama->happiness -= 2;
|
||||
tama->cleanliness -= 1;
|
||||
tama->age++;
|
||||
|
||||
// Determine state based on stats
|
||||
if (tama->hunger <= 20) tama->state = HUNGRY;
|
||||
else if (tama->energy <= 20) tama->state = SLEEPY;
|
||||
else if (tama->happiness <= 20) tama->state = BORED;
|
||||
else tama->state = HAPPY;
|
||||
|
||||
// Check if Tamagotchi dies
|
||||
if (tama->hunger <= MIN_STAT ||
|
||||
tama->energy <= MIN_STAT ||
|
||||
tama->happiness <= MIN_STAT) {
|
||||
tama->is_alive = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Get facial expression based on current state
|
||||
const char* get_tamagotchi_face(Tamagotchi *tama) {
|
||||
switch (tama->state) {
|
||||
case HAPPY: return "^w^";
|
||||
case HUNGRY: return "T_T";
|
||||
case SLEEPY: return "~_~";
|
||||
case SICK: return "x_x";
|
||||
case BORED: return "-_-";
|
||||
default: return "o_o";
|
||||
}
|
||||
}
|
36
tamagotchi.h
Normal file
36
tamagotchi.h
Normal file
@ -0,0 +1,36 @@
|
||||
#ifndef TAMAGOTCHI_H
|
||||
#define TAMAGOTCHI_H
|
||||
|
||||
#define MAX_STAT 100
|
||||
#define MIN_STAT 0
|
||||
|
||||
// Tamagotchi states
|
||||
typedef enum {
|
||||
HAPPY,
|
||||
HUNGRY,
|
||||
SLEEPY,
|
||||
SICK,
|
||||
BORED
|
||||
} TamaState;
|
||||
|
||||
// Tamagotchi structure
|
||||
typedef struct {
|
||||
int hunger; // 0-100
|
||||
int energy; // 0-100
|
||||
int happiness; // 0-100
|
||||
int cleanliness; // 0-100
|
||||
TamaState state;
|
||||
int age; // in game cycles
|
||||
int is_alive;
|
||||
} Tamagotchi;
|
||||
|
||||
// Function prototypes
|
||||
void init_tamagotchi(Tamagotchi *tama);
|
||||
void feed_tamagotchi(Tamagotchi *tama);
|
||||
void sleep_tamagotchi(Tamagotchi *tama);
|
||||
void play_with_tamagotchi(Tamagotchi *tama);
|
||||
void clean_tamagotchi(Tamagotchi *tama);
|
||||
void update_tamagotchi_stats(Tamagotchi *tama);
|
||||
const char* get_tamagotchi_face(Tamagotchi *tama);
|
||||
|
||||
#endif // TAMAGOTCHI_H
|
BIN
tamagotchi.o
Normal file
BIN
tamagotchi.o
Normal file
Binary file not shown.
101
ui.c
Normal file
101
ui.c
Normal file
@ -0,0 +1,101 @@
|
||||
#include <ncurses.h>
|
||||
#include <string.h>
|
||||
#include "ui.h"
|
||||
#include "tamagotchi.h"
|
||||
|
||||
// Initialize UI
|
||||
void init_ui(void) {
|
||||
// Initialize ncurses
|
||||
initscr(); // Start ncurses mode
|
||||
cbreak(); // Line buffering disabled
|
||||
noecho(); // Don't echo() while we do getch
|
||||
keypad(stdscr, TRUE); // We get F1, F2 etc..
|
||||
curs_set(0); // Hide cursor
|
||||
timeout(100); // Set non-blocking input with 100ms delay
|
||||
}
|
||||
|
||||
// Cleanup UI
|
||||
void cleanup_ui(void) {
|
||||
endwin(); // End ncurses mode
|
||||
}
|
||||
|
||||
// Draw Streamii
|
||||
void draw_tamagotchi(Tamagotchi *tama) {
|
||||
int max_y, max_x;
|
||||
getmaxyx(stdscr, max_y, max_x);
|
||||
|
||||
// Streamii body
|
||||
int start_y = max_y / 2 - 5;
|
||||
int start_x = max_x / 2 - 10;
|
||||
|
||||
// Clear previous drawing
|
||||
clear();
|
||||
|
||||
// Streamii body (simplified ASCII art)
|
||||
mvprintw(start_y, start_x, " /\\___/\\ ");
|
||||
mvprintw(start_y + 1, start_x, " ( o o ) ");
|
||||
mvprintw(start_y + 2, start_x, " / ^ \\ ");
|
||||
mvprintw(start_y + 3, start_x, " / \\___/ \\ ");
|
||||
|
||||
// Facial expression
|
||||
const char* face = get_tamagotchi_face(tama);
|
||||
mvprintw(start_y + 2, start_x + 6, "%s", face);
|
||||
}
|
||||
|
||||
// Draw stats
|
||||
void draw_stats(Tamagotchi *tama) {
|
||||
int max_y, max_x;
|
||||
getmaxyx(stdscr, max_y, max_x);
|
||||
|
||||
// Stats area
|
||||
mvprintw(max_y - 5, 2, "Hunger: [");
|
||||
for (int i = 0; i < tama->hunger / 10; i++)
|
||||
printw("#");
|
||||
mvprintw(max_y - 4, 2, "Energy: [");
|
||||
for (int i = 0; i < tama->energy / 10; i++)
|
||||
printw("#");
|
||||
mvprintw(max_y - 3, 2, "Happiness: [");
|
||||
for (int i = 0; i < tama->happiness / 10; i++)
|
||||
printw("#");
|
||||
mvprintw(max_y - 2, 2, "Cleanliness: [");
|
||||
for (int i = 0; i < tama->cleanliness / 10; i++)
|
||||
printw("#");
|
||||
|
||||
// Age and status
|
||||
mvprintw(max_y - 1, 2, "Age: %d | Status: %s",
|
||||
tama->age,
|
||||
tama->is_alive ? "Alive" : "DEAD");
|
||||
}
|
||||
|
||||
// Display menu
|
||||
void display_menu(void) {
|
||||
int max_y, max_x;
|
||||
getmaxyx(stdscr, max_y, max_x);
|
||||
|
||||
mvprintw(max_y - 7, 2, "Controls:");
|
||||
mvprintw(max_y - 6, 2, "F1: Feed");
|
||||
mvprintw(max_y - 6, 20, "F2: Sleep");
|
||||
mvprintw(max_y - 5, 2, "F3: Play");
|
||||
mvprintw(max_y - 5, 20, "F4: Clean");
|
||||
mvprintw(max_y - 4, 2, "Q: Quit");
|
||||
}
|
||||
|
||||
// Get user input
|
||||
int get_user_input(void) {
|
||||
return getch();
|
||||
}
|
||||
|
||||
// Show game over screen
|
||||
void show_game_over(void) {
|
||||
int max_y, max_x;
|
||||
getmaxyx(stdscr, max_y, max_x);
|
||||
|
||||
clear();
|
||||
mvprintw(max_y/2, max_x/2 - 5, "GAME OVER");
|
||||
mvprintw(max_y/2 + 1, max_x/2 - 10, "Your streamii has died :(");
|
||||
refresh();
|
||||
|
||||
// Wait for key press
|
||||
timeout(-1);
|
||||
getch();
|
||||
}
|
15
ui.h
Normal file
15
ui.h
Normal file
@ -0,0 +1,15 @@
|
||||
#ifndef UI_H
|
||||
#define UI_H
|
||||
|
||||
#include "tamagotchi.h"
|
||||
|
||||
// UI function prototypes
|
||||
void init_ui(void);
|
||||
void cleanup_ui(void);
|
||||
void draw_tamagotchi(Tamagotchi *tama);
|
||||
void draw_stats(Tamagotchi *tama);
|
||||
void display_menu(void);
|
||||
int get_user_input(void);
|
||||
void show_game_over(void);
|
||||
|
||||
#endif // UI_H
|
Loading…
Reference in New Issue
Block a user