From dc3233343ad736d66bdc135ce5da9cc0050be60b Mon Sep 17 00:00:00 2001 From: dvorakmortonxd Date: Sun, 30 Aug 2026 03:24:27 +0200 Subject: [PATCH] fucking gitignore --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 10 ++++ assets/.DS_Store | Bin 6148 -> 0 bytes game | Bin 35816 -> 0 bytes src/main.c | 132 +++++++++++++++++++++++++++++++++++------------ 5 files changed, 108 insertions(+), 34 deletions(-) delete mode 100644 .DS_Store delete mode 100644 assets/.DS_Store delete mode 100755 game diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index f0ea327749577a6d918276eb3c81bd05fee2cc5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5Z-O8-BN@c6nYGJE!f&pC|*LWFJMFuDm5WNgE3p0)Er77XMG``#OHBl zcXJ39youPEvir@>&u->}?hj*(yQ^@>n8g?q&=5H)TLjHpT@4eA$kiM<%Yq_X1c?l` zO!OB``0e}5XBqq=R{#EwV3EXGJ{WxRMzgiI-xh7r75CngEWF&$SDEWCZ*g=bWfD}n zA6&;#F}DuSWt#hO8ZA{q97YgwcN3?fEL^!t!%XFR+95ikGq-x{^=Lfp+vCY_)3?{t z(*fwC$!60LN5>~;m-FZ3C6#ZQNDiDUIWSnkJ1Di9UcF_S$n+8HRZbO4NDL4I!~ij{ zdkmPfKy-JnbgGybAO?P50QUzQ8lq#c)Tp)&=jKoMW)m Vh_j$wr32DMKoLS6G4Klvd;zunOj-Z{ diff --git a/.gitignore b/.gitignore index c8bb3af..dba9a93 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,16 @@ # Prerequisites *.d +# the game itself +game + +# macos bs +.DS_Store +assets/.DS_Store + +# claude code +.claude + # Object files *.o *.ko diff --git a/assets/.DS_Store b/assets/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H9cEggFLNrCjV*2~exx2Z!JandY z`bW=UzCGV}&Ue1^o!|M+xw}m6Iluk#A75oLrZ6NMXd-CxaK?5sCpgBg2bF^~t*W@J z(O6w1U1YUanJw%cHwHz8l`KUI@{ig%(cuz9cD6Hi z5XFSeWKa*}1;|f)4|t%E%vFKRNrgZ(%Uo#T5AI>C!cs=!Xpj>`aZ?zJgbM@yx=B$Nxc643$&XNP`ix;EJ2@+$P0%i*5Id;ki8S_xb$A_F!KE_9O zdZ|NGqJC*SR7YcGrMpnHE2}Wn5-n^DHS2X@eJd9tzQE!I^`Yh#Z zU?Kj&Wq%!-lf7C{+8*Z=R#@E{iR#UTmHxW0H{4oS8um8pTSMWdNTEAaAMzG7qzVc* z=;4STi>}KU*sCo7)`>FYxy_zo($;E22mUwM;uc= z*N`c$Dct~~@~VA^Z}S47%5RVc?8@o>9rn)tlPun0&%MYp+B`4V*r5*P;>|EO;TiBr zJB!2BKA1bsoND|%l&P%Eqbh71QR4I5Wv$Tt8I@*ZweYlHzB0XMejA z#~yW1ZFTjjimNZto_i7f_ffypwzr+dC%`|K!j_VpoZ;$Hm5eP%n243+7*}5|@S(ad z1_mZ!yZdlJ0VX3@UvdO&9(5I!+eF(llU&`T&xX0WS$;n5# z+1%axJ)H{^VTvt2W{NkH{@X?$yo~TeJ>i$qpP^G8oEtXio9b|NCC9KX-rnKr!va2pIqbS%XU9l? zbH)(eK5om=Mz;1N7K;)~a+h(;U`HLs#$r8jTPoJCYGbeQF)aD(GIbZ*(q`;kd@QI( z9FDVLEv!JFynl?3=c%z9zUO1jlASajm|w#9GR%xQ&X2g{Zag~XleC(%vMWwxTtQto=bS2BM2SSIT z?_?R|C9Lc0R99an`Id|QCKvmjP7P-1@*#$Xg?U;vbXU>@s ztedF{w(?~;YSyVK>Q2X0m8ngHA@!v|pVpL$`s5te^%d-$wY$3EZ#Vaa>c46G8So!I zImQmgO$F`OqfSlvY!2a-Ir5yF#gpTOUgmWu<8zwXL^>Dv-s>2doFwY84!Xp10doP} zWG?IC0#*Y4;ziOC$Kl2ID+pVz2{i`Zr<{5d>rRQ&9~QN)z(m>p{-1LN8a z9gTdOikQPZB7Vlv_lO!Q!<_9Mf#)4CS8d3F9obEua~0vc3jdDNNO~A^;@Cb<0{b6- zc232!bE>PG{Gs?N{c7NFFJkK@

AQz~(yx1BdTITY6^FToaxbCV@vkw3aUz`(>(( zp$y*vId;8x#wCGUf(^#meMVif&{Pf{KlOMUeDyyx4Mct8dmzT^>celFL*#=CL^#se zI!$@i&|J`Fc0JFD8m%N8 z4uzLHXGJm@iTE{h73G?mQmZomp<+@Gwdg^oH|Fz)@|<`0x0%(wk%%6R6gGr{(E{|r z+@6Y>3U_hka%ZX6AJBcyXvi4|d3{dO$a7jdyVLD1sjh}HYPlX-L}K;zdL+^i3j|v8 zGMUkX4}%MBT2QC!Ed^V>53r5Jp0yQg%P#AO6r7PzEa z;diRDMsIEjc%!=by^S@*lR2l~&h&p$F62b?|4Ecw{B!UFQ-j~g3Vw58rHPc0Vq`86 zkO)WwBmxoviGV~vA|Mfv2uK7Z0uljd@Ikd4=oC}p?N-zQT}e}7E5_@m?OHoRBG zWqQw=%10PE-gn`$!^ks@oZf#XJ$lcT@=-=EUMtRS8)L}g&!4l~@ESZ)cAI#8J-ZF> zB5;{r#-Q@+jGWFVAQ><2@todsCHZR~Ib{oCFN^*{o=Nh@w$n%VR zx{=Q?@|iqmZ6cGO5&?;TL_i`S5s(N-1SA3y0f~S_Kq4R!kO)WwBmxoviGV~vA|Mfv z2uK7Z0uljIAY5+X~dfv{4zXAFLl##)PPX{dqtpcqD-GdQmbZMPCtm9@j zj~?{tVLfavtI@YbV`05C9BQtPg&Vx}y190vKj;f>6(y_nfVVZpMxxri{EbzW!~ z9HMA8QySLwAw8ApQGUgqXaQ-B-dY#(hJDphx=oJzkJ1`{eN#k86}X{Ka8;o|pyUBP zXo%}$sS4qmJD_`w(HaGz7GnrPt_tgsbn9w8DoR&}y<6R(KnP9gnmu&^BXJ|om086LO^J%0))AbX>{8kH&jfw{|T9(a5u(+O+u{1?S31JHwb}jn^dcS zy}QvH4C(<3q}4YzX$`n0kZI$yHGi-r7G?Q# z@1nK|Hwm%@&0c?yEe`W=Ww*pyd=v;P(Lql}hyA0B9%Err-(%>o4ji08>z2;ZAo&s) zlIfg_F^V{4gXAS#W-Nh&J4h}zWV(}((TBEMphPY9X1;^{qnLP*P>S>#I=d4y0->rb=Dxc_&EJ-0=!vB-56 zd7DMvW04P9{Nnok9DrY1^jYG|SU0GPc_x^|uLG9P;oR`O>y=xRQp3ggg>eZ|;}Qli+Cv@7g2+K{~lTTW`P(fD4Y8GDUp z>^0xgb}b*pgn)QFy8ma7V)G;NzxvSp@{_C{toS%W6w98c2`HmgzLVLoP1*2|v3o(a zqMDZbzAC4UFLk5nTAAa#QLFF=<*&xPKjHq-`^!$fJY)Bs1HtEy91CQK$^G|Nr`1GO|cdkA<@&0)$3b)0pCL~^d=%rU{L%+Vz z(3A1U)2Ewk>uQG$Jows!+jsw|dw==&=fCiE^|#;on@!_8+8$6o_Kdt{^?cSG5dLD0m=Hri!7cM@h=DhUWFE%{Z`u>?uA3dBu KGJ~Fnl>QA3LZ3wd diff --git a/src/main.c b/src/main.c index 5085294..350ddf4 100644 --- a/src/main.c +++ b/src/main.c @@ -31,10 +31,21 @@ typedef struct { typedef struct { bool is_running; // Controls the main game loop float escape_timer; // Tracks how long the Escape key has been held (in ms) - int visible_chars; // Number of characters currently revealed in the typewriter text - uint32_t last_char_time; // Timestamp of the last character revealed - const char* message; // The string to be displayed - TTF_Font* font; // Pointer to the loaded TrueType font + // Message 1: "Hello, human." + const char* message1; + int visible_chars1; // Number of characters revealed in message1 + uint32_t last_char_time1; // Timestamp of last character revealed in message1 + // Message 2: "It is a known fact that C, is superior to every other programming language." + const char* message2; + int visible_chars2; // Number of characters revealed in message2 + uint32_t last_char_time2; // Timestamp of last character revealed in message2 + int message_stage; // 0: showing message1, 1: showing message2 + uint32_t message1_finish_time; // Timestamp when message1 finished revealing (0 if not finished) + // Fonts + TTF_Font* font_large; // Font for message1 (120pt) + TTF_Font* font_small; // Font for message2 (24pt) + TTF_Font* current_font; // Currently used font (points to either font_large or font_small) + // Audio Mix_Chunk* beep_chunk; // Sound effect for each typed character // Screen shake effect float shake_timer; // Time remaining for shake effect (ms) @@ -66,13 +77,18 @@ bool init_game(Game *game) { return false; } - // Load the font file from assets. Size is 48 for a cinematic look. - game->font = TTF_OpenFont("assets/font.ttf", 48); - if (!game->font) { - printf("CRITICAL: Failed to load font! TTF_Error: %s\n", TTF_GetError()); - } else { - printf("SUCCESS: Font loaded successfully!\n"); + // Load the fonts + game->font_large = TTF_OpenFont("assets/font.ttf", 120); + if (!game->font_large) { + printf("CRITICAL: Failed to load large font! TTF_Error: %s\n", TTF_GetError()); + return false; } + game->font_small = TTF_OpenFont("assets/font.ttf", 24); + if (!game->font_small) { + printf("CRITICAL: Failed to load small font! TTF_Error: %s\n", TTF_GetError()); + return false; + } + game->current_font = game->font_large; // Start with large font for first message // Load the beep sound effect game->beep_chunk = Mix_LoadWAV("assets/dialog-beep.wav"); @@ -84,9 +100,14 @@ bool init_game(Game *game) { // Setup initial state game->is_running = true; game->escape_timer = 0.0f; - game->visible_chars = 0; - game->last_char_time = SDL_GetTicks(); - game->message = "Hello, human."; + game->message1 = "Hello, human."; + game->visible_chars1 = 0; + game->last_char_time1 = SDL_GetTicks(); + game->message2 = "It is a known fact that C, is superior to every other programming language."; + game->visible_chars2 = 0; + game->last_char_time2 = 0; // Not used until we switch to message2 + game->message_stage = 0; // Start with message1 + game->message1_finish_time = 0; // Not finished yet // Initialize shake effect game->shake_timer = 0.0f; game->shake_duration = 300.0f; // 300ms shake duration @@ -148,21 +169,52 @@ void update(Game *game) { } // TYPEWRITER LOGIC: - // Check if enough time has passed since the last letter appeared. uint32_t current_time = SDL_GetTicks(); - if (current_time - game->last_char_time >= 333) { // Adjusted timing - if (game->visible_chars < (int)strlen(game->message)) { - // Check if the character to be revealed is a space - char current_char = game->message[game->visible_chars]; - game->visible_chars++; - // Play beep for each character except spaces (already lower pitch due to mixer frequency) - if (game->beep_chunk && current_char != ' ') { - Mix_PlayChannel(-1, game->beep_chunk, 0); - // Trigger shake effect for non-space characters - game->shake_timer = game->shake_duration; + if (game->message_stage == 0) { + // Handling message1: "Hello, human." + if (current_time - game->last_char_time1 >= 333) { // Adjusted timing + if (game->visible_chars1 < (int)strlen(game->message1)) { + char current_char = game->message1[game->visible_chars1]; + game->visible_chars1++; + + // Play beep for each character except spaces (already lower pitch due to mixer frequency) + if (game->beep_chunk && current_char != ' ') { + Mix_PlayChannel(-1, game->beep_chunk, 0); + // Trigger shake effect for non-space characters + game->shake_timer = game->shake_duration; + } + game->last_char_time1 = current_time; + } + // Check if we just finished message1 + if (game->visible_chars1 == (int)strlen(game->message1)) { + game->message1_finish_time = current_time; + } + } + + // Check if we should switch to message2 (after 3.5 seconds of finishing message1) + if (game->message1_finish_time != 0 && + (current_time - game->message1_finish_time >= 3500)) { + game->message_stage = 1; + game->visible_chars2 = 0; + game->last_char_time2 = current_time; + game->current_font = game->font_small; // Switch to small font + } + } else if (game->message_stage == 1) { + // Handling message2: "It is a known fact that C, is superior to every other programming language." + if (current_time - game->last_char_time2 >= 333) { // Adjusted timing + if (game->visible_chars2 < (int)strlen(game->message2)) { + char current_char = game->message2[game->visible_chars2]; + game->visible_chars2++; + + // Play beep for each character except spaces (already lower pitch due to mixer frequency) + if (game->beep_chunk && current_char != ' ') { + Mix_PlayChannel(-1, game->beep_chunk, 0); + // Trigger shake effect for non-space characters + game->shake_timer = game->shake_duration; + } + game->last_char_time2 = current_time; } - game->last_char_time = current_time; } } @@ -183,19 +235,30 @@ void render(SDL_Renderer *renderer, Game *game) { SDL_RenderClear(renderer); // 2. Render the revealed portion of the text - if (game->font) { - char buffer[64] = {0}; - if (game->visible_chars > 0) { + if (game->current_font) { + // Determine which message to render based on message_stage + const char* message_to_render; + int visible_chars_to_render; + if (game->message_stage == 0) { + message_to_render = game->message1; + visible_chars_to_render = game->visible_chars1; + } else { + message_to_render = game->message2; + visible_chars_to_render = game->visible_chars2; + } + + char buffer[256] = {0}; // Increased buffer size for safety + if (visible_chars_to_render > 0) { // Copy only the number of characters currently 'revealed' - strncpy(buffer, game->message, game->visible_chars); - buffer[game->visible_chars] = '\0'; + strncpy(buffer, message_to_render, visible_chars_to_render); + buffer[visible_chars_to_render] = '\0'; SDL_Color white = {255, 255, 255, 255}; - SDL_Surface* surface = TTF_RenderText_Blended(game->font, buffer, white); - + SDL_Surface* surface = TTF_RenderText_Blended(game->current_font, buffer, white); + if (surface) { SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); - + // CENTER THE TEXT WITH SHAKE: // Subtract half the text width/height from center screen coordinates. // Add shake offset for text jitter effect @@ -250,7 +313,8 @@ int main(int argc, char* args[]) { } // Cleanup memory - if (game.font) TTF_CloseFont(game.font); + if (game.font_large) TTF_CloseFont(game.font_large); + if (game.font_small) TTF_CloseFont(game.font_small); if (game.beep_chunk) Mix_FreeChunk(game.beep_chunk); Mix_CloseAudio(); Mix_Quit();