From deff75bda3bc7aab7f6e7c10919b2d02a8185ceb Mon Sep 17 00:00:00 2001 From: Kevin Baumgartner Date: Thu, 7 May 2026 19:05:18 +0200 Subject: [PATCH 01/13] add file for startscreen --- src/startscreen.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/startscreen.py diff --git a/src/startscreen.py b/src/startscreen.py new file mode 100644 index 0000000..e69de29 From 8f68bf841dd61decb82f19f0952aed32be06b43a Mon Sep 17 00:00:00 2001 From: Kevin Baumgartner Date: Thu, 7 May 2026 19:25:16 +0200 Subject: [PATCH 02/13] feat(startscreen): add class for buttons --- src/button.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/button.py diff --git a/src/button.py b/src/button.py new file mode 100644 index 0000000..e4be086 --- /dev/null +++ b/src/button.py @@ -0,0 +1,20 @@ +import pygame + +class Button: + def __init__(self, text, width, height, pos_x, pos_y, color, hover): + self.text = text + self.width = width + self.height = height + self.pos_x = pos_x + self.pos_y = pos_y + self.color = color + self.hover = hover + + # todo + + def draw(self, screen): + action = False + + # todo + + return action \ No newline at end of file From 80c56ad447a591abaa5a9f7e348e8c9d864ceb04 Mon Sep 17 00:00:00 2001 From: Kevin Baumgartner Date: Thu, 7 May 2026 19:35:09 +0200 Subject: [PATCH 03/13] feat(startscreen): add title and welcome message --- src/startscreen.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/startscreen.py b/src/startscreen.py index e69de29..ad9d7c6 100644 --- a/src/startscreen.py +++ b/src/startscreen.py @@ -0,0 +1,21 @@ +import pygame +from button import Button + +class Startscreen: + def __init__(self, screen): + self.screen = screen + self.font_title = pygame.font.SysFont("Arial", 36) + self.font_label = pygame.font.SysFont("Arial", 20) + + + def run(self): + # set background color + self.screen.fill((0, 0, 0)) + + # set title and intro/welcome message + title = self.font_title.render("SILENT FH", True, (0, 255, 0)) + self.screen.blit(title, (10, 10)) + message = self.font_label.render("Welcome to FH - Study with purpose", True, (0, 255, 255)) + + + return None \ No newline at end of file From 49c6d485db7a164940805f613f4503a733e77cf0 Mon Sep 17 00:00:00 2001 From: Kevin Baumgartner Date: Thu, 7 May 2026 19:38:16 +0200 Subject: [PATCH 04/13] feat(startscreen): add exit/quit functionality --- src/startscreen.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/startscreen.py b/src/startscreen.py index ad9d7c6..60c51ff 100644 --- a/src/startscreen.py +++ b/src/startscreen.py @@ -7,6 +7,7 @@ class Startscreen: self.font_title = pygame.font.SysFont("Arial", 36) self.font_label = pygame.font.SysFont("Arial", 20) + # todo buttons must be initialized here def run(self): # set background color @@ -17,5 +18,16 @@ class Startscreen: self.screen.blit(title, (10, 10)) message = self.font_label.render("Welcome to FH - Study with purpose", True, (0, 255, 255)) + # todo buttons must be drawn here + # todo check button events/click - return None \ No newline at end of file + # check key down events - exit/quit + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return "quit" + + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return "quit" + + return "startscreen" \ No newline at end of file From dbd98d4533bdcc76fdc3043a612a4b7e88d067d5 Mon Sep 17 00:00:00 2001 From: Kevin Baumgartner Date: Thu, 7 May 2026 19:47:31 +0200 Subject: [PATCH 05/13] feat(startscreen): add button initialization --- src/button.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/button.py b/src/button.py index e4be086..4de3478 100644 --- a/src/button.py +++ b/src/button.py @@ -10,7 +10,14 @@ class Button: self.color = color self.hover = hover - # todo + # create rectangle for button + self.rect = pygame.Rect(self.pos_x, self.pos_y, self.width, self.height) + + # set font for button text + self.font = pygame.font.SysFont("Arial", 30) + + # temp var to stor click event - so it will be executed just once + self.clicked = False def draw(self, screen): action = False From ebce7c3dcde3667a2f08dbe48820850c35b57b5d Mon Sep 17 00:00:00 2001 From: Kevin Baumgartner Date: Thu, 7 May 2026 19:54:49 +0200 Subject: [PATCH 06/13] feat(startscreen): implement button draw method --- src/button.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/button.py b/src/button.py index 4de3478..fc2ef96 100644 --- a/src/button.py +++ b/src/button.py @@ -22,6 +22,29 @@ class Button: def draw(self, screen): action = False - # todo + # get current mous position + mouse_pos = pygame.mouse.get_pos() + + # check if mouse is over button + if self.rect.collidepoint(mouse_pos): + current_color = self.hover + + # check if left mouse button is pressed + if pygame.mouse.get_pressed()[0] == 0 and self.clicked: + self.clicked = False + action = True + else: + current_color = self.color + self.clicked = False + + # draw buttton + pygame.draw.rect(screen, current_color, self.rect, border_radius = 12) + + # render button text + text_surface = self.font.render(self.text, True, (255, 255, 255)) + + # place text in the middle of the button + text_rect = text_surface.get_rect(center=self.rect.center) + screen.blit(text_surface, text_rect) return action \ No newline at end of file From af1b44c7be0e287fa24f9fae469bea0d2935c301 Mon Sep 17 00:00:00 2001 From: Kevin Baumgartner Date: Thu, 7 May 2026 20:11:13 +0200 Subject: [PATCH 07/13] feat(startscreen): add start and quit buttons on startscreen --- src/startscreen.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/startscreen.py b/src/startscreen.py index 60c51ff..9215d6a 100644 --- a/src/startscreen.py +++ b/src/startscreen.py @@ -7,7 +7,25 @@ class Startscreen: self.font_title = pygame.font.SysFont("Arial", 36) self.font_label = pygame.font.SysFont("Arial", 20) + self.button_color = (0, 255, 0) + self.button_hover_color = (200, 255, 0) + # todo buttons must be initialized here + self.button_start = Button("[ENTER] Immatrikulieren", + 500, + 70, + 20, + 60, + self.button_color, + self.button_hover_color) + + self.button_quit = Button("[ESC] Exmatrikulieren", + 500, + 70, + 20, + 150, + self.button_color, + self.button_hover_color) def run(self): # set background color @@ -19,6 +37,9 @@ class Startscreen: message = self.font_label.render("Welcome to FH - Study with purpose", True, (0, 255, 255)) # todo buttons must be drawn here + button_start_pressed = self.button_start.draw(self.screen) + button_start_pressed = self.button_quit.draw(self.screen) + # todo check button events/click # check key down events - exit/quit From 9ddfa8ce74f40554741b0681dffa0a0bd9078e0c Mon Sep 17 00:00:00 2001 From: Kevin Baumgartner Date: Thu, 7 May 2026 20:30:26 +0200 Subject: [PATCH 08/13] feat(startscreen): add reaction on button events --- src/startscreen.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/startscreen.py b/src/startscreen.py index 9215d6a..53b85f4 100644 --- a/src/startscreen.py +++ b/src/startscreen.py @@ -10,7 +10,6 @@ class Startscreen: self.button_color = (0, 255, 0) self.button_hover_color = (200, 255, 0) - # todo buttons must be initialized here self.button_start = Button("[ENTER] Immatrikulieren", 500, 70, @@ -36,11 +35,15 @@ class Startscreen: self.screen.blit(title, (10, 10)) message = self.font_label.render("Welcome to FH - Study with purpose", True, (0, 255, 255)) - # todo buttons must be drawn here + # draw buttons and get click state button_start_pressed = self.button_start.draw(self.screen) - button_start_pressed = self.button_quit.draw(self.screen) + button_quit_pressed = self.button_quit.draw(self.screen) - # todo check button events/click + # react on button clicks + if button_start_pressed: + return "game" + if button_quit_pressed: + return "quit" # check key down events - exit/quit for event in pygame.event.get(): @@ -48,7 +51,9 @@ class Startscreen: return "quit" if event.type == pygame.KEYDOWN: + if event.key == pygame.K_RETURN: + return "game" if event.key == pygame.K_ESCAPE: return "quit" - return "startscreen" \ No newline at end of file + return "start" \ No newline at end of file From 6d6fbc895b9df5117f559dcabd73733242d975e3 Mon Sep 17 00:00:00 2001 From: Kevin Baumgartner Date: Thu, 7 May 2026 20:39:17 +0200 Subject: [PATCH 09/13] feat(startscreen): add comments --- src/button.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/button.py b/src/button.py index fc2ef96..73da2d1 100644 --- a/src/button.py +++ b/src/button.py @@ -2,6 +2,16 @@ import pygame class Button: def __init__(self, text, width, height, pos_x, pos_y, color, hover): + """ + + :param text: Text inside the button. + :param width: Width of the button. + :param height: Height of the button. + :param pos_x: X position of the button on the screen. + :param pos_y: Y position of the button on the screen. + :param color: Color of the button on the screen. + :param hover: Color of the button on the screen when mouse is hover. + """ self.text = text self.width = width self.height = height @@ -20,6 +30,11 @@ class Button: self.clicked = False def draw(self, screen): + """ + Draw the button on the screen. + :param screen: Screen object where button will be drawn. + :return: Return True when button was clicked. + """ action = False # get current mous position From 496c74fed2f094ae0bfea1c886d2ec6dcde4556f Mon Sep 17 00:00:00 2001 From: Kevin Baumgartner Date: Thu, 7 May 2026 22:00:29 +0200 Subject: [PATCH 10/13] feat(text_input): add text input on start screen and temporary test --- src/startscreen.py | 81 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/src/startscreen.py b/src/startscreen.py index 53b85f4..b5d50b5 100644 --- a/src/startscreen.py +++ b/src/startscreen.py @@ -1,5 +1,6 @@ import pygame from button import Button +from text_input import TextInput class Startscreen: def __init__(self, screen): @@ -10,6 +11,8 @@ class Startscreen: self.button_color = (0, 255, 0) self.button_hover_color = (200, 255, 0) + self.player_name = "" + self.button_start = Button("[ENTER] Immatrikulieren", 500, 70, @@ -26,7 +29,34 @@ class Startscreen: self.button_color, self.button_hover_color) + self.text_input_name = TextInput(400, + 70, + 20, + 240) + def run(self): + # get all events + events = pygame.event.get() + + # check events + for event in events: + if event.type == pygame.QUIT: + return "quit" + + # forward event to text input box + self.text_input_name.handle_event(event) + + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return "quit" + + if event.key == pygame.K_RETURN: + self.player_name = self.text_input_name.get_text() + + if self.player_name.strip() != "": + print("Spielername:", self.player_name) + return "game" + # set background color self.screen.fill((0, 0, 0)) @@ -39,6 +69,9 @@ class Startscreen: button_start_pressed = self.button_start.draw(self.screen) button_quit_pressed = self.button_quit.draw(self.screen) + # draw text input box + self.text_input_name.draw(self.screen) + # react on button clicks if button_start_pressed: return "game" @@ -56,4 +89,50 @@ class Startscreen: if event.key == pygame.K_ESCAPE: return "quit" - return "start" \ No newline at end of file + return "startscreen" + + +# test function fro temporary testing +if __name__ == "__main__": + pygame.init() + + screen = pygame.display.set_mode((960, 640)) + pygame.display.set_caption("Silent FH - Startscreen Test") + + clock = pygame.time.Clock() + + startscreen = Startscreen(screen) + state = "startscreen" + + running = True + + while running: + clock.tick(60) + + if state == "startscreen": + state = startscreen.run() + + elif state == "game": + screen.fill((30, 30, 30)) + + font = pygame.font.SysFont("Arial", 36) + text = font.render("GAME STARTED", True, (255, 255, 255)) + screen.blit(text, (300, 280)) + + info = font.render("Press ESC to quit", True, (150, 150, 150)) + screen.blit(info, (300, 330)) + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + state = "quit" + + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + state = "quit" + + elif state == "quit": + running = False + + pygame.display.flip() + + pygame.quit() \ No newline at end of file From b15c5b5e2846445a22df4280d09496400dd45c85 Mon Sep 17 00:00:00 2001 From: Kevin Baumgartner Date: Thu, 7 May 2026 22:18:10 +0200 Subject: [PATCH 11/13] feat(text_input): switch color definitions to settings file --- src/settings.py | 11 ++++++++++- src/startscreen.py | 17 +++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/settings.py b/src/settings.py index edece49..9a2c153 100644 --- a/src/settings.py +++ b/src/settings.py @@ -11,4 +11,13 @@ DOOR_BORDER_WIDTH = 3 COLOR_DOOR_BEIGE = (245, 245, 220) COLOR_DOOR_BORDER = (100, 90, 80) COLOR_HP_BAR_GREEN = (0, 255, 0) -COLOR_HP_BAR_BG = (50, 50, 50) \ No newline at end of file +COLOR_HP_BAR_BG = (50, 50, 50) + +# --- BUTTONS --- +COLOR_BUTTON = (0, 255, 0) +COLOR_BUTTON_HOVER = (200, 255, 0) + +# --- STARTSCREEN --- +COLOR_STARTSCREEN_BACKGROUND = ((0, 0, 0)) +COLOR_STARTSCREEN_FONT_TITLE = (0, 255, 0) +COLOR_STARTSCREEN_FONT_LABEL = (0, 255, 255) \ No newline at end of file diff --git a/src/startscreen.py b/src/startscreen.py index b5d50b5..2c121bc 100644 --- a/src/startscreen.py +++ b/src/startscreen.py @@ -1,5 +1,10 @@ import pygame from button import Button +from settings import (COLOR_BUTTON, + COLOR_BUTTON_HOVER, + COLOR_STARTSCREEN_BACKGROUND, + COLOR_STARTSCREEN_FONT_TITLE, + COLOR_STARTSCREEN_FONT_LABEL) from text_input import TextInput class Startscreen: @@ -8,8 +13,8 @@ class Startscreen: self.font_title = pygame.font.SysFont("Arial", 36) self.font_label = pygame.font.SysFont("Arial", 20) - self.button_color = (0, 255, 0) - self.button_hover_color = (200, 255, 0) + self.button_color = COLOR_BUTTON + self.button_hover_color = COLOR_BUTTON_HOVER self.player_name = "" @@ -30,7 +35,7 @@ class Startscreen: self.button_hover_color) self.text_input_name = TextInput(400, - 70, + 40, 20, 240) @@ -58,12 +63,12 @@ class Startscreen: return "game" # set background color - self.screen.fill((0, 0, 0)) + self.screen.fill(COLOR_STARTSCREEN_BACKGROUND) # set title and intro/welcome message - title = self.font_title.render("SILENT FH", True, (0, 255, 0)) + title = self.font_title.render("SILENT FH", True, COLOR_STARTSCREEN_FONT_TITLE) self.screen.blit(title, (10, 10)) - message = self.font_label.render("Welcome to FH - Study with purpose", True, (0, 255, 255)) + message = self.font_label.render("Welcome to FH - Study with purpose", True, COLOR_STARTSCREEN_FONT_LABEL) # draw buttons and get click state button_start_pressed = self.button_start.draw(self.screen) From 8c454edd5bfa49a8e175444900c538f1aca18c3b Mon Sep 17 00:00:00 2001 From: Kevin Baumgartner Date: Fri, 8 May 2026 13:50:42 +0200 Subject: [PATCH 12/13] feat(startscreen): change ui texts from german to english and fix button click event --- src/button.py | 2 ++ src/startscreen.py | 85 ++++++++++++++++++++++++++-------------------- 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/src/button.py b/src/button.py index 73da2d1..e254574 100644 --- a/src/button.py +++ b/src/button.py @@ -45,6 +45,8 @@ class Button: current_color = self.hover # check if left mouse button is pressed + if pygame.mouse.get_pressed()[0] == 1: + self.clicked = True if pygame.mouse.get_pressed()[0] == 0 and self.clicked: self.clicked = False action = True diff --git a/src/startscreen.py b/src/startscreen.py index 2c121bc..1e9c34a 100644 --- a/src/startscreen.py +++ b/src/startscreen.py @@ -17,32 +17,72 @@ class Startscreen: self.button_hover_color = COLOR_BUTTON_HOVER self.player_name = "" + self.wrong_name = False - self.button_start = Button("[ENTER] Immatrikulieren", + self.button_start = Button("[ENTER] Matriculate", 500, 70, 20, - 60, + 100, self.button_color, self.button_hover_color) - self.button_quit = Button("[ESC] Exmatrikulieren", + self.button_quit = Button("[ESC] Exmatriculate", 500, 70, 20, - 150, + 190, self.button_color, self.button_hover_color) self.text_input_name = TextInput(400, 40, 20, - 240) + 310) def run(self): + # set background color + self.screen.fill(COLOR_STARTSCREEN_BACKGROUND) + + # set title and intro/welcome message + title = self.font_title.render("SILENT FH", True, COLOR_STARTSCREEN_FONT_TITLE) + self.screen.blit(title, (10, 10)) + message_1 = self.font_label.render("Welcome to Silent FH", True, COLOR_STARTSCREEN_FONT_LABEL) + message_2 = self.font_label.render("Study with purpose. Survive with Coffee.", True, + COLOR_STARTSCREEN_FONT_LABEL) + + self.screen.blit(message_1, (10, 50)) + self.screen.blit(message_2, (10, 70)) + + # draw buttons and get click state + button_start_pressed = self.button_start.draw(self.screen) + button_quit_pressed = self.button_quit.draw(self.screen) + + # draw text input box + label_input = self.font_label.render("Enter your student name or ID:", True, + COLOR_STARTSCREEN_FONT_LABEL) + self.screen.blit(label_input, (10, 280)) + self.text_input_name.draw(self.screen) + + # prepare error message when no input was submitted + label_input_error = self.font_label.render("Student not found. Please enter valid name/id.", True, + (255, 0, 0)) + # get all events events = pygame.event.get() + # react on button clicks + if button_start_pressed: + self.player_name = self.text_input_name.get_text() + + if self.player_name.strip() != "": + print("Spielername:", self.player_name) + return "game" + else: + self.wrong_name = True + if button_quit_pressed: + return "quit" + # check events for event in events: if event.type == pygame.QUIT: @@ -61,38 +101,11 @@ class Startscreen: if self.player_name.strip() != "": print("Spielername:", self.player_name) return "game" + else: + self.wrong_name = True - # set background color - self.screen.fill(COLOR_STARTSCREEN_BACKGROUND) - - # set title and intro/welcome message - title = self.font_title.render("SILENT FH", True, COLOR_STARTSCREEN_FONT_TITLE) - self.screen.blit(title, (10, 10)) - message = self.font_label.render("Welcome to FH - Study with purpose", True, COLOR_STARTSCREEN_FONT_LABEL) - - # draw buttons and get click state - button_start_pressed = self.button_start.draw(self.screen) - button_quit_pressed = self.button_quit.draw(self.screen) - - # draw text input box - self.text_input_name.draw(self.screen) - - # react on button clicks - if button_start_pressed: - return "game" - if button_quit_pressed: - return "quit" - - # check key down events - exit/quit - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return "quit" - - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_RETURN: - return "game" - if event.key == pygame.K_ESCAPE: - return "quit" + if self.wrong_name: + self.screen.blit(label_input_error, (10, 350)) return "startscreen" From a2185273f3e2802639036bc208ec4fd77f1028e7 Mon Sep 17 00:00:00 2001 From: Niklas Haiden Date: Fri, 8 May 2026 14:30:33 +0200 Subject: [PATCH 13/13] fix: readd missing file --- src/ects.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/ects.py diff --git a/src/ects.py b/src/ects.py new file mode 100644 index 0000000..e746c12 --- /dev/null +++ b/src/ects.py @@ -0,0 +1,26 @@ +import pygame + +from src.settings import START_ECTS_VALUE, ECTS_UPDATE_INTERVAL + +class ECTS: + def __init__(self): + # total amount of ECTS the player has at the beginning + self.ects_balance = 0 + # start amount of ECTS player gains ber interval at the beginning + self.ects_per_second = START_ECTS_VALUE + # timer when last ECTS was given to player + self.last_update_time = pygame.time.get_ticks() + + # check if ECTS should be added + def update(self, is_at_desk): + current_time = pygame.time.get_ticks() + + # if player is at desk and interval passed + if is_at_desk and ((current_time - self.last_update_time) >= ECTS_UPDATE_INTERVAL): + self.ects_balance += self.ects_per_second + # reset timer + self.last_update_time = current_time + + # beer increases amount of how much ECTS are earned per second + def upgrade_rate(self, extra_ects): + self.ects_per_second += extra_ects