Skip to content

Commit 0a16c24

Browse files
Merge pull request #31 from devninja-sudo/push
[minor] Push
2 parents e77779f + 0d0e4ea commit 0a16c24

3 files changed

Lines changed: 120 additions & 38 deletions

File tree

.github/workflows/exebuilder.yml

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
name: Download Dependencies and Build EXE
22

33
on:
4-
pull_request:
5-
types: [closed]
4+
push:
5+
branches:
6+
- main
67

78
jobs:
89
build-and-release:
9-
if: github.event.pull_request.merged == true
1010
runs-on: windows-latest
1111

1212
steps:
1313
- name: Checkout repository
1414
uses: actions/checkout@v4
1515
with:
1616
fetch-depth: 0
17+
fetch-tags: true
1718

1819
- name: Set up Python
1920
uses: actions/setup-python@v5
@@ -32,8 +33,11 @@ jobs:
3233
id: get_tag
3334
shell: bash
3435
run: |
35-
git fetch --tags
36-
TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.00.000")
36+
git fetch --force --tags origin
37+
TAG=$(git tag --list "v*" --sort=-v:refname | head -n 1)
38+
if [ -z "$TAG" ]; then
39+
TAG="v0.00.000"
40+
fi
3741
echo "latest=$TAG" >> $GITHUB_OUTPUT
3842
3943
- name: Calculate next version
@@ -45,13 +49,13 @@ jobs:
4549
4650
IFS='.' read -r X YY ZZZ <<< "$VERSION"
4751
48-
TITLE="${{ github.event.pull_request.title }}"
52+
MESSAGE="${{ github.event.head_commit.message }}"
4953
50-
if [[ "$TITLE" == *"[major]"* ]]; then
54+
if [[ "$MESSAGE" == *"[major]"* ]]; then
5155
X=$((X+1))
5256
YY=0
5357
ZZZ=0
54-
elif [[ "$TITLE" == *"[minor]"* ]]; then
58+
elif [[ "$MESSAGE" == *"[minor]"* ]]; then
5559
YY=$((YY+1))
5660
ZZZ=0
5761
else

Brett.py

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ def __direktConnectWorker(self, targetIp:str):
229229
self.__setzeNetzSocket(sock, 0)
230230
return
231231
sock.close()
232-
self.__zeigeNetzStatusDialog("Handshake fehlgeschlagen")
232+
self.__zeigeNetzStatusDialog("Hadnshake fehlgeschlagen")
233233

234234
def __waehleSingleplayer(self):
235235
'''
@@ -267,7 +267,6 @@ def __starteMultiplayer(self):
267267
Erg.: -
268268
'''
269269
self.__netzAktiv = True
270-
print("Netzwerkstart auf Host:", socket.gethostname(), "IP:", self.__holeLokaleIp())
271270
self.__zeigeNetzStatusDialog("Warte auf Verbindung")
272271
if self.__netzListenerThread == None or not(self.__netzListenerThread.is_alive()):
273272
self.__netzListenerThread = threading.Thread(target=self.__listenerWorker, daemon=True)
@@ -297,16 +296,13 @@ def __listenerWorker(self):
297296
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
298297
listener.bind(("0.0.0.0", self.__netzPort))
299298
listener.listen(3)
300-
print("Listener aktiv auf Port", self.__netzPort)
301299
while self.__netzAktiv and not(self.__netzVerbundenEvent.is_set()):
302300
conn, _addr = listener.accept()
303-
print("Eingehende Verbindung von", _addr)
304301
raw = conn.recv(2048)
305302
if len(raw) == 0:
306303
conn.close()
307304
continue
308305
msgText = raw.decode("utf-8").strip()
309-
print("Empfangen:", msgText)
310306
msgParts = msgText.split(";")
311307
if len(msgParts) < 2 or msgParts[0] != "ASK":
312308
conn.close()
@@ -316,7 +312,6 @@ def __listenerWorker(self):
316312
conn.close()
317313
continue
318314
conn.sendall(("OK;" + self.__spielerName + "\n").encode("utf-8"))
319-
print("Antwort gesendet: OK;" + self.__spielerName)
320315
self.__setzeNetzSocket(conn, 1)
321316
return
322317

@@ -337,7 +332,6 @@ def __setzeNetzSocket(self, sock:socket.socket, localTeam:int):
337332
else:
338333
self.setRotation(0)
339334
self.__netzVerbundenEvent.set()
340-
print("Verbindung hergestellt. Eigenes Team:", localTeam)
341335
if self.__modusDialog != None:
342336
self.__modusDialog.hideSurface()
343337
if self.__nameDialog != None:
@@ -734,7 +728,6 @@ def __generateImage(self) -> None:
734728
if len(self.__startDialogGruppe.sprites()) != 0:
735729
self.__startDialogGruppe.draw(self.image)
736730
if self.__resignDialog.getIfShown():
737-
print("true")
738731
self.__DialogGroup.draw(self.image)
739732
for PromoteData in self.__PawnPromotes:
740733
if PromoteData["Dialog"].getIfShown():
@@ -1013,6 +1006,32 @@ def __doPromote(self, Team0Figure, Team1Figure, promotionName:str):
10131006
self.__PawnPromotes.pop(-1)
10141007
if self.__netzAktiv and not(self.__wendeRemoteZugAn):
10151008
self.__sendeNetzMessage(f"PROMO;{promoteField.getLabel()};{promotionName}")
1009+
self.__beendeZugnachFigurwahl()
1010+
1011+
def __beendeZugnachFigurwahl(self):
1012+
'''
1013+
Vor.: Der aktuelle Zug ist abgeschlossen und es sind keine Auswahle mehr offen.
1014+
Eff.: Zugzaehler und aktives Team werden gewechselt, Eventmodus wird gesetzt und Matt/Remis werden geprueft.
1015+
Erg.: -
1016+
'''
1017+
self.__turnNumber += 1
1018+
self.__switchToOtherPlayer()
1019+
self.__eventMode = "chooseFigure"
1020+
self.__clearAllFieldHighlights()
1021+
matedTeams = self.checkIfMate()
1022+
if matedTeams != [-1]:
1023+
for field in self.__fields.values():
1024+
if type(field) != Feld:
1025+
continue
1026+
field.addFieldHighlight("GreenOutlineBox")
1027+
field.addFieldHighlight("SmallGreenMiddleCircle")
1028+
print("MATT: ", matedTeams)
1029+
elif not(self.checkIfTeamCanMove(self.__onTurnTeam)):
1030+
for field in self.__fields.values():
1031+
if type(field) != Feld:
1032+
continue
1033+
field.addFieldHighlight("GreenOutlineBox")
1034+
print("Remis durch keine Zugmöglichkeit mehr!")
10161035

10171036
def __finishTurn(self):
10181037
'''
@@ -1053,24 +1072,11 @@ def __finishTurn(self):
10531072
PromoteInfos["Label"] = field.getLabel()
10541073
self.__PawnPromotes.append(PromoteInfos)
10551074
self.__generateImage()
1056-
self.__turnNumber += 1
1057-
self.__switchToOtherPlayer()
1058-
self.__eventMode = "chooseFigure"
1059-
self.__clearAllFieldHighlights()
1060-
matedTeams = self.checkIfMate()
1061-
if matedTeams != [-1]:
1062-
for field in self.__fields.values():
1063-
if type(field) != Feld:
1064-
continue
1065-
field.addFieldHighlight("GreenOutlineBox")
1066-
field.addFieldHighlight("SmallGreenMiddleCircle")
1067-
print("MATT: ", matedTeams)
1068-
elif not(self.checkIfTeamCanMove(self.__onTurnTeam)):
1069-
for field in self.__fields.values():
1070-
if type(field) != Feld:
1071-
continue
1072-
field.addFieldHighlight("GreenOutlineBox")
1073-
print("Remis, durch keine Zugmöglichkeit mehr!")
1075+
# Solange eine Promotion aussteht, bleibt der Zug beim aktuellen Spieler.
1076+
if len(self.__PawnPromotes) != 0:
1077+
self.__eventMode = "chooseFigure"
1078+
return
1079+
self.__beendeZugnachFigurwahl()
10741080

10751081
def checkIfTeamCanMove(self, team:int):
10761082
'''

Dialog.py

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,18 @@ def handleLeftClick(self, pos:tuple[int, int]):
165165
self.hideSurface()
166166

167167
class TextInputDialog(pygame.sprite.Sprite):
168+
'''
169+
Vor.: -DialogWidth- und -DialogHeight- sind nicht negativ.
170+
-centerPosition- ist ein Tuple mit genau zwei Integern fuer die Mittelpunktposition.
171+
-headline- und -buttonText- sind Strings.
172+
-headlineSize-, -inputSize-, -buttonSize- und -maxInputLength- sind positive Integer.
173+
-closeable- ist ein Bool.
174+
-onSubmit-, -onVoidClick-, -onSurfaceChange- und -wennZweiterButton- sind entweder None oder aufrufbare Objekte.
175+
-zweiterKnopfText- ist None oder ein String.
176+
Eff.: Initialisiert ein Dialog-Sprite mit Eingabefeld, Hauptbutton und evtl Zweitbutton.
177+
Der aktuelle Eingabewert ist leer, der Dialog ist sichtbar und eone Surface ist erstellt.
178+
Erg.: Eine TextInputDialog-Instanz ist geliefert.
179+
'''
168180
def __init__(self, DialogWidth:int, DialogHeight:int, centerPosition:tuple[int], headline:str, headlineSize:int, inputSize:int, buttonText:str, buttonSize:int, closeable:bool, onSubmit:Callable|None=None, onVoidClick:Callable|None=None, posOffset:tuple[int, int]=(0,0), onSurfaceChange:Callable=None, maxInputLength:int=24, zweiterKnopfText:str|None=None, wennZweiterButton:Callable|None=None):
169181
super().__init__()
170182
self.__initPhase = True
@@ -192,35 +204,77 @@ def __init__(self, DialogWidth:int, DialogHeight:int, centerPosition:tuple[int],
192204
self.__initPhase = False
193205

194206
def __CallOnSurfaceChange(self):
207+
'''
208+
Vor.: -
209+
Eff.: Wenn -onSurfaceChange- gesetzt ist, wird die Funktion exakt genau einmal aufgerufen.
210+
Erg.: -
211+
'''
195212
if self.__onSurfaceChange == None:
196213
return
197214
self.__onSurfaceChange()
198215

199216
def setHeadline(self, headline:str):
217+
'''
218+
Vor.: -headline- ist ein String.
219+
Eff.: Setzt die Überschrift und erstellt die Dialog-Surface neu.
220+
Erg.: -
221+
'''
200222
self.__headline = headline
201223
self.makeSurface()
202224

203225
def getValue(self)->str:
226+
'''
227+
Vor.: -
228+
Eff.: -
229+
Erg.: Der aktuelle Eingabetext ist geliefert.
230+
'''
204231
return self.__eingabeWert
205232

206233
def clearValue(self):
234+
'''
235+
Vor.: -
236+
Eff.: Der gespeicherte Eingabetext wird auf den leeren String gesetzt und die Surface neu erstellt.
237+
Erg.: -
238+
'''
207239
self.__eingabeWert = ""
208240
self.makeSurface()
209241

210242
def showSurface(self):
243+
'''
244+
Vor.: -
245+
Eff.: Der Dialog wird als sichtbar markiert und komplett neu gezeichnet.
246+
Erg.: -
247+
'''
211248
self.__isShown = True
212249
self.makeSurface()
213250

214251
def hideSurface(self):
252+
'''
253+
Vor.: -
254+
Eff.: Der Dialog wird als unsichtbar markiert, -self.image- weiss gefuellt und ggf. -onSurfaceChange- ausgelöst.
255+
Erg.: -
256+
'''
215257
self.__isShown = False
216258
self.image.fill("white")
217259
if not(self.__initPhase):
218260
self.__CallOnSurfaceChange()
219261

220262
def getIfShown(self):
263+
'''
264+
Vor.: -
265+
Eff.: -
266+
Erg.: Es ist geliefert, ob der Dialog aktuell als sichtbar markiert ist.
267+
'''
221268
return self.__isShown
222269

223270
def makeSurface(self):
271+
'''
272+
Vor.: -
273+
Eff.: Erstellt -self.image- und -self.rect-, zeichnet Rahmen, Ueberschrift, Eingabefeld,
274+
Buttons.
275+
Wenn nicht in der init, wird -onSurfaceChange- aufgerufen.
276+
Erg.: -
277+
'''
224278
self.image:pygame.surface.Surface = pygame.surface.Surface((self.__width, self.__height))
225279
self.image.fill("white")
226280
self.rect:pygame.rect.Rect = self.image.get_rect(center = self.__centerPosition)
@@ -259,6 +313,11 @@ def makeSurface(self):
259313
self.__CallOnSurfaceChange()
260314

261315
def update(self):
316+
'''
317+
Vor.: -
318+
Eff.: Solange der Dialog sichtbar ist, blinkt der Cursor im Eingabefeld. Da keine Animation wird für jedes Blinken die Surface neu gezeichnet.
319+
Erg.: -
320+
'''
262321
if not(self.__isShown):
263322
return
264323
jetzt = pygame.time.get_ticks()
@@ -268,6 +327,14 @@ def update(self):
268327
self.makeSurface()
269328

270329
def handleLeftClick(self, pos:tuple[int, int]):
330+
'''
331+
Vor.: -pos- ist ein Tuple aus zwei Integern (Mausposition im Fenster).
332+
Eff.: Verarbeitet einen Linksklick relativ zum Dialog:
333+
Klick auf Zweitbutton ruft -wennZweiterButton- auf,
334+
Klick auf Hauptbutton ruft -onSubmit- mit aktuellem Eingabetext auf,
335+
ansonsten wird ggf. -onVoidClick- ausgefuehrt und bei -closeable=True- der Dialog versteckt.
336+
Erg.: -
337+
'''
271338
if not(self.__isShown):
272339
return
273340
localPos = (pos[0] - self.rect.x - self.__posOffset[0], pos[1] - self.rect.y - self.__posOffset[1])
@@ -287,12 +354,17 @@ def handleLeftClick(self, pos:tuple[int, int]):
287354
self.hideSurface()
288355

289356
def handleKeyDown(self, event:pygame.event.Event):
357+
'''
358+
Vor.: -event- ist ein pygame.KEYDOWN-Event mit gueltigen Attributen -key- und -unicode-.
359+
Eff.: Verarbeitet Tastatureingaben fuer den Dialog:
360+
ENTER ruft -onSubmit- mit aktuellem Eingabetext auf,
361+
BACKSPACE entfernt das letzte Zeichen,
362+
sonst wird ein druckbares Einzelzeichen (bis -maxInputLength-) angehaengt.
363+
Bei Textaenderung wird die Surface neu erstellt.
364+
Erg.: -
365+
'''
290366
if not(self.__isShown):
291367
return
292-
if event.key == pygame.K_ESCAPE:
293-
if self.__wennZweiterButton != None:
294-
self.__wennZweiterButton()
295-
return
296368
if event.key == pygame.K_RETURN:
297369
if self.__onSubmit != None:
298370
self.__onSubmit(self.__eingabeWert)

0 commit comments

Comments
 (0)