From d4365b0efa38994a56f80cd1a9714a3f389f50e7 Mon Sep 17 00:00:00 2001 From: retoor <retoor@molodetz.nl> Date: Thu, 3 Apr 2025 12:31:59 +0200 Subject: [PATCH] Streamii 1.0. --- .gitignore | 2 + Makefile | 30 +++++++++++++ main.c | 95 +++++++++++++++++++++++++++++++++++++++++ main.o | Bin 0 -> 4600 bytes streamii_tamagotchi | Bin 0 -> 21792 bytes tamagotchi.c | 100 +++++++++++++++++++++++++++++++++++++++++++ tamagotchi.h | 36 ++++++++++++++++ tamagotchi.o | Bin 0 -> 3360 bytes ui.c | 101 ++++++++++++++++++++++++++++++++++++++++++++ ui.h | 15 +++++++ ui.o | Bin 0 -> 6088 bytes 11 files changed, 379 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 main.c create mode 100644 main.o create mode 100755 streamii_tamagotchi create mode 100644 tamagotchi.c create mode 100644 tamagotchi.h create mode 100644 tamagotchi.o create mode 100644 ui.c create mode 100644 ui.h create mode 100644 ui.o diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..302edd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +streamii.log +tamagotchi.log diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b74b95f --- /dev/null +++ b/Makefile @@ -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 \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..6cbb6fd --- /dev/null +++ b/main.c @@ -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; +} \ No newline at end of file diff --git a/main.o b/main.o new file mode 100644 index 0000000000000000000000000000000000000000..d0528d0502ae8fdcb20eba935344850e283913c5 GIT binary patch literal 4600 zcmbuDU1%Le6vrn`KW~%VTHD$WEi2j*X|p74m0D1)4L7|NE43v>L0C8U&gQPYU)`PU zO#@L&QzgWhst<w+zKHlBK2-<>Yf6KSf*&t}4+=i`kx&tf2&GixIkPkA$@UHeJg|3X ze)B(PW@mQJ4)?|E6Fp0snwYjG_9(km)0DA+wp-<lEM{06Yh{0>x8CT@jr@{3^LwU{ z8(q4s9U5~Z+3Q`Cxv^y^%#D0LU%E0Alk9Zv%+NH8HYHjnu<O}BmVnnNXhtqw*Z|-n z(u6W@SMkQO-{wYCS^2GBgkL-u<&a*4!)zOltU+&gEy6iBs-~mCph-wIs0CWdMzT|* zy;JhJ$6BF3nAor3sVA^Vo+OTbdT6QzW-UE@6Iyj;JPQaat7XgixJ6dRcf>6zxQQ}I zu#g^KAJbJxw*$pOdVCHX&kRjHl^*^oE}cjZUxw1`ukh1oc5t+f)^PR{gTp$L!?3}@ zwAxpXH5$(yhVWP0uVl$gUb=9nL3r-7OlxyI>7&`1vy<twzx^{ex4<=Ja3!L6rR4hM zMtiRpay!<^-6NJs(HEENEEEBE%f4@ys{O3T^-H{9iK<nt@rnh=@_?|TN@VrBWp0JS z4FoTwZehRT3*RmIgGhT1S_|v7f(vqMJ_z`W5Og6AKv|1~74SUwPx8V(Ya0aUA>tG} z<Q6#bEpc8;vBM?z6sYRHD9*Q~Sa*rLl?BeSj}wtEEK%fg^eJ`#pP_n^2QYyLy1VyT z?Y(_bMMPHDZhN=g+3`>$tGiy<wa4z<^MJyPErt1B0~hX_15frc*r=1pn&CpjR|>6Z z@Ca)fSkttnWyQ*K@H*cO3@@~2QJigC^YW7J*5%Ddn?WLZqaSdEKCj_kxXqdyW>6f9 z+|>*8*uz?)mtz2idj_8;Y4}Pu;+qZpUITA8@Vy3}G4Q7i+%a&^z)u?ZX#;=Fz~3_P z4-EWc1HWkC-x&DM2L88!V_t5wj+l-c@eKxkkAbtY>sRc&yfF_G2CMNPs0Pfd2fpCU z^GZ=zWS9&b;g;S0s>m1pxE}c|l6ir&I5IInMk<8)fYtM`n*&w|+&a<3^;lT&!y4oP zr_3u6s|VZ*ICR&~g%d$)ab#*?UM=t|!ebui1sW&BL_&cKg$ad197BbINcyp`Sgkvl z3>{1)Ov<8~15f4UOVyAw2OlPX+{qV@J04_JSc|Q2p+Vk|IpgMBY`9O*H2+ue&KS$Q zgS%Sm_baaTt5yARqF+w**f*Ni-xpVzP<PB>E8x=cUm_fHhvu&mzKZbo71#0isrpAm zPvgta5wu~yH2$YVkKZ=k?{|vp_=i>fN1~_kX9=hAZxD`irsJ=L_Zv;ee@@mI+pKtU zezp@%<9CoaEf7P;e~{=g=W6~K;du1b{1D-IWYqi!;kbV_e@1Z}Kke5gdOVM4y+`<3 z!s{dsex?TCLVJbi@!O!|yh%8nhmAN8Fq}91CTe}B;(DH6M-kXwqNnS4kZ?SG={Rm8 z&U-QnV?NQ-ID>@aSzpI_BN6Akit{$n(>Nazj;C=QXEG7zOBH9D=xLnUg#HJmzh=<i zBzz<3w?!R1aGp02e!t@AhQ&YOLfc97bUa;z<2PPE*CT{)A^aHOc&^cU3(9ENuNtzf zGdnz07H%KhMG)VMx)kt|YYRRgm<@+Sm)U(`$n2mRSMt>|<aTJQR0X%;%+(>2s;c)_ zBD)sAcP9|1zy~AoqT>aSmE(T@=dT6+_=;mLrIt|@eU8#?YCGsE!#TsX$;^|uuo9Ce z*iYC9hPeoRaSx&48l!E83%QzZMAF_(0>zX4?*xu9lk&y-cY!a)T(Fi<*Z#?aX|n%^ zmB0RuK~>s2>bY@z)U?08?}tWRrn)Q2pE4{bwMT&Ad!8KswDPy0jhdc+&7Ow>#!ULp zDF3}$sP0LBd<#*UQSJIRgC7Afz0SD)_)2Jh%^UTNewI4oPpE-m&c}X|{und4_JG*; cI4NLuV!{$thTn`v{_v-aG<|-EYq!t;e=@XtwEzGB literal 0 HcmV?d00001 diff --git a/streamii_tamagotchi b/streamii_tamagotchi new file mode 100755 index 0000000000000000000000000000000000000000..98359e4008e89696c93b36e0226bc0b84ec29d78 GIT binary patch literal 21792 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 B9>V|t literal 0 HcmV?d00001 diff --git a/tamagotchi.c b/tamagotchi.c new file mode 100644 index 0000000..c24be51 --- /dev/null +++ b/tamagotchi.c @@ -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"; + } +} \ No newline at end of file diff --git a/tamagotchi.h b/tamagotchi.h new file mode 100644 index 0000000..2faaa82 --- /dev/null +++ b/tamagotchi.h @@ -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 \ No newline at end of file diff --git a/tamagotchi.o b/tamagotchi.o new file mode 100644 index 0000000000000000000000000000000000000000..8487ed5c1c5fe827bb324f0f53599fbbce61819c GIT binary patch literal 3360 zcmbtX&1+*-6u&Q%nZ_|~qeQ7pDM1Dq(LOqzVGz;!pwtFNC6*Q!I(>ajUz=*aOkQXr zGpSHhDB<ad3thOFr7pyOz(rsdZr!*Wup2kig$@G}{Ho{Nd(O@Cn#!OD?mg%J&gVVv zyce>&@XE_E%MwhMm=l8&qe84bG>{!BI$~UmiTmSIzpi8te#{=+=x4hN{cpuAXr<)D zH?)|zs>S30O<^Eqn;wW0nE&Rr+h*vlGtub<4YcoyFqcN*Af=9b{f+in8A)*Xu9FON zzeuB8Qd&95POtT_v~rT1uj?ej+-YT&P-Y2?Hm2+n81BeAv7A?xOFYa?sTgqrFb3t) zeZaC+MN~G_Gb;07HUE|-P*I`Oag`=oDy5O7QuZ)+PuZz*jJ!^K(1<u@mR{n4t65T6 zpuco!?r-GM`Z52%29JO6y{<3J{U$G^n&&{z|A<}^ALO43pzc6{#|oeV(_zk1fSjJL z*z2cv)e~@1ICe)bqPpwEqly?R&MO7X#=rx6cSPOSv)qL~wjZZ3AWA(nq0`%?nVJB% zlOA?zuOHvZ9rUtcx`Srf@HDb+JeK_|8$Ko>>$|z*LsA?)!@`p+Ji$VWg%J|2-4?4m zt76$*7HzjJnr>4}yVIiLRxs{AX>or3`OJlt^+q{pWG-H^FWEEGR~qs-+n&8_&s=_* zV1cc`7GSlDudN8^Sr4&Ou#n{Y4cvNfNm$L4buKxQxCtGf1Pm9_o475ErS@a<qi14E zV4-v`AP)2qZd$*u^=}~#w1u12uWJ2u#DPA<P3t>a|2g77MclMLul3&`4s;(kt-q`F zcMu197dNdhNIgQs2!|~$?i~-)of`TD#$L)<_?ycZoF0wX%N_zYML3^j?*Ow2zY82m z_6+z-urSW+SQwD(74T(Pi2p#i>=9r-;aBnH0Fu1{eghWT&(VXIJwb!OD|uU$AYa(F z^J2Ta9k>HTZ2JC2^jt6cel-eIi(bp!*$xU(Fkke&aujG(H@v`)AZ|VIg1Xr9quJa| zFOTI*%2S<q4HS7!D<|OB4gB|GMI8fI(V>q9E<d-R{M5i<)Fs_AaQQn0nlBAper^Dl z-xA<hKdu(pO@fTX_&(toi4O2j2tRM&T*n0i|LTM|WF{QLp674Pz<K`OH*lW6TL#Ya z*E4XQze5A(`4e`%RSLXy;6Y9C0!uZ&=-Gka41^7H;|Y7cUKh4RYZZm$E2WZO27_`X z@NM|8O~XXx-=XtXxnWmpm8xG0TIA>#+|8O-((^@S{b!Z|Pki;x7!e#ge@)MW)%2S3 zQJez_XU@?G2_uU4=!kQMzC4FKS5Facq!B-v0L3x$KT9!9^9S|6Liuryqx3Tc#Q0I- z_lvQMAPl>IkM7?jL%ctJUCsN?0fu*)ffc1mN@V8e`!inzCzhlBS+h`5nznBMj-{IS zXa5ZOG2{CAjKAy{)ATP;{yrNLH~rrRd|3aUBf~Gq5Bql(7W?!349kr!YuId{1YLL( mWXxmw<KGT*b^sCudLcf>Lxjx!Jp#I6{)d#P74b#U^#2Q}WHa3W literal 0 HcmV?d00001 diff --git a/ui.c b/ui.c new file mode 100644 index 0000000..327dba3 --- /dev/null +++ b/ui.c @@ -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(); +} \ No newline at end of file diff --git a/ui.h b/ui.h new file mode 100644 index 0000000..799ad91 --- /dev/null +++ b/ui.h @@ -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 \ No newline at end of file diff --git a/ui.o b/ui.o new file mode 100644 index 0000000000000000000000000000000000000000..343860ad4ec88505b12cc52e5c675f661134afe0 GIT binary patch literal 6088 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 CUiat# literal 0 HcmV?d00001