Aktuelle Zeit: 21.11.2019 20:09

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: PurePuzzle
BeitragVerfasst: 02.02.2019 18:32 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
Hallo ihr Lieben,
Ich habe diesen Nachmittag ein kleines Puzzlespiel gebastelt, welches ich hier präsentieren möchte. Der Code ist knapp genug, daß ich ihn per copy/paste bereitstellen kann.
- Ihr müsst zuvor ein beliebiges .jpg-Image mit dem Namen "puzzle.jpg" in denselben Ordner wie die Code-Datei legen (Maße/Höhe/Breite sind egal, das Bild wird entsprechend seiner Ausdehnung automatisch an die Fenstergröße angepasst). Auch das Motiv (ob Jeremy Renner, Megan Fox, Dinosaurier, Katze oder Einhorn) ist euch frei überlassen.
- Die Schwierigkeit legt ihr mit der Variable difficulty (an zweiter Stelle, nach EnableExplicit) fest - der Wert muß mindestens 2 betragen, das ist die Anzahl Teile an der kürzeren Seite des Bildes, nach oben hin gibt es keine Grenze (außer eure CPU und masochistische Disposition).
- Alle Teile sind quadratisch, der dabei eventuell entstehende Rand wird als fester Rahmen angezeigt und kann nicht bewegt werden; der Puzzle-Part wird dabei möglichst mittig in diesem Rahmen ausgerichtet.
- Mit der rechten Maustaste könnt ihr die Teile im Uhrzeigersinn drehen
- Mit der linken Maustaste könnt ihr Teile "taggen" und "detaggen"; sobald 2 Teile getaggt sind, tauschen diese ihre Position
- Nach jedem "swap" und jeder "rotation" checkt das Programm, ob das Puzzle korrekt gelöst wurde.
- Mit ESC beendet ihr das Spiel.

Viel Spaß! :lurk:
Code:
EnableExplicit
UseJPEGImageDecoder()

Declare selectDifficulty()
Declare ini()
Declare aspectResize(picID,newX,newY)
Declare loop()
Declare processInput()
Declare processTimer()
Declare checkPuzzle()
Declare clearTags()
Declare yay()
Declare inRange(value,min,max)

Structure TILE
   index.i
   trueX.i
   trueY.i
   x.i
   y.i
   xMicro.i
   yMicro.i
   xMicroDir.i
   yMicroDir.i
   rotation.i
   tagged.i
EndStructure
Global NewList tile.TILE()

#xRes = 1024
#yRes = 768
Global screen
Global pic
Global difficulty
Global selectSPR
Global selectX,selectY
Global marginSPR
Global Dim tileSPR(0)
Global tagSPR
Global xMax, yMax
Global xMargin, yMargin
Global tileSize
Global swapping
Global targetAngle
Global gameOver
Global Dim *tag.TILE(1)
Global frameDuration, frameFinished
Global perSecond.f

ini()
loop()
End





Procedure selectDifficulty()
   Define event
   Define diffSelection
   
   diffSelection = OpenWindow(#PB_Any, 0, 0, 160, 180, "Select Difficulty", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ButtonGadget(2, 30, 20, 100, 20, "Why even play")
   ButtonGadget(3, 30, 45, 100, 20, "I hate Puzzles")
   ButtonGadget(4, 30, 70, 100, 20, "Easy")
   ButtonGadget(5, 30, 95, 100, 20, "Medium")
   ButtonGadget(6, 30, 120, 100, 20, "Harder")
   ButtonGadget(7, 30, 145, 100, 20, "Challenge me")
   ButtonGadget(8, 30, 170, 100, 20, "Master")
   ButtonGadget(9, 30, 195, 100, 20, "This is work")
   ButtonGadget(10, 30, 220, 100, 20, "Masochistic")
   ButtonGadget(11, 30, 245, 100, 20, "Impossible")
   
   Repeat
      event = WaitWindowEvent(16)
      difficulty = EventGadget()
   Until difficulty Or event = #PB_Event_CloseWindow
   CloseWindow(diffSelection)
   If event = #PB_Event_CloseWindow
      End
   EndIf
EndProcedure



Procedure ini()
   Define x, y
   Define xSize
   Define ySize
   Define newX, newY
   Define defSide
   Define count
   Dim puzzle(0,0)
   Define event
   
   If FileSize("puzzle.jpg") < 1
      If OpenWindow(#PB_Any, 0, 0, 225, 120, "No Puzzle Image found!",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
         TextGadget(0,10,10,200,20,"Put any image (.jpg format required)")
         TextGadget(1,10,30,200,20,"into the same directory as PurePuzzle.exe")
         TextGadget(2,10,50,200,20,"and rename the image file to 'puzzle.jpg'")
         ButtonGadget(3,50,80,100,20,"Understood")
         Repeat
            event = WaitWindowEvent(1)
         Until EventGadget() = 3 Or event = #PB_Event_CloseWindow
      EndIf
      End
   EndIf
   
   selectDifficulty()
   
   If InitSprite()
      screen = OpenWindow(#PB_Any,0,0,#xRes,#yRes,"PurePuzzle (©diceman, 2018) --- Press ESC to Quit",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
      If OpenWindowedScreen(WindowID(screen),0,0,#xRes,#yRes)
         InitKeyboard()
         InitMouse()
      EndIf
   EndIf   
   
   
   ;Bild laden und Größe anpassen
   pic = LoadImage(#PB_Any,"puzzle.jpg")
   xSize = ImageWidth(pic)
   ySize = ImageHeight(pic)
   If xSize > ySize
      newX = #xRes
   Else
      newY = #yRes
   EndIf
   aspectResize(pic,newX,newY)
   
   ;Anzahl der Teile bestimmen
   xSize = ImageWidth(pic)
   ySize = ImageHeight(pic)
   If xSize > ySize
      defSide = ySize
   Else
      defSide = xSize
   EndIf
   tileSize = defSide/difficulty
   xMax = (xSize/tileSize)-1
   yMax = (ySize/tileSize)-1
   
   ;Bild im Hintergrund zeichnen für weitere Operationen
   If StartDrawing(ScreenOutput())
      DrawImage(ImageID(pic),0,0)
      StopDrawing()
   EndIf
   
   ;Rahmen erkennen
   xMargin = (xSize - ((xMax+1)*tileSize))/2
   yMargin = (ySize - ((yMax+1)*tileSize))/2
   
   ;Teile als Sprites speichern
   count = -1
   For x = 0 To xMax
      For y = 0 To yMax
         count +1
         ReDim tileSPR(count)
         tileSPR(count) = GrabSprite(#PB_Any,(x*tileSize)+xMargin,(y*tileSize)+yMargin,tileSize,tileSize)
         AddElement(tile())
         tile()\index = count
         tile()\trueX = x
         tile()\trueY = y
      Next
   Next
   
   ;Rahmen speichern
   If StartDrawing(ScreenOutput())
      DrawingMode(#PB_2DDrawing_Default)
      Box(xMargin,yMargin,(xMax+1)*tileSize,(yMax+1)*tileSize,RGB(0,0,0))
      StopDrawing()
   EndIf
   GrabSprite(marginSPR,0,0,xSize,ySize) ;Der Einfachheit halber wird das komplette Bild als Rahmen gespeichert und als unterste Ebene gezeichnet. Die Puzzleteile liegen darüber.
   
   ;Puzzle mischen
   Dim puzzle(xMax,yMax)
   ForEach tile()
      Repeat
         tile()\x = Random(xMax)
         tile()\y = Random(yMax)
         tile()\rotation = Random(3)*90
      Until puzzle(tile()\x,tile()\y) = 0
      puzzle(tile()\x,tile()\y) = #True
   Next
   
   
   ;übrige Sprites initialisieren
   tagSPR = CreateSprite(#PB_Any,tileSize,tileSize)
   If StartDrawing(SpriteOutput(tagSPR))
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(0,0,tileSize,tileSize,RGB(255,0,0))
      Box(1,1,tileSize-2,tileSize-2,RGB(255,0,0))
      Box(3,3,tileSize-6,tileSize-6,RGB(255,0,0))
      StopDrawing()
   EndIf
   
   selectSPR = CreateSprite(#PB_Any,tileSize,tileSize)
   TransparentSpriteColor(selectSPR,RGB(255,0,0))
EndProcedure



Procedure processInput()
   Define *pointer.TILE
   Define x, y
   Define count
   Define event
   Define absCount
   
   selectX = -1
   selectY = -1
   ForEach tile()
      If inRange(WindowMouseX(screen), xMargin+(tile()\x*tileSize)+tile()\xMicro, xMargin+((tile()\x+1)*tileSize)+tile()\xMicro) And inRange(WindowMouseY(screen), yMargin+(tile()\y*tileSize)+tile()\yMicro,yMargin+((tile()\y+1)*tileSize)+tile()\yMicro)
         *pointer = @tile()
         selectX = *pointer\x
         selectY = *pointer\y
         Break
      EndIf
   Next
   
   event = WaitWindowEvent(16)   
   If swapping Or targetAngle
      ProcedureReturn #False
   EndIf   
   
   
   If event = #PB_Event_CloseWindow
      gameOver = 2
   EndIf
   
   If *pointer   
      If event = #PB_Event_LeftClick
         Select *pointer\tagged
            Case #True
               *pointer\tagged = #False
               *tag(0) = #Null
            Case #False
               *pointer\tagged = #True
               If *tag(0)
                  count = 1
               EndIf
               *tag(count) = *pointer
         EndSelect
         If *tag(0) And *tag(1)
            swapping = #True
            For count = 0 To 1
               ChangeCurrentElement(tile(),*tag(count))
               MoveElement(tile(),#PB_List_Last)
               absCount = Abs(count-1)
               If *tag(count)\x > *tag(absCount)\x
                  *tag(count)\xMicroDir = -1
               EndIf
               If *tag(count)\x < *tag(absCount)\x
                  *tag(count)\xMicroDir = 1
               EndIf
               If *tag(count)\y > *tag(absCount)\y
                  *tag(count)\yMicroDir = -1
               EndIf
               If *tag(count)\y < *tag(absCount)\y
                  *tag(count)\yMicroDir = 1
               EndIf
            Next
         EndIf
      EndIf
      If event = #PB_Event_RightClick
         clearTags()
         *tag(0) = *pointer
         ChangeCurrentElement(tile(),*tag(0))
         MoveElement(tile(),#PB_List_Last)
         targetAngle = *tag(0)\rotation+90
      EndIf
   EndIf
EndProcedure



Procedure processTimer()
   Define count
   Define absCount
   
   If swapping
      For count = 0 To 1
         absCount = Abs(count-1)
         *tag(count)\xMicro + (*tag(count)\xMicroDir*Abs((*tag(count)\x*tileSize)-(*tag(absCount)\x*tileSize))*perSecond*4)
         *tag(count)\yMicro + (*tag(count)\yMicroDir*Abs((*tag(count)\y*tileSize)-(*tag(absCount)\y*tileSize))*perSecond*4)
         If *tag(count)\xMicroDir = -1 And (*tag(count)\x*tileSize)+*tag(count)\xMicro <= *tag(absCount)\x*tileSize
            *tag(count)\xMicroDir = 0
         EndIf
         If *tag(count)\xMicroDir = 1 And (*tag(count)\x*tileSize)+*tag(count)\xMicro >= *tag(absCount)\x*tileSize
            *tag(count)\xMicroDir = 0
         EndIf
         If *tag(count)\yMicroDir = -1 And (*tag(count)\y*tileSize)+*tag(count)\yMicro <= *tag(absCount)\y*tileSize
            *tag(count)\yMicroDir = 0
         EndIf
         If *tag(count)\yMicroDir = 1 And (*tag(count)\y*tileSize)+*tag(count)\yMicro >= *tag(absCount)\y*tileSize
            *tag(count)\yMicroDir = 0
         EndIf
      Next
      If *tag(0)\xMicroDir = 0 And *tag(0)\yMicroDir = 0 And *tag(1)\xMicroDir = 0 And *tag(1)\yMicroDir = 0
         For count = 0 To 1
            *tag(count)\xMicro = 0
            *tag(count)\yMicro = 0
         Next
         swapping = #False
         
         ;markierte Teile tauschen
         Swap *tag(0)\x, *tag(1)\x
         Swap *tag(0)\y, *tag(1)\y
         
         clearTags()
         checkPuzzle()         
      EndIf
   EndIf
   
   
   If targetAngle
      *tag(0)\rotation+(1000*perSecond)
      
      If *tag(0)\rotation >= targetAngle
         *tag(0)\rotation = targetAngle
         If *tag(0)\rotation = 360
            *tag(0)\rotation = 0
         EndIf
         targetAngle = 0
         clearTags()
         checkPuzzle()
      EndIf
   EndIf   
EndProcedure



Procedure clearTags()
   Define count
   
   For count = 0 To 1
      If *tag(count)
         *tag(count)\tagged = #False
         *tag(count) = #Null
      EndIf
   Next
EndProcedure



Procedure loop()
   Define event
   Define x, y
   
   Repeat
      ClearScreen(RGB(0,0,0))
      DisplaySprite(marginSPR,0,0)
      ForEach tile()
         RotateSprite(tileSPR(tile()\index),tile()\rotation,#PB_Absolute)
         DisplaySprite(tileSPR(tile()\index),xMargin+(tile()\x*tileSize)+tile()\xMicro,yMargin+(tile()\y*tileSize)+tile()\yMicro)
         If selectX = tile()\x And selectY = tile()\y
            RotateSprite(selectSPR,tile()\rotation,#PB_Absolute)
            DisplayTransparentSprite(selectSPR,xMargin+(selectX*tileSize)+tile()\xMicro,yMargin+(selectY*tileSize)+tile()\yMicro,100)
         EndIf
         If tile()\tagged = #True
            DisplayTransparentSprite(tagSPR,xMargin+(tile()\x*tileSize),yMargin+(tile()\y*tileSize))
         EndIf
      Next
      
      FlipBuffers()   
      
      ExamineKeyboard()
      
      If Not gameOver
         processInput()
         processTimer()
      Else
         yay()
      EndIf
      
      ;Delta Time
      perSecond = frameDuration/1000     
      frameDuration = ElapsedMilliseconds() - frameFinished
      frameFinished = ElapsedMilliseconds()           
   Until KeyboardPushed(#PB_Key_Escape) Or gameOver = 2
EndProcedure



Procedure checkPuzzle()
   ForEach tile()
      If tile()\x <> tile()\trueX Or tile()\y <> tile()\trueY Or tile()\rotation <> 0
         ProcedureReturn #False
      EndIf
   Next
   
   selectX = -1
   selectY = -1
   gameOver = 1
EndProcedure


Procedure yay()
   Define confirm
   
   confirm = OpenWindow(#PB_Any, 0, 0, 180, 70, "* * * * * * * * * * * * * * * * * * * * *",#PB_Window_WindowCentered)
   SetActiveWindow(confirm)
   TextGadget(0,45,10,200,20,"Congratulations!")
   ButtonGadget(1,30,35,100,20,"Yay")
   Repeat
      WaitWindowEvent(16)
   Until EventGadget() = 1
   gameOver = 2
EndProcedure



Procedure aspectResize(picID,newX,newY)
   Define x = ImageWidth(picID)
   Define y = ImageHeight(picID)
   Define factor.f
   
   If newX = 0 And newY = 0
      ProcedureReturn #False
   EndIf
   If newX And newY = 0
      factor = y/x
      newY = newX*factor
   EndIf
   If newX = 0 And newY
      factor = x/y
      newX = newY*factor
   EndIf
   
   ResizeImage(picID,newX,newY)
EndProcedure



Procedure inRange(value,min,max)
   If value >= min And value <= max
      ProcedureReturn #True
   EndIf
   ProcedureReturn #False
EndProcedure

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Zuletzt geändert von diceman am 04.02.2019 14:50, insgesamt 15-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PurePuzzle
BeitragVerfasst: 02.02.2019 21:03 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
Gefällt mir :allright:
(der Code ist auch schön kompakt)

_________________

Links:
PureBasic Discord
[ENGINE] 2D Engine Nautilus (Win)
[INCLUDE] GLFW 3.3 Library
[MODULE] Bass Library 2.4 (Win)
[LIBRARY] Hexi Binary2Hex (Win)



Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PurePuzzle
BeitragVerfasst: 02.02.2019 21:47 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
Danke. :)
Habe gerade noch ein kleines QoL-Feature reineditiert, und zwar wird jetzt beim Rotieren ein eventuell getaggtes Tile wieder "detagged", so kann es nicht passieren, das man versehentlich zwei Tiles tauscht, welche man gar nicht tauschen wollte, weil vor dem Rotieren noch ein Tag aktiv war.

//EDIT:
Der Code genauso lang, aber ungleich eleganter:
Beim Taggen wird die jeweilige Adresse des Elementes in einem 2 Felder großen *pointer-Array gespeichert, so daß das wiederholte Durchnudeln aller Elemente mit ForEach() wegfällt, da man direkt auf entsprechende Elemente zugreifen kann. Die Variable tagCounter ist somit obselet, stattdessen wird abgefragt, ob beide *pointer eine Adresse haben. Und eine seperate Prozedur clearTags() kann aufgerufen werden, um bequem alle bestehenden Tags zu löschen.
Außerdem wurde die Sichtbarkeit getaggter Puzzleteile verbessert.

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PurePuzzle
BeitragVerfasst: 02.02.2019 23:00 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
Haha!
Ganz vergessen, daß es in PureBasic die tolle Swap-Funktion gibt! 8) 8)

So wird aus ...
Code:
ChangeCurrentElement(tile(),*tag(0))
x = tile()\x
y = tile()\y
*tag(0)\x = *tag(1)\x
*tag(0)\y = *tag(1)\y
*tag(1)\x = x
*tag(1)\y = y


... das hier:
Code:
Swap *tag(0)\x, *tag(1)\x
Swap *tag(0)\y, *tag(1)\y

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PurePuzzle
BeitragVerfasst: 03.02.2019 00:33 
Offline
PureBasic Team
Benutzeravatar

Registriert: 11.09.2004 16:35
Wohnort: Saxony / Deutscheinsiedel
Sehr schön, interessanter Code :allright:

_________________
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PurePuzzle
BeitragVerfasst: 03.02.2019 10:31 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Deutschland::Berlin()
:allright: :allright:

_________________
BildBildBildBild BildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PurePuzzle
BeitragVerfasst: 04.02.2019 14:10 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
Habe oben, in den ersten Post, eine finale Version des Codes reineditiert - 440 Zeilen, hoffe, das ist okay fürs Forum?
Ist jetzt am Ende doch noch eine richtig runde Sache geworden. :)
- Das Spiel läuft komplett im Fenster, inklusive WindowsMouse()-Abfrage.
- Am Anfang bekommt man eine Schwierigkeitsauswahl angeboten (10 Stufen).
- Wenn kein gültiges puzzle.jpg gefunden wurde, gibt es eine konstruktive Fehlermeldung.
- Rotieren und "swappen" der Teile ist animiert.
- Am Ende poppt ein "Gratulations"-ButttonGadget auf.

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PurePuzzle
BeitragVerfasst: 05.02.2019 12:12 
Offline
Benutzeravatar

Registriert: 23.07.2011 02:08
Macht Spaß :)

Toll wäre eine Mehrfach-Selektion (Rechteck, oder vielleicht sogar Lasso)
Man baut manchmal um ein Teil herum und stellt dann fest, dass es in eine andere Ecke gehört, oder zu einem anderen bereits fertigen Motiv passt. Dann muss man jedes einzelne Teil "swappen". Zu Hause auf dem Tisch kann ich auch mehrere zusammenhängende Teile rumschieben, solange halbwegs Platz ist.
Denkbar wäre auch eine intelligente Auswahl. Ich hab jetzt nicht geguckt, wie du erkennst, dass das Bild korrekt fertig ist, aber wenn man auch im unfertigen Zustand erkennen kann, welche Teile rund um das ausgewählte schon perfekt zusammen liegen, dann könnte man den ganzen Block auswählen (per Doppelklick auf ein Teil z.B)

Bild

_________________
Signatur und so


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PurePuzzle
BeitragVerfasst: 05.02.2019 12:31 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
Hallo Derren, vielen Dank für's Testen.
Du wirst lachen, aber über die Mehrfach Selektion habe ich auch schon nachgedacht. :-) Ist allerdings etwas aufwendiger zu implementieren, da mehrere Teile aufeinmal geswappt werden müssen. Könnte Spaß machen, das auszutüfteln. :) Als Übergangslösung habe ich allerdings ein kleines optionales QoL-Feature implementiert, welches dir vielleicht gefällt ...

https://workupload.com/file/86wMa5Cn

Änderungen in der neuen Version:
- Sounds ("Snap", "Click" und "Woosh")
- Bei Startup poppt jetzt ein FileRequester auf, und man kann ein beliebiges .jpg File auswählen (das umbenennen in "puzzle.jpg" entfällt).
- Bugfix, der bei eher quadratischen Formaten für einen Crash sorgen konnte (hatte was mit dem aspectResize() zu tun, und wenn GrabSprite über den Fensterrand hinaus versucht zu "grabben"). Diese Formate werden jetzt auch korrekt ans Fensterformat angepasst.
- Als kleines QoL-Feature erkennt das Programm, sobald ein Puzzleteil an der richtigen Stelle liegt, und sperrt dieses für weiteren Input (kann in der Schwierigkeitsgrad-Auswahl deaktiviert werden = "AutoSnap")
- Wenn das Puzzle korrekt gelöst wurde, gibt es einen kleinen Victory-Jingle.
- Der Source Code ist im .zip-File enthalten

Die Überprüfung, ob das Bild korrekt fertig gestellt wurde, ist eigentlich ganz einfach ... jedes tile()-Element besitzt zwei Koordinaten-Paare: x,y und trueX,trueY. trueX und trueY ist die korrekte Position, die vorm Mischen eingelesen wurde, x und y sind die gegenwärtigen Positionen. Um zu checken, ob das Puzzle fertig gestellt wurde, muß man einfach die ganze Liste durchnudeln, und checken, ob irgendwo x <> trueX oder y <> true> oder rotation <> 0°. Wenn ja, dann abbrechen und zurück zum Spiel.

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye