root/traintris/gameboardview.py @ 288

Revision 288, 26.3 KB (checked in by andefodahl, 2 years ago)

Remove button works

Line 
1import pygame
2from pygame.locals import *
3from comments import *
4from constants import *
5import sys
6import shelve
7import atexit
8import os.path
9import glob
10import pickle
11import pygame.image
12import pygame.font
13import pygame.key
14import pygame.mouse
15import pygame.display
16import pygame.mixer
17import pygame.mixer_music
18import pygame.time
19import pygame.event
20import pygame.mouse
21import random
22import math
23from graphics import Graphics
24
25from eventmanager import *
26
27################################################################################################             
28
29
30
31#------------------------------------------------------------------
32# Helper function that makes an empty array of a specified size
33def makeEmptyArray(v):
34    array = []
35    for i in range(15):
36        array2 = []
37        for j in range(15):
38            array2.append(v)
39        array.append(array2)
40        del array2
41    return array
42
43
44class GameBoardView:
45   
46    def __init__(self, screen, evManager):
47   
48        self.comments = Comments().comments
49        self.foodweb = FoodWeb().foodweb
50       
51        self.STATE_PREPARE = 0
52        self.STATE_RUN = 1
53        self.state = self.STATE_PREPARE
54
55        self.evManager = evManager
56        self.evManager.RegisterListener(self)
57        self.graphics = Graphics(screen)
58
59        self.screen = screen
60        self.level = []
61        # background
62        self.level.append(makeEmptyArray(0))
63        self.level.append(makeEmptyArray(-1))
64       
65        self.selectedOrganism = None
66        self.selectedOrganismIndex = None
67        self.lastButtonClicked = None
68        self.buttonList = []
69   
70        # filename
71        self.filename = ''
72        # edit cursor position
73        self.x = 0
74        self.y = 0
75        # tile set index & current tile set (ground, overlay, object)
76        self.setIndex = 0 # selects the type of organism
77        self.set = 1
78
79        # mode = map editor
80        self.i = 0
81        self.mode = 0
82        self.tileSet = self.graphics.makeGroundTiles('ground')
83
84        self.season = CONSTANTS.SUMMER
85        self.daysTillChange = 20
86       
87        self.panelType = "mainPanel"
88        self.objectTileSet = self.graphics.makeObjectTileSet(self.panelType) 
89        self.spriteTileSet = self.graphics.makeObjectTileSet("objects")
90
91        self.state = self.STATE_RUN
92       
93        #Messageboard drawing presets
94        self.font = pygame.font.SysFont(None, 30)
95        self.font2 = pygame.font.SysFont(None, 20)
96        self.font3 = pygame.font.SysFont(None, 10)
97
98        self.white = (255, 255, 255)
99        self.black = (0, 0, 0)
100        self.yellow = (255, 255, 0)
101        self.textColor = (55, 74, 46)
102        self.mbcolor = (146,209,79)
103       
104        #Load pictures
105        controls = self.graphics.loadImage("controls.jpg")
106        self.next = self.graphics.loadImage("Next.png")
107        self.skip = self.graphics.loadImage("Skip.png")
108       
109        self.splash = True
110        self.tutorial = False
111        self.tutorialCount = 1
112        self.message = False
113       
114        self.drawCategoryButtons()
115        self.drawMenuButtons()
116               
117        pygame.display.update()
118
119
120    def draw(self):
121        self.graphics.drawBackground(self.season)
122        self.graphics.drawBoard(self.level[0], self.tileSet, self.screen, self.season)
123        self.graphics.drawObjectsAndMobs(self.level[1], self.spriteTileSet, [],
124                           self.screen, 0)
125        if hasattr(self, 'infoname'):
126            self.graphics.drawInfoBox(self.infoname, self.infodescription, self.infodiet, self.inforange, self.infopredators, self.black)
127        else:
128            self.graphics.drawInfoBox()
129        self.graphics.drawMenuBox()
130        if self.selectedOrganism:
131            self.graphics.drawBottomBar(self.daysTillChange, self.season, self.selectedOrganism, \
132                                        self.comments[self.selectedOrganism+"Food"], \
133                                        self.foodweb[self.selectedOrganismIndex][0][2])
134        else:
135            self.graphics.drawBottomBar(self.daysTillChange, self.season)
136        for button in self.buttonList:
137            self.graphics.drawButton(button.text, button.size, button.images, button.mode, button.pos)
138        # if self.message:
139            # self.drawMessageBoard(self.message)
140        if self.splash:
141            self.graphics.drawImage("intro.png", (0,0))
142        pygame.display.update()
143   
144    ############################################################################
145    ################################ Button stuff ##############################
146    ############################################################################   
147   
148    def addButton(self, text, imageName, size, pos, type):
149        self.buttonList.append(Button(text, imageName, size, pos, type))
150       
151    def removeButton(self, imageName): 
152        for button in self.buttonList:
153            if button.imageName == imageName:
154                self.buttonList.remove(button)
155               
156    def drawCategoryButtons(self):
157        buttonsize = (self.screen.get_width() / 4)
158        self.addButton( "Producers", "topbutton", (buttonsize, 65), (0,0), CONSTANTS.CATEGORY)
159        self.addButton( "Herbivores", "topbutton", (buttonsize, 65), (buttonsize, 0), CONSTANTS.CATEGORY)
160        self.addButton( "Carnivores", "topbutton", (buttonsize, 65), (2*buttonsize, 0), CONSTANTS.CATEGORY)
161        self.addButton( "Humans", "topbutton", (buttonsize, 65), (3*buttonsize, 0), CONSTANTS.CATEGORY)
162       
163    def drawOrganismBar(self, animalList):
164        buttonsize = (self.screen.get_width() / 8)+1 # 1 more pixel is needed because of rounding
165        for x in range(len(animalList)):
166            self.addButton( animalList[x][0], "tr", (buttonsize, 90), ((x)*buttonsize, 65), CONSTANTS.ORGANISM)
167           
168    def removeOrganismBar(self):
169        for x in range(8):
170            self.removeButton("tr")
171         
172    def drawMenuButtons(self):
173        boxsize = (self.screen.get_width() / 5)
174        xstart = self.screen.get_width() - boxsize
175        ystart = self.screen.get_height() - boxsize
176        self.addButton( "Remove", "topbutton", (342, 65), (xstart + 10, ystart + 10), CONSTANTS.MENU)
177
178    ############################################################################
179
180    def addOrganism(self):
181        self.level[self.set][self.y][self.x] = self.setIndex
182
183    def changeTile(self, row, column):
184        self.level[0][column][row] = self.setIndex
185
186    # def contTutorial(self):
187        # self.tutorialCount += 1
188        # x = self.tutorialCount
189        # if x < 1:
190            # self.message = (self.comments["tutorial11"],self.comments["tutorial12"],self.comments["tutorial13"], True, True)
191        # elif x == 2:
192            # self.message = (self.comments["tutorial21"], self.comments["tutorial22"],self.comments["tutorial23"],False, True)             
193        # elif x ==3:
194            # pygame.draw.rect(self.screen, self.yellow, [6, 6, (203-10) , (73-10)], 10)
195            # self.message = (self.comments["tutorial31"],self.comments["tutorial32"], self.comments["tutorial33"],
196                                  # False, True)
197        # elif x == 4:
198            # self.evManager.Post(PanelChange("plants", None, None))
199            # self.screen.blit(self.graphics.makeImage(os.path.join('gfx','objects',"range.png")), (250,185))
200            # self.message = (self.comments["tutorial41"], self.comments["tutorial42"], self.comments["tutorial43"],
201                                  # False, True)
202        # elif x == 5:
203            # self.screen.blit(self.graphics.makeImage(os.path.join('gfx','objects',"food.png")), (250,185))
204            # self.message = (self.comments["tutorial51"],self.comments["tutorial52"], self.comments["tutorial53"],
205                                  # False, True)
206        # elif x == 6:
207            # self.message = (self.comments["tutorial61"],self.comments["tutorial62"], self.comments["tutorial63"],
208                                  # False, False)
209            # self.evManager.Post(PanelChange("omnivore", 780, 35))
210            # self.evManager.Post(ChangeTutorial())
211           
212        # pygame.display.update()
213       
214    #------------------------------------------------------------------
215    # Method used to bring up more information about the currently selected
216    # organism for use by the user in reference
217    def moreInfoPanel(self, objectType, number, context):
218        if objectType == "plants": 
219            if number == 0:
220                self.moreInfoDraw("Fruit Tree",self.comments["fruitTreeInfo"], "none", context,
221                    "Summer", self.comments["fruitTreeEaters"])
222            elif number == 1:
223                self.moreInfoDraw("Shrub",self.comments["shrubInfo"], "none", context, 
224                    "Summer", self.comments["shrubEaters"])
225            elif number == 2:
226                self.moreInfoDraw("Banana Plant",self.comments["bananaInfo"], "none",context,
227                    "Summer", self.comments["bananaEaters"])
228            elif number == 3:
229                self.moreInfoDraw("Grass",self.comments["grassInfo"], "none", context,
230                    "Winter",self.comments["grassEaters"])
231            elif number == 4:
232                self.moreInfoDraw("Vegetables",self.comments["vegInfo"], "none",context,
233                    "Winter", self.comments["vegEaters"])
234            elif number == 5:
235                self.moreInfoDraw("Berries",self.comments["berriesInfo"], "none",context,
236                    "Winter", self.comments["berriesEaters"]) 
237
238
239        elif objectType == "herbPanel1":
240            if number == 0:
241                self.moreInfoDraw("Deer",self.comments["deerInfo"],
242                    "2 cells", context, self.comments["deerFood"], self.comments["deerPredators"])
243            elif number == 1:
244                self.moreInfoDraw("Sheep",self.comments["sheepInfo"],
245                    "2 cells", context, self.comments["sheepFood"], self.comments["sheepPredators"])
246            elif number == 2:
247                self.moreInfoDraw("Rabbit",self.comments["rabbitInfo"],
248                    "2 cell", context, self.comments["rabbitFood"], self.comments["rabbitPredators"])
249            elif number == 3:
250                self.moreInfoDraw("Squirrel",self.comments["squirrelInfo"],
251                    "2 cell", context, self.comments["squirrelFood"], self.comments["squirrelPredators"])
252            elif number == 4:
253                self.moreInfoDraw("Cow",self.comments["cowInfo"],
254                    "2 cells", context, self.comments["cowFood"], self.comments["cowPredators"])
255            elif number == 5:
256                self.moreInfoDraw("Elephant",self.comments["elephantInfo"],
257                    "2 cells", context, self.comments["elephantFood"], self.comments["elephantPredators"])
258            elif number == 6:
259                self.moreInfoDraw("Giraffe",self.comments["giraffeInfo"],
260                    "2 cells", context,  self.comments["giraffeFood"], self.comments["giraffePredators"])
261            elif number == 7:
262                self.moreInfoDraw("Rat", self.comments["ratInfo"],
263                    "2 cell", context, self.comments["ratFood"], self.comments["ratPredators"])
264
265
266        elif objectType == "carnivore":
267            if number == 0:
268                self.moreInfoDraw("Fox",self.comments["foxInfo"], "3 cells", context,
269                    self.comments["foxFood"], "Human")
270            elif number == 1:
271                self.moreInfoDraw("Falcon",self.comments["falconInfo"],
272                    "3 cells", context, self.comments["falconFood"], "Human")
273            elif number == 2:
274                self.moreInfoDraw("Lion",self.comments["lionInfo"],
275                    "3 cell", context, self.comments["lionFood"], "Human")
276            elif number == 3:
277                self.moreInfoDraw("Lynx",self.comments["lynxInfo"],
278                    "3 cells", context, self.comments["lynxFood"], "Human")
279            elif number == 4:
280                self.moreInfoDraw("Tiger",self.comments["tigerInfo"],
281                    "3 cells", context, self.comments["tigerFood"], "Human")
282            elif number == 5:
283                self.moreInfoDraw("Bear",self.comments["bearInfo"],
284                        "3 cells", context, self.comments["bearFood"], "Human")
285            elif number == 6:
286                self.moreInfoDraw("Wolf",self.comments["wolfInfo"],
287                        "3 cells", context, self.comments["wolfFood"] , "Human")
288            elif number == 7:
289                self.moreInfoDraw("Snake",self.comments["snakeInfo"],
290                        "3 cell", context, self.comments["snakeFood"], "Human")
291                           
292        elif objectType == "omnivore":
293            if number == 0:
294                self.moreInfoDraw2("Forest Ranger", self.comments["humanInfo"],
295                        "10 cells", context, self.comments["humanFood"], "None!")
296               
297        pygame.display.update()
298
299               
300    #------------------------------------------------------------------
301    # Helper function used to output more information to the screen when necessary
302    def moreInfoDraw (self, name, description, range, context, diet, predators):
303        if context == 0:
304            self.evManager.Post(ChangeLock(True))
305            pygame.draw.rect(self.screen, self.mbcolor, [250, 185,
306                                    300,210])
307            pygame.draw.ellipse(self.screen, self.white, [475, 185, 75, 40])
308            self.screen.blit(self.font2.render("Close", 1, self.textColor),
309                          (490,200))
310
311            self.screen.blit(self.font.render(name, 1, self.textColor),
312                     ((402 - 5.5*len(name)),200))
313            self.screen.blit(self.font.render("Description: ", 1,
314                                           self.textColor),
315                     (252,225))       
316            self.screen.blit(self.font2.render(description, 1, self.textColor),
317                     (255,245))
318            self.screen.blit(self.font.render("Foraging Range: ", 1,
319                                           self.textColor),
320                     (252,260))
321            self.screen.blit(self.font2.render(range, 1, self.textColor),
322                     (255,280))
323
324            self.screen.blit(self.font.render("Diet: ", 1,
325                                              self.textColor),
326                     (252,300))
327            self.screen.blit(self.font2.render(diet, 1, self.textColor),
328                     (255,320))   
329
330
331            self.screen.blit(self.font.render("Predators: ", 1,
332                                              self.textColor),
333                     (252,340))
334            self.screen.blit(self.font2.render(predators, 1, self.textColor),
335                     (255,360))
336        elif context == 1:
337            self.screen.blit(self.font2.render(diet, 1, (0,0,0)),
338                             (2, 105))
339            self.screen.blit(self.font2.render("Range: "+ range, 1,
340                                               (0,0,0)), (2, 85))
341
342
343    def moreInfoDraw2 (self, name, description, range, context, diet, predators):
344        if context == 0:
345            self.evManager.Post(ChangeLock(True))
346            pygame.draw.rect(self.screen, self.mbcolor, [250, 185,
347                                    300,210])
348            pygame.draw.ellipse(self.screen, self.white, [475, 185, 75, 40])
349            self.screen.blit(self.font2.render("Close", 1, self.textColor),
350                          (490,200))
351
352            self.screen.blit(self.font.render(name, 1, self.textColor),
353                     ((402 - 5.5*len(name)),200))
354            self.screen.blit(self.font.render("Description: ", 1,
355                                           self.textColor),
356                     (252,225))       
357            self.screen.blit(self.font2.render(description, 1, self.textColor),
358                     (255,245))
359            self.screen.blit(self.font.render("Foraging Range: ", 1,
360                                           self.textColor),
361                     (252,260))
362            self.screen.blit(self.font2.render(range, 1, self.textColor),
363                     (255,280))
364
365            self.screen.blit(self.font.render("Animals ranger Bill needs: ", 1,
366                                              self.textColor),
367                     (252,300))
368            self.screen.blit(self.font2.render("1 x Bear & 1 x Lion & 1 x Tiger & 1 x Fox &", 1, self.textColor),
369                     (252,320))   
370
371
372            self.screen.blit(self.font2.render("1 x Lynx & 1 x Falcon & 1 x Wolf & 1 x Snake ", 1,
373                                              self.textColor),
374                     (252,340))
375
376
377        elif context == 1:
378            self.screen.blit(self.font2.render(diet, 1, (0,0,0)),
379                             (2, 105))
380            self.screen.blit(self.font2.render("Range: "+ range, 1,
381                                               (0,0,0)), (2, 85))
382                       
383    # def panelClick(self, xcoord, ycoord, event):
384        # # Set some defaults according to the characteristics of parts of the food web
385        # if self.panelType == "herbPanel1":
386            # offset = 6
387            # max = 8
388            # animalList = self.panelList.herbivoreList
389        # elif self.panelType == "carnivore":
390            # offset = 14
391            # max = 8
392            # animalList = self.panelList.carnivoreList
393        # # Special processing when the panel is set to humans/omnivores
394        # elif self.panelType == "omnivore":
395            # if ycoord > 0 and ycoord < 58:
396                # x = (xcoord - 336) / 92
397                # if x == 0:
398                    # ev = CharacterSelectRequest("Human", 22) # human
399                    # self.evManager.Post(ev)   
400                # if xcoord >= 745:
401                    # self.panelType = "mainPanel"
402                    # self.objectTileSet = self.graphics.makeObjectTileSet(self.panelType)
403                    # self.draw()
404                    # self.panelDraw()
405                    # pygame.display.update()
406            # elif ycoord >= 58 and ycoord < 74:
407                     # self.moreInfoPanel(self.panelType, (xcoord-105)/80, 0)
408            # return
409        # else:
410            # offset = 0
411            # max = 6
412            # animalList = self.panelList.plantList
413                     
414       
415        # # Process any mouse input to the panels and call the appropriate event
416        # if ycoord > 0 and ycoord < 58:
417            # x = (xcoord - 105) / 80
418            # # Back to main panel
419            # if x == 8:
420                # self.panelType = "mainPanel"
421                # self.objectTileSet = self.graphics.makeObjectTileSet(self.panelType)
422                # self.draw()
423                # self.panelDraw()
424                # pygame.display.update()
425            # elif x >= 0 and x < max:
426                # ev = CharacterSelectRequest( animalList[x], offset + x)
427                # self.evManager.Post(ev)
428            # # more info                           
429        # elif ycoord >= 58 and ycoord < 74:
430            # self.moreInfoPanel(self.panelType, (xcoord-105)/80, 0)
431        # pygame.display.update()
432
433
434    #------------------------------------------------------------------
435    # Method used to interact and recieve input from the event manager
436    def Notify(self, event):
437        if isinstance(event, CharacterPlaceEvent) and (not self.tutorial):
438            if event.permission == 1:
439                self.x =  event.row
440                self.y =  event.column
441                self.addOrganism()
442                self.daysTillChange -= 1
443                if self.daysTillChange == 0:
444                    self.daysTillChange = 20
445                self.draw()
446                pygame.display.update()
447
448        if isinstance(event, MouseMoveEvent) and (not self.tutorial):
449            self.x = event.x
450            self.y = event.y
451            hovercounter = 0
452            for button in self.buttonList:
453                if button.mode != CONSTANTS.DEPRESSED:
454                    if self.x > button.pos[0] and self.x < button.pos[0]+button.size[0] \
455                    and self.y > button.pos[1] and self.y < button.pos[1]+button.size[1]:
456                        if button.type == CONSTANTS.ORGANISM:
457                            ev = InfoRequest(button.text)
458                            self.evManager.Post(ev)
459                        hovercounter += 1
460                        button.mode = CONSTANTS.HOVER
461                    else:
462                        button.mode = CONSTANTS.NEUTRAL
463            if hovercounter == 0:
464                self.infoname = None
465                self.infodescription = None
466                self.infodiet = None
467                self.inforange = None
468                self.infopredators = None
469                button.mode = CONSTANTS.NEUTRAL
470                       
471            self.draw()
472            pygame.display.update()
473           
474        if isinstance(event, MouseClickEvent):
475            self.x = event.x
476            self.y = event.y
477            if event.type == 'down':
478                for button in self.buttonList:
479                    if self.x > button.pos[0] and self.x < button.pos[0]+button.size[0] \
480                    and self.y > button.pos[1] and self.y < button.pos[1]+button.size[1]:
481                        button.mode = CONSTANTS.DEPRESSED
482            if event.type == 'up':
483                for button in self.buttonList:
484                    button.mode = CONSTANTS.NEUTRAL
485                    if self.x > button.pos[0] and self.x < button.pos[0]+button.size[0] \
486                    and self.y > button.pos[1] and self.y < button.pos[1]+button.size[1]:
487                        if button.type == CONSTANTS.CATEGORY:
488                            if button != self.lastButtonClicked:
489                                self.removeOrganismBar()
490                                self.lastButtonClicked = button
491                                if button.text == "Producers":
492                                    self.drawOrganismBar(CONSTANTS.plantList)
493                                if button.text == "Herbivores":
494                                    self.drawOrganismBar(CONSTANTS.herbivoreList)
495                                if button.text == "Carnivores":
496                                    self.drawOrganismBar(CONSTANTS.carnivoreList)
497                                if button.text == "Humans":
498                                    self.drawOrganismBar(CONSTANTS.omnivoreList)
499                            elif button == self.lastButtonClicked:
500                                self.lastButtonClicked = None
501                                self.removeOrganismBar()
502                        elif button.type == CONSTANTS.ORGANISM:
503                            animalList = CONSTANTS.animalList
504                            for i in range(len(animalList)):
505                                name = animalList[i][0]
506                                if name == button.text:
507                                    self.selectedOrganism = animalList[i][0]
508                                    self.selectedOrganismIndex = i
509                                    ev = CharacterSelectRequest( self.selectedOrganism, animalList[i][1])
510                                    self.lastButtonClicked = None
511                                    self.removeOrganismBar()
512                                    self.evManager.Post(ev)
513                        elif button.type == CONSTANTS.MENU:
514                            ev = RemoveSelect()
515                            self.evManager.Post(ev)
516                        button.mode = CONSTANTS.HOVER
517            self.draw()
518       
519        if isinstance(event, InfoBoxEvent):
520            self.infoname = event.name
521            self.infodescription = event.description
522            self.infodiet = event.diet
523            self.inforange = str(event.range)
524            self.infopredators = event.predators
525                       
526        if isinstance(event, CharacterSelectRequest):
527            mouse = pygame.mouse.get_pos()
528            self.moreInfoPanel(self.panelType, (mouse[0]-105)/80, 1)
529            self.setIndex = event.index
530            self.draw()
531
532        if isinstance(event, Message):
533            self.message = (event.s1, event.s2, event.s3,
534                            event.b1, event.b2)
535
536        if isinstance(event, ChangeTutorial):
537            self.tutorial = not (self.tutorial)
538            self.message = ("Add a plant to Ecoville",
539                            "It is currently summer so you need a plant that grows in this season",
540                            "You have 20 days until the seasons change",
541                            False, False)
542            pygame.display.update()
543           
544        if isinstance(event, NextTutorial):
545            if self.tutorial == True:
546                self.contTutorial()
547
548        if isinstance(event, ChangeTileEvent):
549            self.setIndex = event.index
550            self.changeTile(event.row, event.column)
551            pygame.display.update()
552
553        if isinstance(event, SeasonChangeEvent):
554            if self.season == CONSTANTS.SUMMER:
555                self.season = CONSTANTS.WINTER
556            else:
557                self.season = CONSTANTS.SUMMER
558
559        if isinstance(event, GameOver):
560            end = True
561            pygame.event.get()
562           
563            self.graphics.drawImage("endgame.png", (0,0))
564            pygame.display.update()
565            while (end):
566                for event in pygame.event.get():
567                    if (event.type == KEYDOWN and event.key == K_ESCAPE):
568                        self.evManager.Post(QuitEvent())
569                        end = false
570
571        if isinstance(event, Refresh):
572            self.draw()
573            pygame.display.update()
574
575        if isinstance(event, PanelChange):
576            if self.panelType == "mainPanel":
577                    self.panelType = event.type
578                    self.objectTileSet = self.graphics.makeObjectTileSet(self.panelType)
579                    self.draw()
580                    pygame.display.update()
581            # Handle any mouse clicks on the panel
582            # self.panelClick(event.x, event.y, event.type)     
583         
584        if isinstance(event, RemoveEvent):
585            self.level[1][14 - event.row][14 - event.column] = -1
586            self.draw()
587            pygame.display.update()
588           
589class Button:
590    def __init__(self, text, imageName, size, pos, type):
591        self.mode = CONSTANTS.NEUTRAL
592        self.text = text
593        self.pos = pos
594        self.imageName = imageName
595        self.size = size
596        self.type = type
597        imageList = []
598        for mode in CONSTANTS.buttonModes:
599            imageList.append(imageName + "_" + mode + ".png")
600        self.images = imageList       
601       
Note: See TracBrowser for help on using the browser.