import sys
import random
import os.path
+import cPickle
import level
import butaba
self.img_bulb.set_colorkey (pygame.Color (0, 255, 0))
self.img_lightning = pygame.image.load (os.path.join ("objects", "lightning.png")).convert ()
self.img_lightning.set_colorkey (pygame.Color (0, 255, 0))
-
self.img_key = pygame.image.load (os.path.join ("objects", "key.png")).convert ()
self.img_key.set_colorkey (pygame.Color (0, 255, 0))
+ self.img_key2 = pygame.image.load (os.path.join ("objects", "key2.png")).convert ()
+ self.img_key2.set_colorkey (pygame.Color (0, 255, 0))
+ self.img_chest = pygame.image.load (os.path.join ("objects", "chest.png")).convert ()
+ self.img_chest.set_colorkey (pygame.Color (0, 255, 0))
# initialize player graphics
self.img_butabafront = pygame.image.load (os.path.join ("sprite", "butaba-front.png")).convert ()
# set the status message
self.status_message = "Game started"
- self.butaba = butaba.Butaba (5,0, butaba.Butaba.RIGHT)
+ self.butaba = butaba.Butaba (5,0, butaba.Butaba.RIGHT, 75)
# set up the levels and their interactions
def setup_levels (self):
- self.level1 = level.Level (level.LEVEL_1,
- objects = [gameobjects.HealthPotion (4, 3, self.img_redpotion) ])
- self.level1e = level.Level (level.LEVEL_1E,
- objects = [ gameobjects.Key (4, 3, "a chest key", self.img_key, level.KEY_CHEST1),
- gameobjects.Key (4, 3, "a room key", self.img_key, level.KEY_ROOM1)]
+ self.level1 = level.Level (cPickle.load (file ("levels/level1.dat")))
+ self.level1w = level.Level (cPickle.load (file ("levels/level1w.dat")))
+ self.level1e = level.Level (cPickle.load (file ("levels/level1e.dat")),
+ objects = [ gameobjects.Key (5, 3, "a chest key", self.img_key2, level.KEY_CHEST1),
+ gameobjects.Key (5, 3, "a room key", self.img_key, level.KEY_ROOM1),
+ gameobjects.HealthPotion (5, 2, self.img_redpotion),
+ gameobjects.Chest (2, 5, "chest", self.img_chest, level.KEY_CHEST1, True),
+ gameobjects.GoldCoins (6, 2, self.img_goldcoins, 50)
+ ]
)
self.level1.levelright = self.level1e
+ self.level1.levelleft = self.level1w
+
self.level1e.levelleft = self.level1
+ self.level1w.levelright = self.level1
+
def main_loop (self):
# main game loop
while 1:
for event in pygame.event.get ():
if event.type == pygame.QUIT:
sys.exit (0)
+ # if keyboard event
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
self.move_butaba_up ()
self.move_butaba_left ()
elif event.key == pygame.K_RIGHT:
self.move_butaba_right ()
+ # drinking health potion in inventory
+ elif event.key == ord ("h") or event.key == ord ("H"):
+ self.inventory_drink_health_potion ()
+ # quit the game
+ elif event.key == ord ("q") or event.key == ord ("Q"):
+ sys.exit (0)
+
+ # drink a health potion if it is in the player's inventory
+ def inventory_drink_health_potion (self):
+ # if health is maxed out then ignore
+ if self.butaba.health == butaba.Butaba.MAXHEALTH:
+ self.status_message = "You already have maximum health."
+ else:
+ # look for a health potion
+ for item in self.butaba.inventory:
+ if isinstance (item, gameobjects.HealthPotion) is True:
+ self.use_object (item)
+ break
def move_butaba_up (self):
# clear any status messages
# picking up an object
def pickup_object (self, obj):
- # only if object can be picked up, pick it up
+ # only if object can be picked up, pick it up or use it
if obj.can_pickup is True:
- ans = utility.ask_question (self.screen, "Found %s." % obj.text, ["Carry", "Ignore"], self.img_menu)
- # if the answer is "take"
+ ans = utility.ask_question (self.screen, "Found %s." % obj.text, ["Pick up", "Use", "Ignore"], self.img_menu)
+ # if the answer is "carry"
if ans == 1:
# check if the inventory is full
if len (self.butaba.inventory) >= butaba.Butaba.MAXITEMS:
self.currentlevel.objects.remove (obj)
self.status_message = "You picked up %s" % obj.text
-
+ elif ans == 2:
+ # use the object according to its type
+ self.use_object (obj)
+ # if it cannot be picked up, try to use it anyway
+ else:
+ self.use_object (obj)
+
+ # this method uses the object first by calling the object use () method
+ # and then performing specific actions as necessary
+ def use_object (self, obj):
+ # if the object is a health potion
+ if isinstance (obj, gameobjects.HealthPotion) is True:
+ obj.use (self.butaba)
+ if obj in self.currentlevel.objects:
+ self.currentlevel.objects.remove (obj)
+ elif obj in self.butaba.inventory:
+ self.butaba.inventory.remove (obj)
+ self.status_message = "You gained health"
+ # if the object is a chest
+ elif isinstance (obj, gameobjects.Chest) is True:
+ # if chest is locked, try to open it
+ if obj.locked is True:
+ # try opening the chest with every item 9the use () function
+ # of the chest determines if item is a key anyway
+ fittedkey = None
+ for invobj in self.butaba.inventory:
+ fittedkey = obj.use (invobj)
+ # if a key fits
+ if fittedkey is not None:
+ break
+ # if no key found
+ if fittedkey is None:
+ self.status_message = "No key found to open %s" % obj.text
+ # chest successfully unlocked
+ else:
+ self.status_message = "You unlocked the %s" % obj.text
+ # remove the key from inventory
+ self.butaba.inventory.remove (fittedkey)
+ # display the contents of the chest
+ else:
+ pass
+ # if the object is gold coins
+ elif isinstance (obj, gameobjects.GoldCoins) is True:
+ obj.use (self.butaba)
+ self.status_message = "You picked up %d gold." % obj.value
+ # remove the gold coins after adding it to Butaba's gold
+ if obj in self.currentlevel.objects:
+ self.currentlevel.objects.remove (obj)
+ elif obj in self.butaba.inventory:
+ self.butaba.inventory.remove (obj)
def move_butaba_left (self):
# clear any status messages
# Draw the status infodisplay
def draw_status (self):
self.screen.blit (self.img_redpotion, (485, 10))
- utility.put_text (self.screen, 550, 25, 24, (255, 0, 0), "%d" % self.butaba.health)
+ utility.put_text (self.screen, 550, 25, 20, (255, 0, 0), "%d" % self.butaba.health)
self.screen.blit (self.img_lightning, (620, 10))
- utility.put_text (self.screen, 660, 20, 24, (255,255,255), "%d" % self.butaba.strength)
+ utility.put_text (self.screen, 660, 25, 20, (255,255,255), "%d" % self.butaba.strength)
self.screen.blit (self.img_wand, (485, 65))
- utility.put_text (self.screen, 550, 75, 24, (0, 0, 255), "%d" % self.butaba.magic)
+ utility.put_text (self.screen, 550, 75, 20, (0, 0, 255), "%d" % self.butaba.magic)
self.screen.blit (self.img_bulb, (620, 65))
- utility.put_text (self.screen, 660, 75, 24, (0, 255, 0), "%d" % self.butaba.experience)
+ utility.put_text (self.screen, 660, 75, 20, (0, 255, 0), "%d" % self.butaba.experience)
self.screen.blit (self.img_goldcoins, (485, 110))
- utility.put_text (self.screen, 550, 130, 24, (255, 255, 0), "%d" % self.butaba.gold)
+ utility.put_text (self.screen, 550, 130, 20, (255, 255, 0), "%d" % self.butaba.gold)
if self.status_message is not None:
- utility.put_text (self.screen, 10, 485, 18, (255,255, 0), "%s" % self.status_message)
+ utility.put_text (self.screen, 10, 485, 16, (255,255, 0), "%s" % self.status_message)
# display the inventory of the player
def draw_inventory (self):
# draw the inventory slots
r = 1
c = 1
- utility.put_text (self.screen, 490, 170, 22, (255,255 , 0), "Inventory")
+ utility.put_text (self.screen, 490, 170, 16, (255,255 , 0), "Inventory")
for i in range (butaba.Butaba.MAXITEMS):
self.screen.blit (self.img_inventory, (440+c*54, 150+r*54))
if c % 4 == 0: