def __init__(self): self.toMainMenu = False self.pages = [Page()] self.mainPage = Page() self.pages[0].add(self.mainPage) def onBackClick(button): self.toMainMenu = True #page items self.backButton = Button(960, 900, onClick=onBackClick, txt='Terug') self.titleText = Text('Credits', 960, 150, 960, 150, txtColor=(255, 255, 255), txtSize=100) self.bodyText = Text( 'de Legende van Habam -Digital Companion-\neen project voor de Hogeschool Rotterdam, opleiding Informatica\nhttps://www.hogeschoolrotterdam.nl/\n(c) 2019 INF1C Groep 1\n\nOntwikkeld door:\nMahmoud Arab\nHakan Dalama\nAudi van Gog\nBastiaan te Veldhuis\n\nMet dank aan:\nAron van den Eng\nGert-Jan den Heijer\nAstrid van Duuren\n\nGemaakt met Python in Processing 3', 960, 540, 1960, 700, txtColor=(255, 255, 255), txtSize=32) #to add items self.pages[0].add(self.backButton) self.pages[0].add(self.titleText) self.pages[0].add(self.bodyText)
def __init__(self, spelverloop): self.spelverloop = spelverloop self.page = Page() self.page.add( Text("Spelverloop", 500, 100, 500, 80, txtSize=40, txtColor=(255, 255, 255))) #header self.currentDayText = Text("Dag 1", 500, 140, 500, 80, txtSize=32, txtColor=(240, 240, 240)) self.page.add(self.currentDayText) self.goBackToMainMenu = False def onNextTurnClick(button): self.spelverloop.nextTurn() def onBackClick(button): self.goBackToMainMenu = True self.page.add( Button(500, 500, txt="Volgende beurt", onClick=onNextTurnClick)) self.page.add(Button(500, 600, txt="Terug", onClick=onBackClick)) self.turnLabelValues = { Turn.PLAYER_1: "Speler 1", Turn.PLAYER_2: "Speler 2", Turn.PLAYER_3: "Speler 3", Turn.PLAYER_4: "Speler 4", Turn.ACTIONCARD: "Pak een\nactiekaart", Turn.ENEMIES: "Tegenstanders\n gaan vooruit", Turn.GET_GRAIN: "Krijg\n graan", Turn.GET_RESOURCES: "Krijg\n resources" } self.turnLabels = [ Text(self.turnLabelValues[i], 100 + 120 * i, 300, 200, 50, txtSize=20, txtColor=(self.TURN_COLOR_DEFAULT)) for i in range(Turn.END) ] for label in self.turnLabels: self.page.add(label)
def __init__(self): self.toMainMenu = False self.pages = [Page()] self.mainPage = Page() self.pages[0].add(self.mainPage) def onBackClick(button): self.toMainMenu = True #page items self.backButton = Button(960, 700, onClick = onBackClick, txt = 'Terug') self.titleText = Text("Spelernamen", 960, 150, 960, 150, txtColor=(255,255,255), txtSize = 100) self.p1name = TextField(960, 300, placeHolder = 'Speler 1') self.p2name = TextField(960, 380, placeHolder = 'Speler 2') self.p3name = TextField(960, 460, placeHolder = 'Speler 3') self.p4name = TextField(960, 540, placeHolder = 'Speler 4') #to add items self.pages[0].add(self.backButton) self.pages[0].add(self.titleText) self.pages[0].add(self.p1name) self.pages[0].add(self.p2name) self.pages[0].add(self.p3name) self.pages[0].add(self.p4name)
def __init__(self, playerNames, tellers, files): self.pages = [Page() for i in range(self.PHASE_END + 1)] self.resultValuesPage = Page() self.pages[self.PHASE_RESULT].add(self.resultValuesPage) self.playerNames = playerNames self.tellers = tellers self.files = files self.selectedPlayers = set() #Player index 0-3 (player 1 - 4) self.enemy = 0 #Enemy tier index 0-3 (low tier, mid tier, high tier, final boss) self.effecten = [ set(), set(), set(), set() ] #Effecten van verkregen effectkaarten van elk speler self.availableEffects = [[self.EFFECT_ADD_2PP, "+2k"], [self.EFFECT_MUL_2PP, "x2k"], [self.EFFECT_OUT_2DAYS, ""], [self.EFFECT_EXTRA_TRY, ""]] #----BUTTON EVENTS----- def onPlayerClick(button): self.player = button.playerIndex if (button.playerIndex in self.selectedPlayers): self.selectedPlayers.remove(button.playerIndex) button.bgColor = Button.bgColor button.bgColorCurrent = Button.bgColor else: self.selectedPlayers.add(button.playerIndex) button.bgColor = Button.bgColorHover button.bgColorCurrent = Button.bgColorHover self.playerNextButton.enabled = len(self.selectedPlayers) > 0 def onEffectClick(button): player = button.playerIndex effect = button.effect if (effect in self.effecten[player]): self.effecten[player].remove(effect) button.bgColor = Button.bgColor button.bgColorCurrent = Button.bgColor else: self.effecten[player].add(effect) button.bgColor = Button.bgColorPressed button.bgColorCurrent = Button.bgColorPressed def onNextClick(button): if (len(self.selectedPlayers) > 0): if (len(self.selectedPlayers) > 1): self.headers[ self. PHASE_CHOOSE_ENEMY].txt = "Jullie vechten tegen..." else: self.headers[ self.PHASE_CHOOSE_ENEMY].txt = "Je vecht tegen..." self.phase = self.PHASE_CHOOSE_ENEMY print("effecten:", self.effecten) def onEnemyClick(button): self.phase = self.PHASE_RESULT self.enemy = button.enemyIndex self.fight() def onBackClick(button): self.phase = self.PHASE_END def onBackToPlayersClick(button): self.phase = self.PHASE_CHOOSE_PLAYER def onResetClick(button): self.fight() #If the user clicks on the button of this event, a page will be displayed where he/she can can throw a dice to get a powerpoint. def onGetPowerpointsClick(button): self.phase = self.PHASE_GET_POWERPOINTS self.throwForPowerpoints( ) #Throw dices to get powerpoints and display the result #--------------------- self.phase = self.PHASE_CHOOSE_PLAYER headerTemplate = Text("TEXT", 960, 160, 1200, 140, txtSize=70, txtColor=(255, 255, 255)) self.headers = [ #Create labels to display a header on each page headerTemplate.copy(txt="Je bent/Jullie zijn..."), headerTemplate.copy(txt="Je vecht tegen..."), headerTemplate.copy(txt="RESULTAAT"), headerTemplate.copy(txt="Krijg krachtpunten") ] #Add the headers to the pages to update and display them for i in range(len(self.headers)): self.pages[i].add(self.headers[i]) self.buttonTemplate = Button(0, 0, w=360, h=50, txtSize=40, radius=3) unitButtonTemplate = self.buttonTemplate.copy(y=700) effectButtonTemplate = Button(0, unitButtonTemplate.y + 70, w=54, h=54, txtOffsetY=14, radius=50) heroImageFileNames = ["held1", "held2", "held3", "held4"] enemyImageFileNames = ["tier1", "tier2", "tier3", "tier4"] #Create buttons for choosing a player for i in range(self.getPlayerCount()): #for each player button = unitButtonTemplate.copy(x=i * 400 + 340, txt=self.playerNames[i], onClick=onPlayerClick) button.playerIndex = i button.enabled = self.getPlayerPowerpoints(i) >= 0 self.pages[self.PHASE_CHOOSE_PLAYER].add(button) #Draw hero image heroImage = Image(self.files.getImage(heroImageFileNames[i]), button.x, button.y - 270, True) self.pages[self.PHASE_CHOOSE_PLAYER].add(heroImage) for j in range(len(self.availableEffects)): #for each effect effectButton = effectButtonTemplate.copy( x=button.x + 60 * j - 85, onClick=onEffectClick, playerIndex=i, effect=self.availableEffects[j][0], txt=self.availableEffects[j][1]) effectButton.enabled = self.getPlayerPowerpoints(i) >= 0 self.pages[self.PHASE_CHOOSE_PLAYER].add(effectButton) if (self.availableEffects[j][0] == self.EFFECT_OUT_2DAYS): icon = Image(self.files.getImage("buitenspel_icon"), effectButton.x, effectButton.y, True) self.pages[self.PHASE_CHOOSE_PLAYER].add(icon) if (self.availableEffects[j][0] == self.EFFECT_EXTRA_TRY): icon = Image(self.files.getImage("extraLife"), effectButton.x, effectButton.y, True) self.pages[self.PHASE_CHOOSE_PLAYER].add(icon) #Create buttons for choosing an enemy for i in range(self.getEnemyTierCount()): button = unitButtonTemplate.copy(x=i * 400 + 340, txt=self.tiers[i], onClick=onEnemyClick) button.enemyIndex = i self.pages[self.PHASE_CHOOSE_ENEMY].add(button) #Draw enemy image enemyImage = Image(files.getImage(enemyImageFileNames[i]), button.x, button.y - 270, True) self.pages[self.PHASE_CHOOSE_ENEMY].add(enemyImage) self.playerNextButton = self.buttonTemplate.copy(x=960 - 300, y=850, txt="Volgende", onClick=onNextClick, enabled=False) self.pages[self.PHASE_CHOOSE_PLAYER].add(self.playerNextButton) #Reset button: fight again, Backbutton: resets the battlesystem (for now) self.resetButton = self.buttonTemplate.copy(x=960 - 300, y=850, txt="Vecht opnieuw!", onClick=onResetClick) self.backButton = self.buttonTemplate.copy(x=960 + 300, y=850, txt="Hoofdmenu", onClick=onBackClick) self.getPPButton = self.buttonTemplate.copy( x=960, y=910, w=600, txt="Verkrijg krachtpunten", onClick=onGetPowerpointsClick) #Add those buttons to the result page self.pages[self.PHASE_RESULT].add(self.resetButton) self.pages[self.PHASE_RESULT].add(self.backButton) self.pages[self.PHASE_CHOOSE_PLAYER].add( self.backButton.copy(onClick=onBackClick)) self.pages[self.PHASE_CHOOSE_ENEMY].add( self.backButton.copy(onClick=onBackToPlayersClick, txt="Terug")) self.pages[self.PHASE_RESULT].add(self.getPPButton) self.pages[self.PHASE_GET_POWERPOINTS].add( self.backButton.copy(onClick=onBackClick, x=960, y=910, w=600))
def __init__(self): self.currentPage = 0 self.toMainMenu = False self.pages = [ Page(), Page(), Page(), Page(), Page(), Page(), Page(), Page(), Page() ] self.page1 = Page() self.page2 = Page() self.page3 = Page() self.page4 = Page() self.page5 = Page() self.page6 = Page() self.page7 = Page() self.page8 = Page() self.page9 = Page() self.pages[0].add(self.page1) self.pages[1].add(self.page2) self.pages[2].add(self.page3) self.pages[3].add(self.page4) self.pages[4].add(self.page5) self.pages[5].add(self.page6) self.pages[6].add(self.page7) self.pages[7].add(self.page8) self.pages[8].add(self.page9) def onBackClick(button): self.toMainMenu = True def onNextClick(button): self.currentPage += 1 def onPrevClick(button): self.currentPage -= 1 #page items self.backButton = Button(960, 900, onClick=onBackClick, txt='Terug') self.nextButton = Button(1200, 900, onClick=onNextClick, txt='Volgende ->') self.prevButton = Button(720, 900, onClick=onPrevClick, txt='<- Vorige') self.titleText = Text("Spelregels", 960, 150, 500, 100, txtColor=(255, 255, 255), txtSize=100) self.text1 = Text( "Voorbereiding\n\nVoordat het spel kan beginnen moet het bord worden neergelegd. Het bord bestaat uit een frame en een aantal vierkante plaatjes. De plaatjes worden willekeurig in het frame gelegd. Dit is het uiteindelijke speelveld.\n\nVervolgens worden de spelerpionnen aan een kant van het speelveld gezet. Spelers mogen zelf kiezen op welk van de 7 beginvakjes ze gaan staan. Er mag maar 1 held op 1 vakje staan. Aan de andere kant van het speelveld komen de vijandige pionnen, 1 op elk vakje. Dit is de eerste vijandengolf.\n\nAls laatst mogen er drie fabrieken naar keuze worden neergezet op het speelveld. Let op: fabrieken leveren alleen iets op als ze op een met grondstof gemarkeerd veld staan.\n\nDe grondstof- stamina- en krachtpunten kunnen via de software bijgehouden worden. Het spel begint zonder grondstoffen en elke speler krijgt 2 krachtpunten en 7 staminapunten.", 960, 600, 800, 800, txtSize=25) self.text2 = Text( "Spelverloop\n\nDe spelers kunnen tijdens een beurt lopen, bouwen, verbeteren en vechten. Naast deze acties kan een speler ook ervoor kiezen om niets te doen. Alle acties kunnen in 1 dag uitgevoerd worden door elke speler. De spelers kunnen deze acties alleen overdag uitvoeren.\n\nLopen\nAls een speler gaat lopen met zijn pion, kost hem of haar dit 1 staminapunt per vakje. Als een speler geen stamina meer heeft kan deze niet meer lopen. Stamina kan worden bijgevuld door 1 eenheid graan te gebruiken uit de grondstoffen. (1 eenheid graan = 1 staminapunt)\n\nBouwen\nEen speler kan ervoor kiezen om 1 van de volgende dingen te bouwen: Fabriek, Muur, Brug, Straat, Warenhuis of Markt. Een gebouw kan alleen gebouwd worden op het vakje waar de bouwende speler op staat, met als uitzondering de Brug, die alleen op een watervak naast de bouwende speler gebouwd kan worden. Sommige gebouwen hebben meerdere soorten (tiers): Hout (goud), steen (zwart) of staal (blauw).", 960, 600, 800, 800, txtSize=25) self.text3 = Text( "Gebouwen\n\nFabriek\nEen fabriek zorgt voor grondstoffen. Er zijn twee verschillende soorten fabriek: een high tier fabriek en een low tier fabriek. Deze fabrieken leveren het volgende op:\nGraan\nLow tier - 1 keer het aantal spelers per dag\nHigh tier - 2 keer het aantal spelers per dag\nHout\nLow tier - 3 per 2 dagen\nHigh tier - 3 per dag\nSteen\nLow tier - 2 per 2 dagen\nHigh tier - 2 per dag\nStaal\nLow tier - 1 per 2 dagen\nHigh tier - 1 per dag\n\nEen low tier fabriek kost 2 hout en 1 steen. De vijand kan deze in 2 beurten vernietigen.\nEen high tier fabriek kost 3 hout, 2 steen en 1 staal. De vijand kan deze in 4 beurten vernietigen.\nDe fabrieken produceren de grondstof van het vakje waar ze op staan.\nJe kunt een fabriek verbeteren (ombouwen van low tier tot high tier) met 1 hout, 1 steen en 2 staal.", 960, 600, 8000, 800, txtSize=25) self.text4 = Text( "Gebouwen\n\nMuur\nEen muur kan gebouwd worden om vijanden tijdelijk tegen te houden. Er zijn houten, stenen en stalen muren. De kosten van de muur is 1 eenheid van de grondstof waar deze van wordt gebouwd. Een houten muur zorgt ervoor dat de vijand 1 beurt langer op het huidige vakje blijft, een stenen muur doet dit voor 2 beurten en een stalen muur 3 beurten. Wanneer deze beurten voorbij zijn, wordt de muur vernietigd. Een muur kan afgebroken worden, dit kost hetzelfde als een muur bouwen.\n\nBrug\nEen brug kan gebouwd worden om watervlakken over te kunnen steken. Een brug kost 2 van de desbetreffende grondstoffen. Er zijn houten, stenen en stalen bruggen. Een houten brug kan 2 keer gebruikt worden, een stenen brug 4 keer en een stalen brug 8 keer. Vijanden kunnen ook gebruik maken van de bruggen. Deze kan dan in 1 keer over een vakje water. Als een vijand over de brug gaat telt dit als 1 keer gebruikt. Nadat een brug is opgebruikt stort deze in. Een brug kan afgebroken worden, dit kost 1 eenheid van de desbetreffende grondstof.", 960, 600, 800, 800, txtSize=25) self.text5 = Text( "Gebouwen\n\nStraat\nEen straat kan gebouwd worden door 2 steen te gebruiken. Tegenstanders kunnen deze niet afbreken maar wel gebruiken. Als een speler over een vakje met een straat loopt kost dit geen stamina. Het afbreken van een straat kost 1 steen.\n\nWarenhuis\nEen warenhuis kan gebouwd worden om het aantal grondstoffen dat de spelers tegelijk in het bezit kan hebben te vergroten. Een warenhuis kan gebouwd worden door 3 hout te gebruiken. Een warenhuis kan verbeterd worden om meer voorwerpen vast te kunnen houden, dit kost 3 steen voor de eerste upgrade, en 3 staal voor de tweede upgrade. Aan het begin van het spel kunnen de spelers 10 grondstoffen bezitten. Een houten warenhuis heeft plaats voor 6 extra grondstoffen, een stenen warenhuis heeft plaats voor 10 extra grondstoffen, en een stalen warenhuis voor 14. Warenhuizen kunnen worden afgebroken met 2 eenheden van de grondstof waar ze van zijn gebouwd.\n\nMarkt\nEen markt kan gebouwd worden om effectkaarten en rugzakken te kopen. Een effectkaart kost 3 graan en een rugzak kost 3 steen. Een rugzak vergroot het aantal grondstoffen dat gehouden kan worden met 3. Er kan maar 1 rugzak worden gekocht. Met de markt kunnen 3 dezelfde grondstoffen geruild worden voor 1 andere grondstof. Een krachtpunt kan hier gekocht worden van 3 van elke grondstof. Een vijand heeft 3 beurten nodig om een markt te vernietigen.", 960, 600, 1100, 800, txtSize=25) self.text6 = Text( "Vechten\n\nAls een speler op hetzelfde vakje staat als een vijand kan de speler kiezen om aan te vallen. Spelers kunnen niet worden aangevallen door vijanden.\nBij het aanvallen worden dobbelstenen gebruikt om te bepalen wie er wint. De speler gooit 2 dobbelstenen. Een andere speler gooit voor de vijand. Het aantal dobbelstenen en krachtpunten wordt bepaald door de tier van de vijand. Als er gegooid is, wordt het hoogste aantal gegooide ogen opgeteld bij de krachtpunten. Wie dan het meeste punten heeft wint het gevecht. Je kunt ook met meerdere spelers 1 vijand aanvallen. In dat geval worden alle totale punten van de spelers bij elkaar opgeteld.\nIn de software kun je gebruikmaken van een automatisch gevechtssysteem.\n\nEr zijn vier verschillende tiers vijanden: Low-tier heeft 1 krachtpunt en 2 dobbelstenen, Mid-tier heeft 2 krachtpunten en 2 dobbelstenen, High tier heeft 4 krachtpunten en 3 dobbelstenen, en de eindbaas. De eindbaas heeft bij 2 spelers 6 krachtpunten, bij 3 spelers 12 en bij 4 spelers 18, gooit altijd met 3 dobbelstenen, en zet twee stappen per nacht.\n\nAls je een gevecht wint, krijg je een overwinningspunt. Deze punten bepalen welke vijanden op welk moment in het spel komen. Op de volgende pagina staat welke tier op welke plaats in het spel komt. Wanneer er vijf, tien, vijftien of twintig overwinningspunten behaald zijn begint er meteen een nieuwe golf. Alle nog levende vijanden blijven in het veld, met als uitzondering de eindbaasgolf, waarbij de nog levende vijanden uit het spel verwijderd worden.", 960, 600, 1000, 800, txtSize=25) self.text7 = Text( "Vechten\n\nVijandengolven:\n[L = Low-tier, M = Mid-tier, H = High-tier, E = Eindbaas]\nVanaf 0 overwinningspunten (begin van het spel):\nL, L, L, L, L, L, L\n\nVanaf 5 overwinningspunten:\nL, L, M, M, M, L, L\n\nVanaf 10 overwinningspunten:\nM, M, H, H, H, M, M\n\nVanaf 15 overwinningspunten:\nH, H, H, H, H, H, H\n\nVanaf 20 overwinningspunten:\n-, -, -, E, -, -, -", 960, 600, 800, 800, txtSize=25) self.text8 = Text( "Vechten\n\nGewonnen?\nDe vijand is verslagen en wordt uit het spel gehaald. De speler gooit 1 dobbelsteen. Als 5 of 6 wordt gegooid krijgt de speler een extra krachtpunt, anders gebeurt er niets. Elke vijand is 1 overwinningspunt waard.\n\nVerloren?\nDe speler is verslagen en verliest een krachtpunt. Als de speler geen krachtpunten meer heeft mag deze niet meer meedoen voor 3 dagen. Daarna begint deze aan het begin van het bord (bij het kasteel). De vijand blijft op het bord maar beweegt niet voor 1 nacht.\n\nGelijkspel?\nEr gebeurt niets en de speler kan opnieuw gooien of stoppen met de aanval.", 960, 600, 800, 800, txtSize=25) self.text9 = Text( "Spelverloop\n\nNacht\nAls iedere speler aan de beurt geweest is, is de dag voorbij en begint de nacht. In de nacht kunnen spelers geen acties meer uitvoeren en worden de volgende stappen ondernomen:\n1. Vijanden bewegen allemaal 1 stap naar voren.\n2. Er wordt een actiekaart gepakt en deze wordt uitgevoerd.\n3. De spelers krijgen grondstoffen.\n\nAfloop\nAls de spelers 20 overwinningspunten hebben bemachtigd worden alle vijanden van het bord gehaald en wordt de eindbaas op het bord gezet. Als de eindbaas verslagen is is het spel voorbij en hebben de spelers gewonnen.\nHet spel is verloren wanneer er 3 of meer reguliere (low- mid- of high-tier) vijanden het kasteel binnen zijn gedrongen. Het spel eindigt ook in verlies voor de spelers wanneer de eindbaas het kasteel bereikt.", 960, 600, 800, 800, txtSize=25) #to add items for self.x in range(0, 9): self.pages[self.x].add(self.titleText) self.pages[self.x].add(self.backButton) if self.x != 8: self.pages[self.x].add(self.nextButton) if self.x != 0: self.pages[self.x].add(self.prevButton) self.pages[0].add(self.text1) self.pages[1].add(self.text2) self.pages[2].add(self.text3) self.pages[3].add(self.text4) self.pages[4].add(self.text5) self.pages[5].add(self.text6) self.pages[6].add(self.text7) self.pages[7].add(self.text8) self.pages[8].add(self.text9)
class MainMenu: page = Page() phase = AppPhase.MAINMENU def __init__(self): def onInventoryClick(button): self.phase = AppPhase.INVENTORY def onBattleSystemClick(button): self.phase = AppPhase.BATTLESYSTEM def onBoardRandomizerClick(button): self.phase = AppPhase.BOARD_RANDOMIZER def onGameManualClick(button): self.phase = AppPhase.RULEBOOK def onCreditsClick(button): self.phase = AppPhase.CREDITS def onPlayernameClick(button): self.phase = AppPhase.PLAYERNAMES def onMarketClick(button): self.phase = AppPhase.MARKET def onSpelverloopClick(button): self.phase = AppPhase.SPELVERLOOP buttonX = 960 buttonY = 250 buttonMarginY = 70 buttonTemplate = Button(buttonX, buttonY, w=260, radius=3) self.page.add( Text("Hoofdmenu", 960, 150, 500, 100, txtColor=(255, 255, 255), txtSize=100)) self.page.add( buttonTemplate.copy(y=buttonY + buttonMarginY * 1, onClick=onInventoryClick, txt="Inventaris")) self.page.add( buttonTemplate.copy(y=buttonY + buttonMarginY * 2, onClick=onBattleSystemClick, txt="Gevecht")) self.page.add( buttonTemplate.copy(y=buttonY + buttonMarginY * 6, onClick=onBoardRandomizerClick, txt="Bord randomizer")) self.page.add( buttonTemplate.copy(y=buttonY + buttonMarginY * 4, onClick=onGameManualClick, txt="Spelregels")) self.page.add( buttonTemplate.copy(y=buttonY + buttonMarginY * 7, onClick=onCreditsClick, txt="Credits")) self.page.add( buttonTemplate.copy(y=buttonY + buttonMarginY * 5, onClick=onPlayernameClick, txt='Spelernamen')) self.page.add( buttonTemplate.copy(y=buttonY + buttonMarginY * 3, onClick=onMarketClick, txt='Markt')) self.page.add( buttonTemplate.copy(y=buttonY + buttonMarginY * 0, onClick=onSpelverloopClick, txt='Spelverloop')) def draw(self): self.page.update() self.page.draw()