def create_l_g(renderer,sprite_layers,screen,c_pos): #loading, creating sprite and rendering of the base image i.e no image -> plain image lg=person.create_menu_bg(c_pos[0]-504,c_pos[1]-390,'./images/level_gold_1.png') sprite_layers[2].add_sprite(lg) shifty1.render_update(renderer,sprite_layers,screen) return lg
def create_f_i(renderer, sprite_layers, screen, c_pos): f_i = person.create_menu_bg(c_pos[0] + 500, c_pos[1] + 350, './images/interface_fight_1.png') sprite_layers[2].add_sprite(f_i) shifty1.render_update(renderer, sprite_layers, screen) return f_i
def create_s_a(renderer, sprite_layers, screen, c_pos): s_a = person.create_menu_bg(c_pos[0] + 500, c_pos[1] + 350, './images/spec_arrow_interf_1.png') sprite_layers[2].add_sprite(s_a) shifty1.render_update(renderer, sprite_layers, screen) return s_a
def save_menu(c_pos): imgtx = Image.open('./images/paper.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf",60) draw.text((30,70),'Game Saved',(0,0,0),font=font) imgtx.save('./images/savedm.png') saved=person.create_menu_bg(c_pos[0],c_pos[1]-768/2+250,'./images/savedm.png') return saved
def create_l_g(renderer, sprite_layers, screen, c_pos): #loading, creating sprite and rendering of the base image i.e no image -> plain image lg = person.create_menu_bg(c_pos[0] - 504, c_pos[1] - 390, './images/level_gold_1.png') sprite_layers[2].add_sprite(lg) shifty1.render_update(renderer, sprite_layers, screen) return lg
def save_menu(c_pos): imgtx = Image.open('./images/paper.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf", 60) draw.text((30, 70), 'Game Saved', (0, 0, 0), font=font) imgtx.save('./images/savedm.png') saved = person.create_menu_bg(c_pos[0], c_pos[1] - 768 / 2 + 250, './images/savedm.png') return saved
def create_menu_inventory(c_pos): sv = pk.load(open("./save.p", "rb")) #loading the base image imgtx = Image.open('./images/paper1.png') draw = ImageDraw.Draw(imgtx) #determining the font font1 = ImageFont.truetype("./PAPYRUS.ttf", 40) font = ImageFont.truetype("./PAPYRUS.ttf", 30) inv_len = len(sv['misc']) #if nothing in inventory if inv_len == 0: #writing on the base image draw.text((200, 60), 'You dont have anything', (0, 0, 0), font=font1) draw.text((240, 90), 'in your Inventory', (0, 0, 0), font=font1) else: #cost and name stored in different lists inven = sv['misc'] inven_item = [] inven_cost = [] inven_str = [] draw.text((300, 20), 'Inventory', (0, 0, 0), font=font1) for i in range(0, inv_len, 2): inven_item.append(inven[i]) inven_cost.append(inven[i + 1]) for i in range(0, inv_len / 2): inven_list = inven_item[i] + ' ' + str(inven_cost[i]) inven_str.append(inven_list) #snippet for printing inventory in two columns if there are many things for j in range(100, 420, 50): if (len(inven_str)) != 0: draw.text((100, j), inven_str[0], (0, 0, 0), font=font) inven_str.pop(0) else: break for j in range(100, 420, 50): if (len(inven_str)) != 0: draw.text((500, j), inven_str[0], (0, 0, 0), font=font) inven_str.pop(0) else: break #saving the new image (image with text) as a temporary image imgtx.save('./images/inventory.png') inven_sprite = person.create_menu_bg(c_pos[0], c_pos[1] - 200, './images/inventory.png') return inven_sprite
def create_menu_inventory(c_pos): sv=pk.load(open("./save.p","rb")) #loading the base image imgtx = Image.open('./images/paper1.png') draw = ImageDraw.Draw(imgtx) #determining the font font1 = ImageFont.truetype("./PAPYRUS.ttf",40) font = ImageFont.truetype("./PAPYRUS.ttf",30) inv_len=len(sv['misc']) #if nothing in inventory if inv_len==0: #writing on the base image draw.text((200,60),'You dont have anything',(0,0,0),font=font1) draw.text((240,90),'in your Inventory',(0,0,0),font=font1) else: #cost and name stored in different lists inven=sv['misc'] inven_item=[] inven_cost=[] inven_str=[] draw.text((300,20),'Inventory',(0,0,0),font=font1) for i in range(0,inv_len,2): inven_item.append(inven[i]) inven_cost.append(inven[i+1]) for i in range(0,inv_len/2): inven_list=inven_item[i]+' '+str(inven_cost[i]) inven_str.append(inven_list) #snippet for printing inventory in two columns if there are many things for j in range(100,420,50): if (len(inven_str))!=0: draw.text((100,j),inven_str[0],(0,0,0),font=font) inven_str.pop(0) else: break for j in range(100,420,50): if (len(inven_str))!=0: draw.text((500,j),inven_str[0],(0,0,0),font=font) inven_str.pop(0) else: break #saving the new image (image with text) as a temporary image imgtx.save('./images/inventory.png') inven_sprite=person.create_menu_bg(c_pos[0],c_pos[1]-200,'./images/inventory.png') return inven_sprite
def demo_pygame(file_name, frm): ##FILE NAME GIVES THE CURRENT MAP if (file_name == './maps/tunnel3.tmx'): tunnel3.main() elif (file_name == './maps/tunnel.tmx'): goodtunnel.main() elif (file_name == './maps/mountainclimbing.tmx'): climb_mountain.main() elif (file_name == './maps/maze.tmx'): maze_code.main() elif (file_name == './maps/maze2.tmx'): maze_code2.main() elif (file_name == './maps/hotel.tmx'): hotel.main() elif (file_name == './maps/tunnel2_4.tmx'): tunnel2_4.main(frm) elif (file_name == './maps/palace.tmx'): pal_lava.main() elif (file_name == './maps/palace_final.tmx'): palace.main() # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode( file_name) # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() #loading the main dictionary into "savegame" #pk.dump(savegame,open("./save.p","wb")) -> donates dumping/saving the updated #dictionaty "savegame" to the "save.p" file so that can be used again with the updated values savegame = pk.load(open("./save.p", "rb")) ##Creating hero #getting the entry position depending on the map starting = entry(file_name, frm) hero_pos_x = starting[0] hero_pos_y = starting[1] #creating the hero sprite hero = person.create_person(hero_pos_x, hero_pos_y, './images/hero_d2.png') ##Creating villagers #villager count is 0 if no villager on the current map vcount = 0 #defining the villager directions muv = 'up' mdv = 'down' mrv = 'right' mlv = 'left' #no direction -> not moving no = '' #creating the villager sprites #villagers created according to map vil = person.create_villager(file_name) vcount = len(vil) ##Giving initial random direction to every villager #initializing the variable drc = no #the villager direction list drctn = [] #using randint to decide direction for i in range(0, vcount): a = random.randint(1, 10) if (a == 1): drc = muv elif (a == 2): drc = mrv elif (a == 3): drc = mdv elif (a == 4): drc = mlv elif (a <= 10): drc = no drctn.append(drc) # cam_offset is for scrolling cam_world_pos_x = hero.rect.centerx cam_world_pos_y = hero.rect.centery # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [ layer for layer in sprite_layers if not layer.is_object_group ] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[1].add_sprite(hero) ##Adding the villager sprites i = 0 for i in range(0, vcount): sprite_layers[1].add_sprite(vil[i]['sprte']) ##Misc object sprites #creating the sprite misc = person.create_misc(file_name) #adding the sprites if misc != None: mcount = len(misc) i = 0 while (i >= 0 and i < mcount): ##check if any misc is already taken if (savegame[misc[i]['name']] == 0): sprite_layers[1].add_sprite(misc[i]['sprte']) i += 1 else: misc.pop(i) mcount = len(misc) # variables for the main loop clock = pygame.time.Clock() running = True speed = 4 ##Sign board for the tunnel riddle portal_board = None if (file_name == './maps/village1.tmx'): portal_board = pygame.Rect(81 * 32, 9 * 32, 40, 80) signboard = person.create_person(81 * 32, 9 * 32, './images/signboard.png') sprite_layers[2].add_sprite(signboard) ##The variables for changing the movement pictures -> to give animation to movement mr = ml = md = mu = 0 vmr = vml = vmd = vmu = 0 # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) #Creating portals -> For map changing portals = person.create_portal(file_name) #Creating the shopping portal shop_portal = person.create_shop_portal(file_name) #Variable for the quests/tasks/side missions villager_job = 0 #To check if ship is on the shore in "Ship.tmx" map (pirate ship) ship_present = 0 #Initial value of portal -> if True -> map changes portal = False #check for the river sound in Burning village map -> heard only if close to river flag_crossed = 0 #This is check for talking to villager -> talks to villager-> shows the first dialog box-> if 1 count = 0 ###FOR INTERFACE #initiaizing variables from savegame hp = savegame['hp'] hp_max = savegame['max_hp'] #camera postion stored in c_pos c_pos = camra.camera(file_name, renderer, hero) #variable for turning the interface on and off interf_toggle = 0 #creating the background for health bar, xp bar interface = menu.create_interface(renderer, sprite_layers, screen, c_pos) #creating the health bar sprite and creating the bar hp_sprite = person.create_person(c_pos[0], c_pos[1], './images/hp_bar.png') [hp_sprite, hp] = menu.create_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos) #creating the xp bar sprite and creating the bar xp_sprite = person.create_person(c_pos[0], c_pos[1], './images/exp_bar.png') xp_sprite = menu.create_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos) #creating the level and gold sprite l_g = menu.create_l_g(renderer, sprite_layers, screen, c_pos) #creating the weapons interface background and values f_i = menu.create_f_i(renderer, sprite_layers, screen, c_pos) interf_fight = menu.create_interface_fight(renderer, sprite_layers, screen, c_pos) ##Aditional background music that turns onn and off add = None #Creating the main background music musicbg = sound.create_music(file_name) #Creating the additional full time running background music if file_name == './maps/village2_out1.tmx': music_add = sound.create_music_add('./sounds/vil2add.ogg') #--------------------------------------- """MAIN GAME LOOP""" while running: #fixing the FPS dt = clock.tick(50) ##Checking for map exit -> -1 no change -> !=-1 Specific portal number change_map = exit_map(hero, portals) if change_map != -1: portal = True #Giving the nextmap's name and frm -> "frm"-> tells if the player came from which map # -> to give the respective starting position nextlevel = next_map(file_name, change_map) ##Giving the warning messages wherever needed #In Ship map -> warning for not enough gold if (file_name == './maps/ship.tmx' and (savegame['pirate'] == 0 or savegame['pirate_map'] == 1)): portal = False warning = menu.warning_msg(file_name, renderer, sprite_layers, screen, c_pos, 1) ##Infinite loop until menu is to be removed i = 0 while (i != 1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i = 1 continue sprite_layers[2].remove_sprite(warning) hero_pos_x -= 10 #In burning village map -> "Something is missing" if player do not have a melee weapon elif (file_name == './maps/village1.tmx' and savegame['dagger'] == 0): portal = False warning = menu.warning_msg(file_name, renderer, sprite_layers, screen, c_pos, 0) ##Infinite loop until menu is to be removed i = 0 while (i != 1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i = 1 continue sprite_layers[2].remove_sprite(warning) hero_pos_y += 10 #In village2 inside -> "Something is missing" if no melee weapon or not talked to the spooky guy elif (file_name == './maps/village2_inside.tmx' and (savegame['eqp_weapon'] == None or savegame['spook'] == 0) and (change_map == 1 or change_map == 2)): portal = False warning = menu.warning_msg(file_name, renderer, sprite_layers, screen, c_pos, 0) ##Infinite loop until menu is to be removed i = 0 while (i != 1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i = 1 continue sprite_layers[2].remove_sprite(warning) hero_pos_y += 10 #Quit the while loop if portal is true if portal == True: running = False ##loading the main dictionary into "savegame" savegame = pk.load(open("./save.p", "rb")) #Getting the current camera position c_pos = camra.camera(file_name, renderer, hero) ##IN Ship map to move the ship when hreo reaches a certain point if (file_name == './maps/ship.tmx' and hero_pos_x > 14 * 32 and ship_present == 0): #Creating the addtional bg music (which continues once started) music_add = sound.create_music_add('./sounds/pirate.ogg') music_add.set_volume(0.7) ship_moving = True #Creating the Ship sprite and adding it ship = person.create_person(9 * 32, 29 * 32, './images/ship.png') sprite_layers[1].add_sprite(ship) #while function for the ship moving while (ship_moving): #moving the ship ship.rect.top -= 1 #rendering the screen to keep the screen updated render_update(renderer, sprite_layers, screen) #Stopping the ship if (ship.rect.top < 7 * 32): #Ship reached the shore ship_present = 1 i = 0 while (i != 30): i = i + 1 continue #changing to second image ship.image = pygame.image.load('./images/ship2.png') render_update(renderer, sprite_layers, screen) ##adding some delay to ship image change while (i != 60): i = i + 1 continue #changing to third image and ship.image = pygame.image.load('./images/ship3.png') ship.rect.top = 4 * 32 ship.rect.right += 32 #Coming out of while loop ship_moving = False #Creating the Captian as villger in the format in which other villagers are added in person file vil=[{'sprte':person.create_person(5*32,5*32-16,'./images/cappy.png'),\ 'toplx':None,'toply':None,'w':None,'h':None}] #adding the Captian sprite_layers[1].add_sprite(vil[0]['sprte']) ##MOVING THE HERO mov = movements.hero_move(mr, ml, md, mu, hero_pos_x, hero_pos_y, hero, speed, sprite_layers, vil, misc) #The variables for the animation images returned from the movement fucntion #Then the same variables are passed again to keep the animation smoother mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] #position variables -> called and passed again hero_pos_x = mov[4] hero_pos_y = mov[5] #hypothetical rectagle -> where the hero will move next? #used to check collision against villagers hero_hypo = mov[7] #Additional bg music (on/off) if (file_name == './maps/village1.tmx' and hero_pos_y <= 28 * 32 and flag_crossed == 0): add = sound.create_music_add('./sounds/river.ogg') ##to check wether first time crossed or other flag_crossed = 1 elif (file_name == './maps/village1.tmx' and hero_pos_y >= 28 * 32 and flag_crossed == 1): sound.stop_soundfx(add) flag_crossed = 0 ##Moving the villager if there is one if (vil != None): ##Moving the villager -> the function gives the old direction in which the villagers were ##travelling. In every loop they take one step drctn = movements.move_villager(drctn, speed, vil, hero_hypo, vmu, vmr, vmd, vml, file_name) ##Gives the index of colliding vilager coll = movements.colliding_other_living(vil, hero_hypo) #Checking if there is any misc elif (misc != None): collm = movements.colliding_other_living(misc, hero_hypo) #Moving the interface with camera interface.rect.topleft = (c_pos[0] - 512, c_pos[1] - 384) hp_sprite.rect.topleft = (c_pos[0] - 400, c_pos[1] - 382) xp_sprite.rect.topleft = (c_pos[0] - 400, c_pos[1] - 345) l_g.rect.topleft = (c_pos[0] - 508, c_pos[1] - 381) f_i.rect.bottomright = (c_pos[0] + 500, c_pos[1] + 350) interf_fight.rect.bottomright = (c_pos[0] + 512, c_pos[1] + 384) #-------------------------- EVENT HANDLING --------------------------------- for event in pygame.event.get(): #Updating the interface whenever an event happens menu.update_lg(l_g, c_pos) menu.update_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos, 0) menu.update_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos, 0) menu.update_f_i(f_i, c_pos) #For Key pressed event if event.type == pygame.KEYDOWN: x = event.key if (x == pygame.K_ESCAPE): pygame.quit() #Saving the game elif (x == pygame.K_s): #saving the present file name savegame['last_map'] = file_name #saving the present frm-> where to put the hero when game loaded savegame['last_frm'] = frm #to allow the load game function to work savegame['save'] = 1 pk.dump(savegame, open("./save.p", "wb")) sv = menu.save_menu(c_pos) sound.create_soundfx('./sounds/savegame.ogg') sprite_layers[2].add_sprite(sv) render_update(renderer, sprite_layers, screen) menu.exit_menu(x) sprite_layers[2].remove_sprite(sv) #Printing the dictionary elif (x == pygame.K_q): print savegame #Starting the shopping interface elif (x == pygame.K_SPACE and shop_portal != None and pygame.Rect.colliderect(hero.rect, shop_portal)): shop(c_pos, renderer, sprite_layers, screen, l_g) #Showing the tunnel riddle elif (x == pygame.K_SPACE and portal_board != None and pygame.Rect.colliderect(hero.rect, portal_board)): riddle = person.create_person( hero.rect.centerx, hero.rect.centery + 200, './images/tunnel_riddle.png') sprite_layers[2].add_sprite(riddle) (renderer, sprite_layers, screen) = render_update(renderer, sprite_layers, screen) ##Infinite loop until menu is to be removed i = 0 while (i != 1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i = 1 continue sprite_layers[2].remove_sprite(riddle) ##Showing the Travel option of the ship elif (file_name == './maps/ship.tmx' and ship_present == 1 and x == pygame.K_SPACE and collision.checkCollision(hero, ship)): #creating the menu imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((260, 70), 'Are you sure you want to travel?', (0, 0, 0), font=font) draw.text((260, 110), '(Y)es (N)o', (0, 0, 0), font=font) imgtx.save('./images/ship_conf.png') ship_conf = person.create_menu_bg( c_pos[0], c_pos[1] - 768 / 2, './images/ship_conf.png') sprite_layers[2].add_sprite(ship_conf) render_update(renderer, sprite_layers, screen) ##Infinite loop until menu is to be removed result = 'x' while (result == 'x'): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x = event.key if (x == pygame.K_y): result = 'y' else: result = 'n' break sprite_layers[2].remove_sprite(ship_conf) render_update(renderer, sprite_layers, screen) #Checking the conditions if pressed 'y' -> want to travel if (result == 'y'): #condition for job done and then gold does not matter if (savegame['talk_vil']['./maps/ship.tmx'][0] == 1): pirate_mapchange = 1 running = False #condition for job not done but have gold elif (savegame['gold'] >= 50): savegame['gold'] -= 50 pk.dump(savegame, open("./save.p", "wb")) pirate_mapchange = 1 running = False #condition for job not done and not enough gold elif (savegame['gold'] < 50 and savegame['pirate_map'] == 0): menu.warning_msg(file_name, renderer, sprite_layers, screen, c_pos, 0) break #Key pressed near a collectable object elif (x == pygame.K_SPACE and misc != None): i = 0 l = len(misc) while (i >= 0 and i < l): if pygame.Rect.colliderect(hero.rect, misc[i]['sprte'].rect): savegame['misc'].append(misc[i]['name']) savegame['misc'].append(misc[i]['value']) savegame[misc[i]['name']] = 1 pk.dump(savegame, open("./save.p", "wb")) sprite_layers[1].remove_sprite(misc[i]['sprte']) misc.pop(i) else: i += 1 l = len(misc) #toggling the interface off elif (x == pygame.K_f and interf_toggle == 0): sprite_layers[2].remove_sprite(hp_sprite) sprite_layers[2].remove_sprite(xp_sprite) sprite_layers[1].remove_sprite(interface) sprite_layers[2].remove_sprite(l_g) sprite_layers[1].remove_sprite(interf_fight) sprite_layers[2].remove_sprite(f_i) interf_toggle = 1 #toggling the interface on elif (x == pygame.K_f and interf_toggle == 1): sprite_layers[2].add_sprite(hp_sprite) sprite_layers[2].add_sprite(xp_sprite) sprite_layers[1].add_sprite(interface) sprite_layers[2].add_sprite(l_g) sprite_layers[1].add_sprite(interf_fight) sprite_layers[2].add_sprite(f_i) interf_toggle = 0 ##Making the Inventory elif (x == pygame.K_i): sound.create_soundfx('./sounds/inventory.ogg') inven = menu.create_menu_inventory(c_pos) sprite_layers[2].add_sprite(inven) render_update(renderer, sprite_layers, screen) ##Infinite loop until inventory is to be removed while (x != pygame.K_SPACE): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x = event.key continue sprite_layers[2].remove_sprite(inven) render_update(renderer, sprite_layers, screen) #------------------TALKING TO VILLAGER------------------ #Give the required values for showing the talk to villager number 'coll' (line 394) if (vil != None): talk_result = talk.iftalk( coll, x, vil, count, hero_pos_x, hero_pos_y, file_name) ##Gives : count(for checking if talking) ##coll (which villager he's talking to) ##talktime(talking again or not) #if no villager colliding else: talk_result = None #talk_result[0] -> count --- shows the talking interface only if count is 1-> talking to someone #count remains 0 as called before mainloop if (talk_result[0] == 1): ##gives back the text for respective villager menutext = menu.create_menu_vil(coll, file_name, talk_result[2]) ##variable to check for for how many number of times the loop should work dialog_show = 0 sound.create_soundfx('./sounds/talk.ogg') ##gives the name of the created image txtim = person.create_text_img('./images/textbox.png', menutext, dialog_show) ##gives the sprite for the menu image menu_ui = person.create_menu_bg(c_pos[0], c_pos[1] - 768 / 2, txtim) sprite_layers[2].add_sprite(menu_ui) render_update(renderer, sprite_layers, screen) #the loop for showing text box (again and again) while (dialog_show < len(menutext)): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x = event.key #for the villagers that have Yes/No option if (dialog_show == len(menutext) - 1): if x == pygame.K_y: if (file_name == './maps/village1.tmx' and coll == 1 and savegame['b_h_vil'] == 0): #sound created as this 'add' variable is closing when going out of village1 #main reason -> prevent error add = sound.create_music_add( './sounds/river.ogg') savegame['b_h_vil'] = 1 villager_job = 1 running = False sprite_layers[2].remove_sprite( menu_ui) dialog_show += 1 elif (file_name == './maps/village2_out1.tmx' and coll == 0 and savegame['f_vil'] == 0): savegame['f_vil'] = 1 villager_job = 2 running = False sprite_layers[2].remove_sprite( menu_ui) dialog_show += 1 elif (file_name == './maps/village2_inside.tmx' and coll == 2 and savegame['spook'] == 0): savegame['spook'] = 1 villager_job = 3 running = False sprite_layers[2].remove_sprite( menu_ui) dialog_show += 1 elif x == pygame.K_n: sprite_layers[2].remove_sprite(menu_ui) dialog_show += 1 #all other villagers if (x == pygame.K_SPACE): ##remove the prev text image sprite_layers[2].remove_sprite(menu_ui) ##indicates for the next one dialog_show += 1 ##for not going in the loop again if dialog_show == len(menutext): break ##if any other key pressed elif (x != pygame.K_SPACE): continue ##for not going in the loop again elif dialog_show == len(menutext): break sound.create_soundfx('./sounds/talk.ogg') #next text image created and its sprite created and added txtim=person.create_text_img('./images/textbox.png',menutext, \ dialog_show) menu_ui=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,\ txtim) sprite_layers[2].add_sprite(menu_ui) render_update(renderer, sprite_layers, screen) if x == pygame.K_SPACE: ##an infite loop till 'x' is pressed menu.exit_menu(x) sprite_layers[2].remove_sprite(menu_ui) #--------------------TALKING ENDS------------------- #----------------------------- EVENT HANDLING ENDED ---------------------------- # adjust camera according to the hero's position, follow him # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() """------------------------------------- OUT OF MAIN GAME LOOP----------------------------------""" #stopping the additional background music if (file_name == './maps/village2_out1.tmx' or file_name == './maps/ship.tmx'): music_add.stop() #stopping the fluctuating bg music #'add' created (in line 585) to prevent error in this snippet if (file_name == './maps/village1.tmx'): sound.stop_soundfx(add) musicbg.stop() #If portal was the reason for stopping the game loop if portal == True: #name of next map and respective frm mp = nextlevel[0] frm = nextlevel[1] #calling the map demo_pygame(mp, frm) #If main loop ended because of a side task if villager_job == 1: knifehouse1.main() elif villager_job == 2: fish.main() elif villager_job == 3: spooky.main() #when pressed 'yes' to the ship travel if pirate_mapchange == 1: demo_pygame('./maps/village2_out1.tmx', 0)
def shop(c_pos, renderer, sprite_layers, screen, l_g): #variables for two while loops shopping = True inner = True sv = pk.load(open("./save.p", "rb")) #costs of three swords costs1 = 100 costs2 = 200 costs3 = 300 #cost of one arrow costa = 5 #cost of two armors costa1 = 100 costa2 = 150 #if discount is applicable if (sv['f_vil'] == 1): costs1 -= 30 costs2 -= 50 costs3 -= 70 costa1 -= 30 costa2 -= 50 #list for number keys numkey=[pygame.K_1,pygame.K_2,pygame.K_3,pygame.K_4,pygame.K_5,pygame.K_6\ ,pygame.K_7,pygame.K_8] #main shopping loop while shopping: ##Base image for upper and lower menu is same #Creating tne upper message using the base image imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((270, 70), 'Welcome!!!', (0, 0, 0), font=font) imgtx.save('./images/shop1.png') ## the above menu box shop_menu1 = person.create_menu_bg(c_pos[0], c_pos[1] - 768 / 2, './images/shop1.png') imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((270, 20), 'What do you want to do?', (0, 0, 0), font=font) draw.text((350, 60), '(B)uy', (0, 0, 0), font=font) draw.text((350, 100), '(S)ell', (0, 0, 0), font=font) draw.text((350, 140), '(L)eave', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') ##lower menu box shop_menu2 = person.create_menu_bg(c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'm' ##states -> tell in which menu the player currently is #helps to navigate to next menu -> eg. "2" can be option on many menus leading to different ones while inner: #storing the gold, dagger, arrow count, and armor gold = sv['gold'] sword_have = sv['dagger'] arrow_c = sv['arrow_count'] armr_hav = sv['sheild_first'] ##-------------------------Shopping start------------------- for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x = event.key ##MAIN ---> BUY if (x == pygame.K_b and state == 'm'): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((270, 20), 'What do you want to buy?', (0, 0, 0), font=font) draw.text((350, 60), 'Swords (1) Armor(4)', (0, 0, 0), font=font) draw.text((350, 100), 'Arrow (2) Bac(k)', (0, 0, 0), font=font) draw.text((350, 140), 'Repair Armor (3)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') #state changed to b-> buy menu state = 'b' ##MAIN -> LEAVE elif (x == pygame.K_l and state == 'm'): shopping = False inner = False ##BACK TO -> MAIN -- FROM ALL elif(x==pygame.K_k and (state=='b' or state=='s' or state=='a' or state=='r1' \ or state=='r2' or state=='r3' or state=='r4' or state=='arm' or\ state=='conf' or state=='sl' or state=='ss' or state=='inv')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((270, 20), 'What do you want to do?', (0, 0, 0), font=font) draw.text((350, 60), '(B)uy', (0, 0, 0), font=font) draw.text((350, 100), '(S)ell', (0, 0, 0), font=font) draw.text((350, 140), '(L)eave', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'm' ##BUY -> SWORDS elif (x == pygame.K_1 and (state == 'b')): sprite_layers[2].remove_sprite(shop_menu2) #print 'back' imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) swrd1 = 'Longsword (1) ' + str(costs1) swrd2 = 'Two-Edged sword (2) ' + str(costs2) swrd3 = 'Katana (3) ' + str(costs3) draw.text((350, 20), swrd1, (0, 0, 0), font=font) draw.text((350, 60), swrd2, (0, 0, 0), font=font) draw.text((350, 100), swrd3, (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 's' ##BUY -> ARMOR elif (x == pygame.K_4 and (state == 'b')): sprite_layers[2].remove_sprite(shop_menu2) #print 'back' imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) armr1 = 'Leather(1) ' + str(costa1) armr2 = 'Chainmail (2) ' + str(costa2) draw.text((350, 20), armr1, (0, 0, 0), font=font) draw.text((350, 60), armr2, (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'arm' #ARMOR -> BUYING ARMOR 1 elif (x == pygame.K_1 and (state == 'arm')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) #if able to buy if (gold >= costa1): #Check that player can always buy/keep a sword if (gold - costa1 < 100 and sword_have == 0): draw.text( (350, 60), 'If you Buy this you cannot buy a sword', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') else: draw.text((350, 20), 'You bought Leather armor', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') #if armor bought -> gold decrease, shield yes, its max hp, and total hp updated sv['gold'] = gold - costa1 sv['sheild_first'] = 1 sv['sheild_maxhp'] = 60 sv['sheild_hp'] = 60 sv['eqp_armour'] = 'lth' pk.dump(sv, open("./save.p", "wb")) #insufficient gold else: draw.text((350, 20), 'You Dont have enough gold', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'conf' #ARMOR -> BUYING ARMOR 2 elif (x == pygame.K_2 and (state == 'arm')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) if armr_hav == 1: draw.text((350, 20), 'You already have an armor...', (0, 0, 0), font=font) draw.text((350, 60), 'First you must sell it', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') elif (gold >= costa2): #Check that player can always buy/keep a sword if (gold - costa2 < 100 and sword_have == 0): draw.text( (350, 60), 'If you Buy this you cannot buy a sword', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') else: draw.text((350, 20), 'You bought Chainmail', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') sv['gold'] = gold - costa2 sv['sheild_first'] = 1 sv['sheild_maxhp'] = 70 sv['sheild_hp'] = 70 sv['eqp_armour'] = 'chn' pk.dump(sv, open("./images/save.p", "wb")) else: draw.text((350, 20), 'You Dont have enough gold', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'conf' #SWORDS -> BUYING SWORD 1 #same as buying an armor elif (x == pygame.K_1 and (state == 's')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) if sword_have == 1: draw.text((350, 20), 'You already have a sword...', (0, 0, 0), font=font) draw.text((350, 60), 'First you must sell it', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') elif (gold >= costs1): draw.text((350, 20), 'You bought Longsword', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') sv['gold'] = gold - costs1 sv['dagger'] = 1 #every melee weapon have different damage -> need to update which weapon sv['eqp_weapon'] = 'sw1' pk.dump(sv, open("./save.p", "wb")) else: draw.text((350, 20), 'You Dont have enough gold', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'conf' #SWORDS -> BUYING SWORD 2 elif (x == pygame.K_2 and (state == 's')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) if sword_have == 1: draw.text((350, 20), 'You already have a sword...', (0, 0, 0), font=font) draw.text((350, 60), 'First you must sell it', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') elif (gold >= costs2): sv['gold'] = gold - costs2 sv['dagger'] = 1 sv['eqp_weapon'] = 'sw2' pk.dump(sv, open("./save.p", "wb")) draw.text((350, 20), 'You bought Two-Edged Sword', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') else: draw.text((350, 20), 'You Dont have enough gold', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'conf' #SWORDS -> BUYING SWORD 3 elif (x == pygame.K_3 and (state == 's')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) if sword_have == 1: draw.text((350, 20), 'You already have a sword...', (0, 0, 0), font=font) draw.text((350, 60), 'First you must sell it', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') elif (gold >= costs3): draw.text((350, 20), 'You bought Katana', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') sv['gold'] = gold - costs3 sv['dagger'] = 1 sv['eqp_weapon'] = 'sw3' pk.dump(sv, open("./save.p", "wb")) else: draw.text((350, 20), 'You Dont have enough gold', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'conf' #ARROWS -> BUYING ARROWS 1 #same as armor and swords elif (x == pygame.K_1 and (state == 'a')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) if (gold >= costa): #Check that player can always buy/keep a sword if (gold - costa < 100 and sword_have == 0): draw.text( (350, 60), 'If you buy this you cannot buy a sword', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') else: draw.text((350, 20), 'You bought one arrow', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') sv['gold'] = gold - costa sv['arrow_count'] += 1 pk.dump(sv, open("./save.p", "wb")) else: draw.text((350, 20), 'You Dont have enough gold', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'conf' #ARROWS -> BUYING ARROWS 2 (10 arrows at price of 8) elif (x == pygame.K_2 and (state == 'a')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) if (gold >= costa * 8): #Check that player can always buy/keep a sword if ((gold - (costa * 8)) < 100 and sword_have == 0): draw.text( (350, 60), 'If you Buy this you cannot buy a sword', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') else: draw.text((350, 20), 'You bought a big arrow pock', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') sv['gold'] = gold - (costa * 8) sv['arrow_count'] += 10 pk.dump(sv, open("./save.p", "wb")) else: draw.text((350, 20), 'You Dont have enough gold', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'conf' #ARROWS -> BUYING ARROWS 3 (20 arrows at price of 18) elif (x == pygame.K_3 and (state == 'a')): sprite_layers[2].remove_sprite(shop_menu2) #print 'back' imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) if (gold >= costa * 18): #Check that player can always buy/keep a sword if ((gold - (costa * 18)) < 100 and sword_have == 0): draw.text( (350, 60), 'If you Buy this you cannot buy a sword', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') else: draw.text((350, 20), 'You bought a huge arrow pack', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') sv['gold'] = gold - (costa * 18) sv['arrow_count'] += 20 pk.dump(sv, open("./save.p", "wb")) else: draw.text((350, 20), 'You Dont have enough gold', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'conf' #BUY -> ARROWS elif (x == pygame.K_2 and (state == 'b')): sprite_layers[2].remove_sprite(shop_menu2) #print 'back' imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((350, 20), 'Buy arrow (1) 5 Gold', (0, 0, 0), font=font) draw.text((350, 60), 'Buy 10 arrows (2) 40 Gold', (0, 0, 0), font=font) draw.text((350, 100), 'Buy 20 arrows (3) 90 Gold', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'a' #BUY TO REPAIR ARMOR (condition -> armor health ful ) elif(x==pygame.K_3 and (state=='b') and sv['sheild_first']==1\ and sv['sheild_hp']==sv['sheild_maxhp']): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((350, 20), 'Your armor is already at full health', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'r1' #BUY TO REPAIR ARMOR (condition -> armor health not full) elif(x==pygame.K_3 and (state=='b') and sv['sheild_first']==1\ and sv['sheild_hp']<['sheild_maxhp']): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((350, 20), '(R)epair armor 30 Gold', (0, 0, 0), font=font) draw.text((350, 140), 'Back', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'r2' #BUY TO REPAIR ARMOR (condition -> no armor ) elif (x == pygame.K_3 and (state == 'b') and sv['sheild_first'] == 0): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((350, 20), 'You have no armor to repair', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'r4' #REPAIR ARMOR -> NEXT (condition -> armr health not full ) elif (x == pygame.K_r and (state == 'r2')): sprite_layers[2].remove_sprite(shop_menu2) #if able to pay #Check that player can always buy/keep a sword if gold >= 30: if (gold - 30 < 100 and sword_have == 0): draw.text( (350, 60), 'If you repair this you cannot buy a sword', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') else: sv['gold'] = gold - 30 sv['sheild_hp'] = 50 pk.dump(sv, open("./save.p", "wb")) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((350, 20), 'Your Armor is repaired', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') #insufficient gold else: draw.text((350, 20), 'You Dont have enough gold', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'r3' #MAIN -> SELL elif (x == pygame.K_s and state == 'm'): sprite_layers[2].remove_sprite(shop_menu2) #print 'menu' imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((270, 20), 'What do you want to sell?', (0, 0, 0), font=font) draw.text((350, 60), 'Swords (1)', (0, 0, 0), font=font) draw.text((350, 100), 'From Inventory (2)', (0, 0, 0), font=font) draw.text((350, 160), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'sl' #SELL -> SWORD elif (x == pygame.K_1 and state == 'sl'): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((350, 60), 'Sell your Sword (1)', (0, 0, 0), font=font) draw.text((350, 150), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'ss' #SELL SWORD -> NEXT elif (x == pygame.K_1 and state == 'ss'): wpn = sv['eqp_weapon'] sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) #if have no sword if wpn == None: draw.text((350, 60), 'You Dont have any sword', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) #if have sword #Check that player can always buy/keep a sword elif ((gold + costs1 - 30) < 100): draw.text( (350, 60), 'If you sell this you cannot buy another one', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) else: if wpn == 'sw1': sv['gold'] = gold + costs1 - 30 elif wpn == 'sw2': sv['gold'] = gold + costs2 - 60 elif wpn == 'sw2': sv['gold'] = gold + costs3 - 120 elif wpn == 'dagger': sv['gold'] = gold + 50 sv['eqp_weapon'] = None sv['dagger'] = 0 pk.dump(sv, open("./save.p", "wb")) wpn = 'You sold ' + wpn draw.text((350, 60), wpn, (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'conf' #SELL -> SELL FROM INVENTORY elif (x == pygame.K_2 and state == 'sl'): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) inv_len = len(sv['misc']) #inventory empty if inv_len == 0: draw.text((350, 60), 'You dont have anything to sell', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) #Creating the text to show up else: inven = sv['misc'] inven_item = [] #item names inven_cost = [] #item cost inven_str = [] #list for their concat string for i in range(0, inv_len, 2): inven_item.append(inven[i]) inven_cost.append(inven[i + 1]) #concatinating (along with "Back") for i in range(0, inv_len / 2): inven_list = inven_item[i] + ' ' + str( inven_cost[i]) + ' (' + str(i + 1) + ')' inven_str.append(inven_list) inven_str.append('Bac(k)') #snippet for printing in two rows for j in range(20, 150, 40): if (len(inven_str)) != 0: draw.text((350, j), inven_str[0], (0, 0, 0), font=font) inven_str.pop(0) else: break for j in range(20, 150, 40): if (len(inven_str)) != 0: draw.text((700, j), inven_str[0], (0, 0, 0), font=font) inven_str.pop(0) else: break imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'inv' #selecting item to sell from inventory elif (x in numkey and state == 'inv'): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf", 30) inv_len = len(sv['misc']) inven = sv['misc'] #creation of concat string list inven_item = [] inven_cost = [] inven_str = [] for i in range(0, inv_len, 2): inven_item.append(inven[i]) inven_cost.append(inven[i + 1]) for i in range(0, inv_len / 2): if int(chr(x)) == i + 1: item_str = 'You sold ' + inven_item[i] #adding the gold to hero's gold sv['gold'] = gold + inven_cost[i] #Poping the sold item sv['misc'].pop(i * 2) sv['misc'].pop(i * 2) draw.text((350, 60), item_str, (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) pk.dump(sv, open("./save.p", "wb")) elif int(chr(x)) > inv_len / 2: draw.text((350, 60), 'Not that many items here', (0, 0, 0), font=font) draw.text((350, 140), 'Bac(k)', (0, 0, 0), font=font) imgtx2.save('./images/shop2.png') shop_menu2 = person.create_menu_bg( c_pos[0], c_pos[1] + 768 / 2 - 270, './images/shop2.png') state = 'conf' #updating the gold interface menu.update_lg(l_g, c_pos) #removing all the sprites and adding the fresh ones sprite_layers[2].remove_sprite(shop_menu1) sprite_layers[2].remove_sprite(shop_menu2) sprite_layers[2].add_sprite(shop_menu1) sprite_layers[2].add_sprite(shop_menu2) #rendering shifty1.render_update(renderer, sprite_layers, screen) if shopping == False: #removing the sprites when leaving sprite_layers[2].remove_sprite(shop_menu1) sprite_layers[2].remove_sprite(shop_menu2) shifty1.render_update(renderer, sprite_layers, screen)
def demo_pygame(file_name): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) mixer.init() #background music sound = mixer.Sound('./sounds/bats.ogg') file = './sounds/spooky.ogg' m = mixer.music.load(file) mixer.music.play(-1); #set up a screen screen_width = min(950, world_map.pixel_width) screen_height = min(760, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite hero_pos_x = 400 hero_pos_y = 800 hero = person.create_person(hero_pos_x, hero_pos_y ,'./images/hero_u2.png') # dimensions of the hero for collision detection hero_width = hero.rect.width hero_height = 3 # cam_offset is for scrolling cam_world_pos_x = screen_width/2 cam_world_pos_y = screen_height/2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[2].add_sprite(hero) # variables for the main loop clock = pygame.time.Clock() running = True speed=5 health=100 # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT,1000) mr=ml=md=mu=0 #create portal to change map portal1 = pygame.Rect(19*20,42*20,180,20) #create the spooky guy vil=person.create_villager(file_name) sprite_layers[1].add_sprite(vil[0]['sprte']) # mainloop while running: dt = clock.tick(40) #update camera position as per hero's position if ( hero.rect.centery >=570): renderer.set_camera_position(475, 570) c_pos=(475,570) elif (hero.rect.centery <=380): renderer.set_camera_position(475, 380) c_pos=(475,380) else: renderer.set_camera_position(475,hero.rect.centery ) c_pos=(475,hero.rect.centery) # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False x=event.key if (vil!=None): talk_result=talk.iftalk(0,x,vil,0,hero_pos_x,hero_pos_y,file_name) else: talk_result=None if(talk_result[0]==1): menutext=menu.create_menu_vil(0,file_name,talk_result[2]) dialog_show=0 txtim=person.create_text_img('./images/textbox.png',menutext,dialog_show) menu_ui=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,txtim) sprite_layers[2].add_sprite(menu_ui) shifty1.render_update(renderer,sprite_layers,screen) #the loop for showing text box (again and again) till dialogues not completed while(dialog_show<len(menutext)): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x=event.key if(x==pygame.K_SPACE): sprite_layers[2].remove_sprite(menu_ui) dialog_show +=1 if dialog_show==len(menutext): break txtim=person.create_text_img('./images/textbox.png',menutext, \ dialog_show) menu_ui=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,\ txtim) sprite_layers[2].add_sprite(menu_ui) sv['spook']=1 sv['talk_vil'][file_name][0]=1 sv['talk_vil']['./maps/village2_inside.tmx'][2]=1 pk.dump(sv,open("./save.p","wb")) shifty1.render_update(renderer,sprite_layers,screen) menu.exit_menu(x)##an infite loop till 'x' is pressed sprite_layers[2].remove_sprite(menu_ui) # find directions mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[3]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] sv=pk.load(open("./save.p","rb")) if(portal1.collidepoint(hero.rect.midbottom) and sv['talk_vil'][file_name][0]==1): portal=True running = False mixer.music.stop(); # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) #render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) t=random.randint(0,1000) #based on random numnber play bats sound if(t<5): mixer.music.stop() sound.play(0) mixer.music.play(-1); # changes to switch screen to game over pygame.display.flip() if portal==True: #change the map shifty1.demo_pygame('./maps/village2_inside.tmx',2)
def demo_pygame(file_name,frm): ##FILE NAME GIVES THE CURRENT MAP if(file_name=='./maps/tunnel3.tmx'): tunnel3.main() elif(file_name=='./maps/tunnel.tmx'): goodtunnel.main() elif(file_name=='./maps/mountainclimbing.tmx'): climb_mountain.main() elif(file_name=='./maps/maze.tmx'): maze_code.main() elif(file_name=='./maps/maze2.tmx'): maze_code2.main() elif(file_name=='./maps/hotel.tmx'): hotel.main() elif(file_name=='./maps/tunnel2_4.tmx'): tunnel2_4.main(frm) elif(file_name=='./maps/palace.tmx'): pal_lava.main() elif(file_name=='./maps/palace_final.tmx'): palace.main() # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() #loading the main dictionary into "savegame" #pk.dump(savegame,open("./save.p","wb")) -> donates dumping/saving the updated #dictionaty "savegame" to the "save.p" file so that can be used again with the updated values savegame=pk.load(open("./save.p","rb")) ##Creating hero #getting the entry position depending on the map starting = entry(file_name,frm) hero_pos_x = starting[0] hero_pos_y = starting[1] #creating the hero sprite hero = person.create_person(hero_pos_x, hero_pos_y,'./images/hero_d2.png') ##Creating villagers #villager count is 0 if no villager on the current map vcount=0 #defining the villager directions muv='up' mdv='down' mrv='right' mlv='left' #no direction -> not moving no='' #creating the villager sprites #villagers created according to map vil=person.create_villager(file_name) vcount=len(vil) ##Giving initial random direction to every villager #initializing the variable drc=no #the villager direction list drctn = [] #using randint to decide direction for i in range(0,vcount): a=random.randint(1,10) if(a==1): drc=muv elif(a==2): drc=mrv elif(a==3): drc=mdv elif(a==4): drc=mlv elif (a<=10): drc=no drctn.append(drc) # cam_offset is for scrolling cam_world_pos_x = hero.rect.centerx cam_world_pos_y = hero.rect.centery # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[1].add_sprite(hero) ##Adding the villager sprites i=0 for i in range(0,vcount): sprite_layers[1].add_sprite(vil[i]['sprte']) ##Misc object sprites #creating the sprite misc=person.create_misc(file_name) #adding the sprites if misc!=None: mcount=len(misc) i=0 while(i>=0 and i<mcount): ##check if any misc is already taken if (savegame[misc[i]['name']]==0): sprite_layers[1].add_sprite(misc[i]['sprte']) i+=1 else: misc.pop(i) mcount=len(misc) # variables for the main loop clock = pygame.time.Clock() running = True speed = 4 ##Sign board for the tunnel riddle portal_board=None if(file_name=='./maps/village1.tmx'): portal_board=pygame.Rect(81*32,9*32,40,80) signboard=person.create_person(81*32,9*32,'./images/signboard.png') sprite_layers[2].add_sprite(signboard) ##The variables for changing the movement pictures -> to give animation to movement mr=ml=md=mu=0 vmr=vml=vmd=vmu=0 # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) #Creating portals -> For map changing portals = person.create_portal(file_name) #Creating the shopping portal shop_portal=person.create_shop_portal(file_name) #Variable for the quests/tasks/side missions villager_job=0 #To check if ship is on the shore in "Ship.tmx" map (pirate ship) ship_present=0 #Initial value of portal -> if True -> map changes portal=False #check for the river sound in Burning village map -> heard only if close to river flag_crossed=0 #This is check for talking to villager -> talks to villager-> shows the first dialog box-> if 1 count=0 ###FOR INTERFACE #initiaizing variables from savegame hp=savegame['hp'] hp_max=savegame['max_hp'] #camera postion stored in c_pos c_pos=camra.camera(file_name,renderer,hero) #variable for turning the interface on and off interf_toggle=0 #creating the background for health bar, xp bar interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) #creating the health bar sprite and creating the bar hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos) #creating the xp bar sprite and creating the bar xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos) #creating the level and gold sprite l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) #creating the weapons interface background and values f_i=menu.create_f_i(renderer,sprite_layers,screen,c_pos) interf_fight=menu.create_interface_fight(renderer,sprite_layers,screen,c_pos) ##Aditional background music that turns onn and off add=None #Creating the main background music musicbg=sound.create_music(file_name) #Creating the additional full time running background music if file_name=='./maps/village2_out1.tmx': music_add=sound.create_music_add('./sounds/vil2add.ogg') #--------------------------------------- """MAIN GAME LOOP""" while running: #fixing the FPS dt = clock.tick(50) ##Checking for map exit -> -1 no change -> !=-1 Specific portal number change_map = exit_map(hero,portals) if change_map!=-1: portal = True #Giving the nextmap's name and frm -> "frm"-> tells if the player came from which map # -> to give the respective starting position nextlevel=next_map(file_name,change_map) ##Giving the warning messages wherever needed #In Ship map -> warning for not enough gold if (file_name=='./maps/ship.tmx' and (savegame['pirate']==0 or savegame['pirate_map']==1)): portal=False warning=menu.warning_msg(file_name,renderer,sprite_layers,screen,c_pos,1) ##Infinite loop until menu is to be removed i=0 while(i!=1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i=1 continue sprite_layers[2].remove_sprite(warning) hero_pos_x -=10 #In burning village map -> "Something is missing" if player do not have a melee weapon elif(file_name=='./maps/village1.tmx' and savegame['dagger']==0): portal=False warning=menu.warning_msg(file_name,renderer,sprite_layers,screen,c_pos,0) ##Infinite loop until menu is to be removed i=0 while(i!=1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i=1 continue sprite_layers[2].remove_sprite(warning) hero_pos_y +=10 #In village2 inside -> "Something is missing" if no melee weapon or not talked to the spooky guy elif(file_name=='./maps/village2_inside.tmx' and (savegame['eqp_weapon']==None or savegame['spook']==0) and (change_map==1 or change_map==2)): portal=False warning=menu.warning_msg(file_name,renderer,sprite_layers,screen,c_pos,0) ##Infinite loop until menu is to be removed i=0 while(i!=1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i=1 continue sprite_layers[2].remove_sprite(warning) hero_pos_y +=10 #Quit the while loop if portal is true if portal==True: running=False ##loading the main dictionary into "savegame" savegame=pk.load(open("./save.p","rb")) #Getting the current camera position c_pos=camra.camera(file_name,renderer,hero) ##IN Ship map to move the ship when hreo reaches a certain point if(file_name=='./maps/ship.tmx' and hero_pos_x>14*32 and ship_present==0): #Creating the addtional bg music (which continues once started) music_add=sound.create_music_add('./sounds/pirate.ogg') music_add.set_volume(0.7) ship_moving = True #Creating the Ship sprite and adding it ship=person.create_person(9*32,29*32,'./images/ship.png') sprite_layers[1].add_sprite(ship) #while function for the ship moving while(ship_moving): #moving the ship ship.rect.top -=1 #rendering the screen to keep the screen updated render_update(renderer,sprite_layers,screen) #Stopping the ship if(ship.rect.top<7*32): #Ship reached the shore ship_present=1 i=0 while(i!=30): i=i+1 continue #changing to second image ship.image=pygame.image.load('./images/ship2.png') render_update(renderer,sprite_layers,screen) ##adding some delay to ship image change while(i!=60): i=i+1 continue #changing to third image and ship.image=pygame.image.load('./images/ship3.png') ship.rect.top=4*32 ship.rect.right += 32 #Coming out of while loop ship_moving=False #Creating the Captian as villger in the format in which other villagers are added in person file vil=[{'sprte':person.create_person(5*32,5*32-16,'./images/cappy.png'),\ 'toplx':None,'toply':None,'w':None,'h':None}] #adding the Captian sprite_layers[1].add_sprite(vil[0]['sprte']) ##MOVING THE HERO mov = movements.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers,vil,misc) #The variables for the animation images returned from the movement fucntion #Then the same variables are passed again to keep the animation smoother mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] #position variables -> called and passed again hero_pos_x = mov[4] hero_pos_y = mov[5] #hypothetical rectagle -> where the hero will move next? #used to check collision against villagers hero_hypo = mov[7] #Additional bg music (on/off) if (file_name=='./maps/village1.tmx' and hero_pos_y<=28*32 and flag_crossed==0): add=sound.create_music_add('./sounds/river.ogg') ##to check wether first time crossed or other flag_crossed=1 elif (file_name=='./maps/village1.tmx' and hero_pos_y>=28*32 and flag_crossed==1): sound.stop_soundfx(add) flag_crossed=0 ##Moving the villager if there is one if (vil!=None): ##Moving the villager -> the function gives the old direction in which the villagers were ##travelling. In every loop they take one step drctn=movements.move_villager(drctn,speed,vil,hero_hypo,vmu,vmr,vmd,vml,file_name) ##Gives the index of colliding vilager coll=movements.colliding_other_living(vil,hero_hypo) #Checking if there is any misc elif(misc!=None): collm=movements.colliding_other_living(misc,hero_hypo) #Moving the interface with camera interface.rect.topleft=(c_pos[0]-512,c_pos[1]-384) hp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-382) xp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-345) l_g.rect.topleft=(c_pos[0]-508,c_pos[1]-381) f_i.rect.bottomright=(c_pos[0]+500,c_pos[1]+350) interf_fight.rect.bottomright=(c_pos[0]+512,c_pos[1]+384) #-------------------------- EVENT HANDLING --------------------------------- for event in pygame.event.get(): #Updating the interface whenever an event happens menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) menu.update_f_i(f_i,c_pos) #For Key pressed event if event.type == pygame.KEYDOWN: x=event.key if(x==pygame.K_ESCAPE): pygame.quit() #Saving the game elif(x==pygame.K_s): #saving the present file name savegame['last_map']=file_name #saving the present frm-> where to put the hero when game loaded savegame['last_frm']=frm #to allow the load game function to work savegame['save']=1 pk.dump(savegame,open("./save.p","wb")) sv=menu.save_menu(c_pos) sound.create_soundfx('./sounds/savegame.ogg') sprite_layers[2].add_sprite(sv) render_update(renderer,sprite_layers,screen) menu.exit_menu(x) sprite_layers[2].remove_sprite(sv) #Printing the dictionary elif(x==pygame.K_q): print savegame #Starting the shopping interface elif(x==pygame.K_SPACE and shop_portal!=None and pygame.Rect.colliderect(hero.rect, shop_portal)): shop(c_pos,renderer,sprite_layers,screen,l_g) #Showing the tunnel riddle elif(x==pygame.K_SPACE and portal_board!=None and pygame.Rect.colliderect(hero.rect, portal_board)): riddle=person.create_person(hero.rect.centerx,hero.rect.centery+200,'./images/tunnel_riddle.png') sprite_layers[2].add_sprite(riddle) (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) ##Infinite loop until menu is to be removed i=0 while(i!=1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i=1 continue sprite_layers[2].remove_sprite(riddle) ##Showing the Travel option of the ship elif(file_name=='./maps/ship.tmx' and ship_present==1 and x==pygame.K_SPACE and collision.checkCollision(hero,ship)): #creating the menu imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((260,70),'Are you sure you want to travel?',(0,0,0),font=font) draw.text((260,110),'(Y)es (N)o',(0,0,0),font=font) imgtx.save('./images/ship_conf.png') ship_conf=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,'./images/ship_conf.png') sprite_layers[2].add_sprite(ship_conf) render_update(renderer,sprite_layers,screen) ##Infinite loop until menu is to be removed result='x' while(result=='x'): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x=event.key if(x==pygame.K_y): result='y' else: result='n' break sprite_layers[2].remove_sprite(ship_conf) render_update(renderer,sprite_layers,screen) #Checking the conditions if pressed 'y' -> want to travel if(result=='y'): #condition for job done and then gold does not matter if(savegame['talk_vil']['./maps/ship.tmx'][0]==1): pirate_mapchange=1 running =False #condition for job not done but have gold elif(savegame['gold']>=50): savegame['gold']-=50 pk.dump(savegame,open("./save.p","wb")) pirate_mapchange=1 running =False #condition for job not done and not enough gold elif(savegame['gold']<50 and savegame['pirate_map']==0): menu.warning_msg(file_name,renderer,sprite_layers,screen,c_pos,0) break #Key pressed near a collectable object elif(x==pygame.K_SPACE and misc!=None): i=0 l=len(misc) while (i>=0 and i<l): if pygame.Rect.colliderect(hero.rect, misc[i]['sprte'].rect): savegame['misc'].append(misc[i]['name']) savegame['misc'].append(misc[i]['value']) savegame[misc[i]['name']]=1 pk.dump(savegame,open("./save.p","wb")) sprite_layers[1].remove_sprite(misc[i]['sprte']) misc.pop(i) else: i+=1 l=len(misc) #toggling the interface off elif(x==pygame.K_f and interf_toggle==0): sprite_layers[2].remove_sprite(hp_sprite) sprite_layers[2].remove_sprite(xp_sprite) sprite_layers[1].remove_sprite(interface) sprite_layers[2].remove_sprite(l_g) sprite_layers[1].remove_sprite(interf_fight) sprite_layers[2].remove_sprite(f_i) interf_toggle=1 #toggling the interface on elif(x==pygame.K_f and interf_toggle==1): sprite_layers[2].add_sprite(hp_sprite) sprite_layers[2].add_sprite(xp_sprite) sprite_layers[1].add_sprite(interface) sprite_layers[2].add_sprite(l_g) sprite_layers[1].add_sprite(interf_fight) sprite_layers[2].add_sprite(f_i) interf_toggle=0 ##Making the Inventory elif(x==pygame.K_i): sound.create_soundfx('./sounds/inventory.ogg') inven=menu.create_menu_inventory(c_pos) sprite_layers[2].add_sprite(inven) render_update(renderer,sprite_layers,screen) ##Infinite loop until inventory is to be removed while(x!=pygame.K_SPACE): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x=event.key continue sprite_layers[2].remove_sprite(inven) render_update(renderer,sprite_layers,screen) #------------------TALKING TO VILLAGER------------------ #Give the required values for showing the talk to villager number 'coll' (line 394) if (vil!=None): talk_result=talk.iftalk(coll,x,vil,count,hero_pos_x,hero_pos_y,file_name)##Gives : count(for checking if talking) ##coll (which villager he's talking to) ##talktime(talking again or not) #if no villager colliding else: talk_result=None #talk_result[0] -> count --- shows the talking interface only if count is 1-> talking to someone #count remains 0 as called before mainloop if(talk_result[0]==1): ##gives back the text for respective villager menutext=menu.create_menu_vil(coll,file_name,talk_result[2]) ##variable to check for for how many number of times the loop should work dialog_show=0 sound.create_soundfx('./sounds/talk.ogg') ##gives the name of the created image txtim=person.create_text_img('./images/textbox.png',menutext,dialog_show) ##gives the sprite for the menu image menu_ui=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,txtim) sprite_layers[2].add_sprite(menu_ui) render_update(renderer,sprite_layers,screen) #the loop for showing text box (again and again) while(dialog_show<len(menutext)): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x=event.key #for the villagers that have Yes/No option if (dialog_show==len(menutext)-1): if x==pygame.K_y: if(file_name=='./maps/village1.tmx' and coll==1 and savegame['b_h_vil']==0): #sound created as this 'add' variable is closing when going out of village1 #main reason -> prevent error add=sound.create_music_add('./sounds/river.ogg') savegame['b_h_vil']=1 villager_job=1 running =False sprite_layers[2].remove_sprite(menu_ui) dialog_show+=1 elif(file_name=='./maps/village2_out1.tmx' and coll==0 and savegame['f_vil']==0): savegame['f_vil']=1 villager_job=2 running =False sprite_layers[2].remove_sprite(menu_ui) dialog_show+=1 elif(file_name=='./maps/village2_inside.tmx' and coll==2 and savegame['spook']==0): savegame['spook']=1 villager_job=3 running =False sprite_layers[2].remove_sprite(menu_ui) dialog_show+=1 elif x==pygame.K_n: sprite_layers[2].remove_sprite(menu_ui) dialog_show+=1 #all other villagers if(x==pygame.K_SPACE): ##remove the prev text image sprite_layers[2].remove_sprite(menu_ui) ##indicates for the next one dialog_show +=1 ##for not going in the loop again if dialog_show==len(menutext): break ##if any other key pressed elif(x!=pygame.K_SPACE): continue ##for not going in the loop again elif dialog_show==len(menutext): break sound.create_soundfx('./sounds/talk.ogg') #next text image created and its sprite created and added txtim=person.create_text_img('./images/textbox.png',menutext, \ dialog_show) menu_ui=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,\ txtim) sprite_layers[2].add_sprite(menu_ui) render_update(renderer,sprite_layers,screen) if x==pygame.K_SPACE: ##an infite loop till 'x' is pressed menu.exit_menu(x) sprite_layers[2].remove_sprite(menu_ui) #--------------------TALKING ENDS------------------- #----------------------------- EVENT HANDLING ENDED ---------------------------- # adjust camera according to the hero's position, follow him # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() """------------------------------------- OUT OF MAIN GAME LOOP----------------------------------""" #stopping the additional background music if (file_name=='./maps/village2_out1.tmx' or file_name=='./maps/ship.tmx'): music_add.stop() #stopping the fluctuating bg music #'add' created (in line 585) to prevent error in this snippet if(file_name=='./maps/village1.tmx' ): sound.stop_soundfx(add) musicbg.stop() #If portal was the reason for stopping the game loop if portal==True: #name of next map and respective frm mp=nextlevel[0] frm=nextlevel[1] #calling the map demo_pygame(mp,frm) #If main loop ended because of a side task if villager_job==1: knifehouse1.main() elif villager_job==2: fish.main() elif villager_job==3: spooky.main() #when pressed 'yes' to the ship travel if pirate_mapchange==1: demo_pygame('./maps/village2_out1.tmx',0)
def shop(c_pos,renderer,sprite_layers,screen,l_g): #variables for two while loops shopping = True inner = True sv=pk.load(open("./save.p","rb")) #costs of three swords costs1=100 costs2=200 costs3=300 #cost of one arrow costa=5 #cost of two armors costa1=100 costa2=150 #if discount is applicable if (sv['f_vil']==1): costs1-=30 costs2-=50 costs3-=70 costa1-=30 costa2-=50 #list for number keys numkey=[pygame.K_1,pygame.K_2,pygame.K_3,pygame.K_4,pygame.K_5,pygame.K_6\ ,pygame.K_7,pygame.K_8] #main shopping loop while shopping: ##Base image for upper and lower menu is same #Creating tne upper message using the base image imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((270,70),'Welcome!!!',(0,0,0),font=font) imgtx.save('./images/shop1.png') ## the above menu box shop_menu1=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,'./images/shop1.png') imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((270,20),'What do you want to do?',(0,0,0),font=font) draw.text((350,60),'(B)uy',(0,0,0),font=font) draw.text((350,100),'(S)ell',(0,0,0),font=font) draw.text((350,140),'(L)eave',(0,0,0),font=font) imgtx2.save('./images/shop2.png') ##lower menu box shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='m' ##states -> tell in which menu the player currently is #helps to navigate to next menu -> eg. "2" can be option on many menus leading to different ones while inner: #storing the gold, dagger, arrow count, and armor gold=sv['gold'] sword_have=sv['dagger'] arrow_c=sv['arrow_count'] armr_hav=sv['sheild_first'] ##-------------------------Shopping start------------------- for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x=event.key ##MAIN ---> BUY if(x==pygame.K_b and state=='m'): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((270,20),'What do you want to buy?',(0,0,0),font=font) draw.text((350,60),'Swords (1) Armor(4)',(0,0,0),font=font) draw.text((350,100),'Arrow (2) Bac(k)',(0,0,0),font=font) draw.text((350,140),'Repair Armor (3)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') #state changed to b-> buy menu state='b' ##MAIN -> LEAVE elif(x==pygame.K_l and state=='m'): shopping = False inner=False ##BACK TO -> MAIN -- FROM ALL elif(x==pygame.K_k and (state=='b' or state=='s' or state=='a' or state=='r1' \ or state=='r2' or state=='r3' or state=='r4' or state=='arm' or\ state=='conf' or state=='sl' or state=='ss' or state=='inv')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((270,20),'What do you want to do?',(0,0,0),font=font) draw.text((350,60),'(B)uy',(0,0,0),font=font) draw.text((350,100),'(S)ell',(0,0,0),font=font) draw.text((350,140),'(L)eave',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='m' ##BUY -> SWORDS elif(x==pygame.K_1 and (state=='b')): sprite_layers[2].remove_sprite(shop_menu2) #print 'back' imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) swrd1='Longsword (1) ' + str(costs1) swrd2='Two-Edged sword (2) ' + str(costs2) swrd3='Katana (3) ' + str(costs3) draw.text((350,20),swrd1,(0,0,0),font=font) draw.text((350,60),swrd2,(0,0,0),font=font) draw.text((350,100),swrd3,(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='s' ##BUY -> ARMOR elif(x==pygame.K_4 and (state=='b')): sprite_layers[2].remove_sprite(shop_menu2) #print 'back' imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) armr1='Leather(1) ' + str(costa1) armr2='Chainmail (2) ' + str(costa2) draw.text((350,20),armr1,(0,0,0),font=font) draw.text((350,60),armr2,(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='arm' #ARMOR -> BUYING ARMOR 1 elif(x==pygame.K_1 and (state=='arm')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) #if able to buy if (gold>=costa1): #Check that player can always buy/keep a sword if (gold-costa1<100 and sword_have==0): draw.text((350,60),'If you Buy this you cannot buy a sword',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') else: draw.text((350,20),'You bought Leather armor',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') #if armor bought -> gold decrease, shield yes, its max hp, and total hp updated sv['gold']=gold-costa1 sv['sheild_first']=1 sv['sheild_maxhp']=60 sv['sheild_hp']=60 sv['eqp_armour']='lth' pk.dump(sv,open("./save.p","wb")) #insufficient gold else: draw.text((350,20),'You Dont have enough gold',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='conf' #ARMOR -> BUYING ARMOR 2 elif(x==pygame.K_2 and (state=='arm')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) if armr_hav==1: draw.text((350,20),'You already have an armor...',(0,0,0),font=font) draw.text((350,60),'First you must sell it',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') elif (gold>=costa2): #Check that player can always buy/keep a sword if (gold-costa2<100 and sword_have==0): draw.text((350,60),'If you Buy this you cannot buy a sword',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') else: draw.text((350,20),'You bought Chainmail',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') sv['gold']=gold-costa2 sv['sheild_first']=1 sv['sheild_maxhp']=70 sv['sheild_hp']=70 sv['eqp_armour']='chn' pk.dump(sv,open("./images/save.p","wb")) else: draw.text((350,20),'You Dont have enough gold',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='conf' #SWORDS -> BUYING SWORD 1 #same as buying an armor elif(x==pygame.K_1 and (state=='s')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) if sword_have==1: draw.text((350,20),'You already have a sword...',(0,0,0),font=font) draw.text((350,60),'First you must sell it',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') elif (gold>=costs1): draw.text((350,20),'You bought Longsword',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') sv['gold']=gold-costs1 sv['dagger']=1 #every melee weapon have different damage -> need to update which weapon sv['eqp_weapon']='sw1' pk.dump(sv,open("./save.p","wb")) else: draw.text((350,20),'You Dont have enough gold',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='conf' #SWORDS -> BUYING SWORD 2 elif(x==pygame.K_2 and (state=='s')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) if sword_have==1: draw.text((350,20),'You already have a sword...',(0,0,0),font=font) draw.text((350,60),'First you must sell it',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') elif (gold>=costs2): sv['gold']=gold-costs2 sv['dagger']=1 sv['eqp_weapon']='sw2' pk.dump(sv,open("./save.p","wb")) draw.text((350,20),'You bought Two-Edged Sword',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') else: draw.text((350,20),'You Dont have enough gold',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='conf' #SWORDS -> BUYING SWORD 3 elif(x==pygame.K_3 and (state=='s')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) if sword_have==1: draw.text((350,20),'You already have a sword...',(0,0,0),font=font) draw.text((350,60),'First you must sell it',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') elif (gold>=costs3): draw.text((350,20),'You bought Katana',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') sv['gold']=gold-costs3 sv['dagger']=1 sv['eqp_weapon']='sw3' pk.dump(sv,open("./save.p","wb")) else: draw.text((350,20),'You Dont have enough gold',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='conf' #ARROWS -> BUYING ARROWS 1 #same as armor and swords elif(x==pygame.K_1 and (state=='a')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) if (gold>=costa): #Check that player can always buy/keep a sword if (gold-costa<100 and sword_have==0): draw.text((350,60),'If you buy this you cannot buy a sword',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') else: draw.text((350,20),'You bought one arrow',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') sv['gold']=gold-costa sv['arrow_count'] +=1 pk.dump(sv,open("./save.p","wb")) else: draw.text((350,20),'You Dont have enough gold',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='conf' #ARROWS -> BUYING ARROWS 2 (10 arrows at price of 8) elif(x==pygame.K_2 and (state=='a')): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) if (gold>=costa*8): #Check that player can always buy/keep a sword if ((gold-(costa*8))<100 and sword_have==0): draw.text((350,60),'If you Buy this you cannot buy a sword',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') else: draw.text((350,20),'You bought a big arrow pock',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') sv['gold']=gold-(costa*8) sv['arrow_count'] +=10 pk.dump(sv,open("./save.p","wb")) else: draw.text((350,20),'You Dont have enough gold',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='conf' #ARROWS -> BUYING ARROWS 3 (20 arrows at price of 18) elif(x==pygame.K_3 and (state=='a')): sprite_layers[2].remove_sprite(shop_menu2) #print 'back' imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) if (gold>=costa*18): #Check that player can always buy/keep a sword if ((gold-(costa*18))<100 and sword_have==0): draw.text((350,60),'If you Buy this you cannot buy a sword',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') else: draw.text((350,20),'You bought a huge arrow pack',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') sv['gold']=gold-(costa*18) sv['arrow_count'] +=20 pk.dump(sv,open("./save.p","wb")) else: draw.text((350,20),'You Dont have enough gold',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='conf' #BUY -> ARROWS elif(x==pygame.K_2 and (state=='b')): sprite_layers[2].remove_sprite(shop_menu2) #print 'back' imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((350,20),'Buy arrow (1) 5 Gold',(0,0,0),font=font) draw.text((350,60),'Buy 10 arrows (2) 40 Gold',(0,0,0),font=font) draw.text((350,100),'Buy 20 arrows (3) 90 Gold',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='a' #BUY TO REPAIR ARMOR (condition -> armor health ful ) elif(x==pygame.K_3 and (state=='b') and sv['sheild_first']==1\ and sv['sheild_hp']==sv['sheild_maxhp']): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((350,20),'Your armor is already at full health',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='r1' #BUY TO REPAIR ARMOR (condition -> armor health not full) elif(x==pygame.K_3 and (state=='b') and sv['sheild_first']==1\ and sv['sheild_hp']<['sheild_maxhp']): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((350,20),'(R)epair armor 30 Gold',(0,0,0),font=font) draw.text((350,140),'Back',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='r2' #BUY TO REPAIR ARMOR (condition -> no armor ) elif(x==pygame.K_3 and (state=='b') and sv['sheild_first']==0): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((350,20),'You have no armor to repair',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='r4' #REPAIR ARMOR -> NEXT (condition -> armr health not full ) elif(x==pygame.K_r and (state=='r2')): sprite_layers[2].remove_sprite(shop_menu2) #if able to pay #Check that player can always buy/keep a sword if gold>=30: if (gold-30<100 and sword_have==0): draw.text((350,60),'If you repair this you cannot buy a sword',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') else: sv['gold']=gold-30 sv['sheild_hp']=50 pk.dump(sv,open("./save.p","wb")) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((350,20),'Your Armor is repaired',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') #insufficient gold else: draw.text((350,20),'You Dont have enough gold',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='r3' #MAIN -> SELL elif(x==pygame.K_s and state=='m'): sprite_layers[2].remove_sprite(shop_menu2) #print 'menu' imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((270,20),'What do you want to sell?',(0,0,0),font=font) draw.text((350,60),'Swords (1)',(0,0,0),font=font) draw.text((350,100),'From Inventory (2)',(0,0,0),font=font) draw.text((350,160),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='sl' #SELL -> SWORD elif(x==pygame.K_1 and state=='sl'): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((350,60),'Sell your Sword (1)',(0,0,0),font=font) draw.text((350,150),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='ss' #SELL SWORD -> NEXT elif(x==pygame.K_1 and state=='ss'): wpn=sv['eqp_weapon'] sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) #if have no sword if wpn==None: draw.text((350,60),'You Dont have any sword',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) #if have sword #Check that player can always buy/keep a sword elif((gold+costs1-30)<100): draw.text((350,60),'If you sell this you cannot buy another one',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) else: if wpn=='sw1': sv['gold']=gold+costs1-30 elif wpn=='sw2': sv['gold']=gold+costs2-60 elif wpn=='sw2': sv['gold']=gold+costs3-120 elif wpn=='dagger': sv['gold']=gold+50 sv['eqp_weapon']=None sv['dagger']=0 pk.dump(sv,open("./save.p","wb")) wpn='You sold '+wpn draw.text((350,60),wpn,(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='conf' #SELL -> SELL FROM INVENTORY elif(x==pygame.K_2 and state=='sl'): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) inv_len=len(sv['misc']) #inventory empty if inv_len==0: draw.text((350,60),'You dont have anything to sell',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) #Creating the text to show up else: inven=sv['misc'] inven_item=[]#item names inven_cost=[]#item cost inven_str=[]#list for their concat string for i in range(0,inv_len,2): inven_item.append(inven[i]) inven_cost.append(inven[i+1]) #concatinating (along with "Back") for i in range(0,inv_len/2): inven_list=inven_item[i]+' '+str(inven_cost[i])+' ('+str(i+1)+')' inven_str.append(inven_list) inven_str.append('Bac(k)') #snippet for printing in two rows for j in range(20,150,40): if (len(inven_str))!=0: draw.text((350,j),inven_str[0],(0,0,0),font=font) inven_str.pop(0) else: break for j in range(20,150,40): if (len(inven_str))!=0: draw.text((700,j),inven_str[0],(0,0,0),font=font) inven_str.pop(0) else: break imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='inv' #selecting item to sell from inventory elif(x in numkey and state=='inv'): sprite_layers[2].remove_sprite(shop_menu2) imgtx2 = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx2) font = ImageFont.truetype("./PAPYRUS.ttf",30) inv_len=len(sv['misc']) inven=sv['misc'] #creation of concat string list inven_item=[] inven_cost=[] inven_str=[] for i in range(0,inv_len,2): inven_item.append(inven[i]) inven_cost.append(inven[i+1]) for i in range(0,inv_len/2): if int (chr(x))==i+1: item_str='You sold '+inven_item[i] #adding the gold to hero's gold sv['gold']=gold+inven_cost[i] #Poping the sold item sv['misc'].pop(i*2) sv['misc'].pop(i*2) draw.text((350,60),item_str,(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) pk.dump(sv,open("./save.p","wb")) elif int(chr(x))>inv_len/2: draw.text((350,60),'Not that many items here',(0,0,0),font=font) draw.text((350,140),'Bac(k)',(0,0,0),font=font) imgtx2.save('./images/shop2.png') shop_menu2=person.create_menu_bg(c_pos[0],c_pos[1]+768/2-270,'./images/shop2.png') state='conf' #updating the gold interface menu.update_lg(l_g,c_pos) #removing all the sprites and adding the fresh ones sprite_layers[2].remove_sprite(shop_menu1) sprite_layers[2].remove_sprite(shop_menu2) sprite_layers[2].add_sprite(shop_menu1) sprite_layers[2].add_sprite(shop_menu2) #rendering shifty1.render_update(renderer,sprite_layers,screen) if shopping==False: #removing the sprites when leaving sprite_layers[2].remove_sprite(shop_menu1) sprite_layers[2].remove_sprite(shop_menu2) shifty1.render_update(renderer,sprite_layers,screen)
def warning_msg(map_name, renderer, sprite_layers, screen, c_pos, flag): ty = pk.load(open("./save.p", "rb")) #if gold is not enough to travel if (map_name == './maps/ship.tmx' and flag == 0): imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((260, 70), 'Not enough Gold, Laddy', (0, 0, 0), font=font) imgtx.save('./images/ship_conf.png') ship_conf = person.create_menu_bg(c_pos[0], c_pos[1] - 768 / 2, './images/ship_conf.png') sprite_layers[2].add_sprite(ship_conf) shifty1.render_update(renderer, sprite_layers, screen) i = 0 while (i != 1): ##Infinite loop until menu is to be removed for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i = 1 continue sprite_layers[2].remove_sprite(ship_conf) elif (map_name == './maps/ship.tmx' and flag == 1): imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((260, 70), 'Gate not accessible right now', (0, 0, 0), font=font) imgtx.save('./images/ship_conf.png') ship_conf = person.create_menu_bg(c_pos[0], c_pos[1] - 768 / 2, './images/ship_conf.png') sprite_layers[2].add_sprite(ship_conf) shifty1.render_update(renderer, sprite_layers, screen) i = 0 while (i != 1): ##Infinite loop until menu is to be removed for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i = 1 continue sprite_layers[2].remove_sprite(ship_conf) #Flag=0-> showing the first message elif (map_name == './maps/hotel.tmx' and flag == 0): imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((260, 70), 'Welcome to Crossroads Inn', (0, 0, 0), font=font) draw.text((260, 110), '(P)ay 50 gold, stay here and recover your health', (0, 0, 0), font=font) draw.text((260, 150), ' Bac(k)', (0, 0, 0), font=font) imgtx.save('./images/warning.png') warning = person.create_menu_bg(c_pos[0], c_pos[1] - 768 / 2, './images/warning.png') sprite_layers[2].add_sprite(warning) shifty1.render_update(renderer, sprite_layers, screen) i = 0 while (i != 1): #event handling -> P pressed-> pay 50 gold # K pressed-> go back for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_k): i = 1 #"pos" list gives the co-ordinates where the hero will be standing after talking to receptionist #if pos=None -> hero's position remains same pos = None sprite_layers[2].remove_sprite(warning) if (event.type == pygame.KEYDOWN and event.key == pygame.K_p): sprite_layers[2].remove_sprite(warning) #if able to pay -> pay gold, increase health -> spawn in the hotel room("pos" list) if (ty['gold'] >= 50): ty['gold'] -= 50 hero_pos_x = 200 hero_pos_y = 920 pos = [hero_pos_x, hero_pos_y] ty['hp'] = ty['max_hp'] i = 1 pk.dump(ty, open("./save.p", "wb")) else: #if pressed pay but dont have enough gold-> next message warning_msg('./maps/hotel.tmx', renderer, sprite_layers, screen, c_pos, 1) continue return pos #Not enough gold message for the hotel map elif (map_name == './maps/hotel.tmx' and flag == 1): imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((260, 70), 'You Dont have enough money', (0, 0, 0), font=font) draw.text((260, 150), ' Bac(k)', (0, 0, 0), font=font) imgtx.save('./images/warning.png') warning = person.create_menu_bg(c_pos[0], c_pos[1] - 768 / 2, './images/warning.png') sprite_layers[2].add_sprite(warning) shifty1.render_update(renderer, sprite_layers, screen) i = 0 while (i != 1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_k): i = 1 continue sprite_layers[2].remove_sprite(warning) #A common warning message to some places in the map -> pops up if the #condition for the message fulfilled in the parent file/function else: imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((260, 70), 'Something is missing', (0, 0, 0), font=font) imgtx.save('./images/warning.png') warning = person.create_menu_bg(c_pos[0], c_pos[1] - 768 / 2, './images/warning.png') sprite_layers[2].add_sprite(warning) shifty1.render_update(renderer, sprite_layers, screen) return warning
def create_s_a(renderer,sprite_layers,screen,c_pos): s_a=person.create_menu_bg(c_pos[0]+500,c_pos[1]+350,'./images/spec_arrow_interf_1.png') sprite_layers[2].add_sprite(s_a) shifty1.render_update(renderer,sprite_layers,screen) return s_a
def create_f_i(renderer,sprite_layers,screen,c_pos): f_i=person.create_menu_bg(c_pos[0]+500,c_pos[1]+350,'./images/interface_fight_1.png') sprite_layers[2].add_sprite(f_i) shifty1.render_update(renderer,sprite_layers,screen) return f_i
def warning_msg(map_name,renderer,sprite_layers,screen,c_pos,flag): ty=pk.load(open("./save.p","rb")) #if gold is not enough to travel if (map_name=='./maps/ship.tmx' and flag==0): imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((260,70),'Not enough Gold, Laddy',(0,0,0),font=font) imgtx.save('./images/ship_conf.png') ship_conf=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,'./images/ship_conf.png') sprite_layers[2].add_sprite(ship_conf) shifty1.render_update(renderer,sprite_layers,screen) i=0 while(i!=1): ##Infinite loop until menu is to be removed for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i=1 continue sprite_layers[2].remove_sprite(ship_conf) elif (map_name=='./maps/ship.tmx' and flag==1): imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((260,70),'Gate not accessible right now',(0,0,0),font=font) imgtx.save('./images/ship_conf.png') ship_conf=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,'./images/ship_conf.png') sprite_layers[2].add_sprite(ship_conf) shifty1.render_update(renderer,sprite_layers,screen) i=0 while(i!=1): ##Infinite loop until menu is to be removed for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i=1 continue sprite_layers[2].remove_sprite(ship_conf) #Flag=0-> showing the first message elif (map_name=='./maps/hotel.tmx' and flag==0): imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((260,70),'Welcome to Crossroads Inn',(0,0,0),font=font) draw.text((260,110),'(P)ay 50 gold, stay here and recover your health',(0,0,0),font=font) draw.text((260,150),' Bac(k)',(0,0,0),font=font) imgtx.save('./images/warning.png') warning=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,'./images/warning.png') sprite_layers[2].add_sprite(warning) shifty1.render_update(renderer,sprite_layers,screen) i=0 while(i!=1): #event handling -> P pressed-> pay 50 gold # K pressed-> go back for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_k): i=1 #"pos" list gives the co-ordinates where the hero will be standing after talking to receptionist #if pos=None -> hero's position remains same pos=None sprite_layers[2].remove_sprite(warning) if (event.type == pygame.KEYDOWN and event.key == pygame.K_p): sprite_layers[2].remove_sprite(warning) #if able to pay -> pay gold, increase health -> spawn in the hotel room("pos" list) if(ty['gold']>=50): ty['gold']-=50 hero_pos_x = 200 hero_pos_y = 920 pos=[hero_pos_x,hero_pos_y] ty['hp']=ty['max_hp'] i=1 pk.dump(ty,open("./save.p","wb")) else : #if pressed pay but dont have enough gold-> next message warning_msg('./maps/hotel.tmx',renderer,sprite_layers,screen,c_pos,1) continue return pos #Not enough gold message for the hotel map elif (map_name=='./maps/hotel.tmx' and flag==1): imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((260,70),'You Dont have enough money',(0,0,0),font=font) draw.text((260,150),' Bac(k)',(0,0,0),font=font) imgtx.save('./images/warning.png') warning=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,'./images/warning.png') sprite_layers[2].add_sprite(warning) shifty1.render_update(renderer,sprite_layers,screen) i=0 while(i!=1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_k): i=1 continue sprite_layers[2].remove_sprite(warning) #A common warning message to some places in the map -> pops up if the #condition for the message fulfilled in the parent file/function else: imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((260,70),'Something is missing',(0,0,0),font=font) imgtx.save('./images/warning.png') warning=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,'./images/warning.png') sprite_layers[2].add_sprite(warning) shifty1.render_update(renderer,sprite_layers,screen) return warning