Exemple #1
0
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)
Exemple #2
0
def demo_pygame(file_name, frm):
    # 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)

    #for background music and special sound effects
    mixer.init()
    sound1 = mixer.Sound('./sounds/ouch.ogg')
    sound2 = mixer.Sound('./sounds/stone.ogg')

    file = './sounds/Rock_Slide.ogg'
    m = mixer.music.load(file)
    #(-1) argument plays it infinitely unless stopped explicitly
    mixer.music.play(-1)

    #set up a screen
    screen_width = min(704, world_map.pixel_width)
    screen_height = min(800, 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 = screen_width / 2
    hero_pos_y = 6300
    #create hero on specified co-ordinates and with specified image
    hero = person.create_person(hero_pos_x, hero_pos_y, './images/up.png')

    #portal to detect change of map
    portal2 = pygame.Rect(0, 1 * 32, 21 * 32, 60)

    # create stones sprite
    stone_width = 3
    stone1_height = 3
    stone2_height = 4
    stone3_height = 5
    stone1 = []
    stone2 = []
    stone3 = []

    # dimensions of the hero for collision detection
    hero_width = hero.rect.width
    hero_height = 5

    # 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 to the the right layer
    sprite_layers[1].add_sprite(hero)

    # add stone positions
    stone1_pos_x = []
    stone1_pos_y = []
    stone2_pos_x = []
    stone2_pos_y = []
    stone3_pos_x = []
    stone3_pos_y = []

    # variables for the main loop
    clock = pygame.time.Clock()
    running = True
    speed_x = 4
    speed_y = 6
    last = 0
    #load the saved game variables based on game progress
    sv = pk.load(open("./save.p", "rb"))
    health = sv['hp']
    hp = sv['hp']
    hp_max = sv['max_hp']
    c_pos = [cam_world_pos_x, cam_world_pos_y]
    interf_toggle = 0
    interface = menu.create_interface(renderer, sprite_layers, screen, c_pos)
    hp_sprite = person.create_person(c_pos[0], c_pos[1], './images/hp_bar.png')
    l_g = menu.create_l_g(renderer, sprite_layers, screen, c_pos)
    [hp_sprite, hp] = menu.create_hp_bar(renderer, sprite_layers, screen,
                                         hp_sprite, c_pos)
    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)

    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT, 1000)
    cl = 0
    # mainloop
    while running:
        dt = clock.tick(40)
        sv = pk.load(open("./save.p", "rb"))

        # event handling
        for event in pygame.event.get():
            #update the health,experience and armour
            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)
            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

        #based on collision with environment decide number of steps allowed
        mov = climb.hero_climb(cl, hero_pos_x, hero_pos_y, hero, speed_x,
                               speed_y, sprite_layers[3])
        cl = mov[0]
        hero_pos_x = mov[1]
        hero_pos_y = mov[2]

        #check collision with portal to change map
        if (pygame.Rect.colliderect(portal2, hero.rect)):
            portal = True
            #stop the background music for this map
            mixer.music.stop()
            running = False

        # adjust camera according to the hero's position, follow him
        if (hero.rect.centery >= 6000):
            renderer.set_camera_position(350, 6000)
            c_pos = (350, 6000)
        elif (hero.rect.centery <= 400):
            renderer.set_camera_position(350, 400)
            c_pos = (350, 400)
        else:
            renderer.set_camera_position(350, hero.rect.centery)
            c_pos = (350, hero.rect.centery)

        #position health bar, experience bar and armour
        interface.rect.topleft = (c_pos[0] - 352, c_pos[1] - 384)
        hp_sprite.rect.topleft = (c_pos[0] - 240, c_pos[1] - 382)
        xp_sprite.rect.topleft = (c_pos[0] - 240, c_pos[1] - 345)
        l_g.rect.topleft = (c_pos[0] - 348, c_pos[1] - 381)

        # 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)

        time = (pygame.time.get_ticks() / 500)
        #to decide interval when to drop stones
        if time > last and len(stone1) + len(stone2) + len(stone3) < 30:
            last = time
            hero_temp_x = hero.rect.centerx
            #decide x co-ordinate of stone randomly
            r = random.randint(0, 100)
            if (r < 25):
                left_limit = hero_temp_x - 10
                right_limit = hero_temp_x + 10
            elif (r < 90):
                left_limit = hero_temp_x - 200
                right_limit = hero_temp_x + 200
                if (left_limit < 40):
                    left_limit = 40
                    right_limit = 400

                if (right_limit > 640):
                    left_limit = 300
                    right_limit = 660
            else:
                left_limit = 10
                right_limit = 690

            #to decide randomly the type of stone
            t = random.randint(0, math.floor(hero_pos_y))
            if t < 2000:
                t = 3
            elif t < 4000:
                t = 2
            else:
                t = 1
            permission = random.randint(left_limit, right_limit)
            if (permission < 50):
                permission = 55
            elif (permission > 650):
                permission = 645

            #append initial stone locations  and create stone sprites
            if (t == 1):
                stone1_pos_x.append(permission)
                stone1_pos_y.append(max(hero_pos_y - 800, 50))
                stone1.append(
                    create_stone(stone1_pos_x[len(stone1)],
                                 stone1_pos_y[len(stone1)], 1))
                sprite_layers[1].add_sprite(stone1[len(stone1) - 1])
            elif t == 2:
                stone2_pos_x.append(permission)
                stone2_pos_y.append(max(hero_pos_y - 800, 50))
                stone2.append(
                    create_stone(stone2_pos_x[len(stone2)],
                                 stone2_pos_y[len(stone2)], 2))
                sprite_layers[1].add_sprite(stone2[len(stone2) - 1])
            else:
                stone3_pos_x.append(permission)
                stone3_pos_y.append(max(hero_pos_y - 800, 50))
                stone3.append(
                    create_stone(stone3_pos_x[len(stone3)],
                                 stone3_pos_y[len(stone3)], 3))
                sprite_layers[1].add_sprite(stone3[len(stone3) - 1])

        n = 0
        while n < len(stone1):
            #moving the stones of type1
            step_x, step_y = climb.check_collision(
                stone1_pos_x[n], stone1_pos_y[n], 0,
                8 * (6400 - hero_pos_y) // 6400 + 10, stone_width,
                stone1_height, sprite_layers[3])
            stone1_pos_y[n] += step_y
            stone1[n].rect.midbottom = (stone1_pos_x[n], stone1_pos_y[n])
            #if stone is out of visible region remove stone sprite
            if (stone1_pos_y[n] >= hero_pos_y + 400
                    or stone1_pos_y[n] >= 6300):
                sprite_layers[1].remove_sprite(stone1[n])
                stone1.pop(n)
                stone1_pos_y.pop(n)
                stone1_pos_x.pop(n)
                #stop background music and play sound of stone reaching bottom of sea
                mixer.music.stop()
                sound2.play(0)
                #play background music again
                mixer.music.play(-1)
                continue
            else:
                n = n + 1
        #to check players' collision with stone type1
        n = hero.rect.collidelist(stone1)
        if n != -1:
            #remove stone sprite
            sprite_layers[1].remove_sprite(stone1[n])
            stone1.pop(n)
            stone1_pos_y.pop(n)
            stone1_pos_x.pop(n)
            #decrease the health
            health = health - 3
            sv['hp'] = health
            pk.dump(sv, open("./save.p", "wb"))
            mixer.music.stop()
            #play the hurt sound
            sound1.play(0)
            mixer.music.play(-1)

        if health <= 0:
            #go back to initial position
            hero_pos_x = screen_width / 2
            hero_pos_y = 6300
            sv['hp'] = sv['max_hp']
            health = sv['hp']

        n = 0
        #similarly for stones of type2
        while n < len(stone2):
            step_x, step_y = climb.check_collision(
                stone2_pos_x[n], stone2_pos_y[n], 0,
                8 * (6400 - hero_pos_y) // 6400 + 10, stone_width,
                stone2_height, sprite_layers[3])
            stone2_pos_y[n] += step_y
            stone2[n].rect.midbottom = (stone2_pos_x[n], stone2_pos_y[n])
            if (stone2_pos_y[n] >= hero_pos_y + 400
                    or stone2_pos_y[n] >= 6300):
                sprite_layers[1].remove_sprite(stone2[n])
                stone2.pop(n)
                stone2_pos_y.pop(n)
                stone2_pos_x.pop(n)
                mixer.music.stop()
                sound2.play(0)
                mixer.music.play(-1)
                continue
            else:
                n = n + 1
        n = hero.rect.collidelist(stone2)
        if n != -1:
            sprite_layers[1].remove_sprite(stone2[n])
            stone2.pop(n)
            stone2_pos_y.pop(n)
            stone2_pos_x.pop(n)
            health = health - 6
            sv['hp'] = health
            pk.dump(sv, open("./save.p", "wb"))
            mixer.music.stop()
            sound1.play(0)
            mixer.music.play(-1)
        if health <= 0:  # changes to switch screen to game over
            hero_pos_x = screen_width / 2
            hero_pos_y = 6300
            sv['hp'] = sv['max_hp']
            health = sv['hp']

        n = 0
        #similarly for stone of type3
        while n < len(stone3):
            step_x, step_y = climb.check_collision(
                stone3_pos_x[n], stone3_pos_y[n], 0,
                8 * (6400 - hero_pos_y) // 6400 + 10, stone_width,
                stone3_height, sprite_layers[3])
            stone3_pos_y[n] += step_y
            stone3[n].rect.midbottom = (stone3_pos_x[n], stone3_pos_y[n])
            if (stone3_pos_y[n] >= hero_pos_y + 400
                    or stone3_pos_y[n] >= 6300):
                sprite_layers[1].remove_sprite(stone3[n])
                stone3.pop(n)
                stone3_pos_y.pop(n)
                stone3_pos_x.pop(n)
                mixer.music.stop()
                sound2.play(0)
                mixer.music.play(-1)
                continue
            else:
                n = n + 1
        n = hero.rect.collidelist(stone3)
        if n != -1:
            sprite_layers[1].remove_sprite(stone3[n])
            stone3.pop(n)
            stone3_pos_y.pop(n)
            stone3_pos_x.pop(n)
            health = health - 10
            sv['hp'] = health
            pk.dump(sv, open("./save.p", "wb"))
            mixer.music.stop()
            sound1.play(0)
            mixer.music.play(-1)
        if health <= 0:
            hero_pos_x = screen_width / 2
            hero_pos_y = 6300  # changes to switch screen to game over
            sv['hp'] = sv['max_hp']
            health = sv['hp']

        pygame.display.flip()

    if portal == True:
        #chnage the map
        mountain_top.main()
Exemple #3
0
def demo_pygame(file_name,frm):

    # 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()

    #background music
    tunnel2_4_sound = sound.create_music(file_name)
    sound.volume(tunnel2_4_sound,0.2)
    
    # create hero sprite
    if frm==0:
        hero_pos_x = 5*32
        hero_pos_y = 95*32
    else:
        hero_pos_x = 81*32
        hero_pos_y = 62*32
    hero = person.create_person(hero_pos_x, hero_pos_y ,'./images/hero_u2.png')

    # create monster sprites
    mon = []
    mon_dir = []
    mon_image = []
    mon.append(person.create_person(16*32, 82*32,'./images/slime14.png'))
    mon.append(person.create_person(39*32, 82*32,'./images/slime14.png'))
    mon.append(person.create_person(50*32, 82*32,'./images/slime14.png'))
    mon.append(person.create_person(60*32, 82*32,'./images/slime14.png'))
    mon.append(person.create_person(67*32, 82*32,'./images/slime14.png'))
    mon.append(person.create_person(5*32, 74*32,'./images/slime14.png'))
    mon.append(person.create_person(5*32, 47*32,'./images/slime14.png'))
    mon.append(person.create_person(14*32, 47*32,'./images/slime14.png'))
    mon.append(person.create_person(23*32, 33*32,'./images/slime14.png'))
    mon.append(person.create_person(23*32, 20*32,'./images/slime14.png'))
    mon.append(person.create_person(20*32, 8*32,'./images/slime14.png'))
    mon.append(person.create_person(43*32, 8*32,'./images/slime14.png'))
    mon.append(person.create_person(43*32, 24*32,'./images/slime14.png'))
    mon.append(person.create_person(43*32, 41*32,'./images/slime14.png'))
    mon.append(person.create_person(49*32, 47*32,'./images/slime14.png'))
    mon.append(person.create_person(66*32, 47*32,'./images/slime14.png'))
    mon.append(person.create_person(72*32, 32*32,'./images/slime14.png'))
    mon.append(person.create_person(72*32, 23*32,'./images/slime14.png'))
    mon.append(person.create_person(72*32, 8*32,'./images/slime14.png'))
    mon.append(person.create_person(81*32, 8*32,'./images/slime14.png'))
    mon.append(person.create_person(81*32, 19*32,'./images/slime14.png')) 
    mon.append(person.create_person(81*32, 36*32,'./images/slime14.png'))
    mon.append(person.create_person(81*32, 49*32,'./images/slime14.png'))
    mon.append(person.create_person(67*32, 64*32,'./images/slime14.png'))
    mon.append(person.create_person(82*32, 64*32,'./images/slime14.png'))

    #list to save the direcion constraints for enemy's movements
    mon_dir = [-1,0,-1,0,1,0,1,0,1,0,0,-1,1,0,-1,0,0,-1,0,1,1,0,-1,0,0,1,0,-1,1,0,-1,0,0,-1,0,1,1,0,-1,0,0,1,0,-1,0,1,1,0,-1,0]
    
    # 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 and monsters to the the right layer
    sprite_layers[1].add_sprite(hero)
    i = 0
    for i in range(len(mon)):
        mon_image.append(1)
        sprite_layers[1].add_sprite(mon[i])

    # portal for entry and exit of hero
    portal1=pygame.Rect(4*32,96*32,3*32,2*32)
    portal2=pygame.Rect(85*32,61*32,1*32,3*32)
        
        
    # variables for the main loop
    clock = pygame.time.Clock()
    running = True # to run while loop
    speed = 10 # hero speed
    mr=ml=md=mu=0 # image variables(change images to show movements of hero)
    h_drctn = 'up'  # direction where hero facing right now
    life = 1 # to keep track wheather hero is alive or not
    arrow_list = [] # contains a list of arrows (currently on screen)
    arrow_dir = [] # directions of arrows

    HP_MON = [10.0]*(len(mon)) # health of monster
    point_arrow = 10.0 # decrease in health of enemy when arrow of hero collides with enemy
    point_enm = 1.0 # decrease in health of hero after collision with enemy
    enm_speed = 8.0 # speed of enemy

    savegame=pk.load(open("./save.p","rb"))
    old_xp = savegame['xp']
    old_level = savegame['h_level']
    old_armor = savegame['sheild_hp']
    old_arrow = savegame['arrow_count']

     # interface code
    c_pos=[cam_world_pos_x, cam_world_pos_y]
    interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) 
    hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') # hp bar interface
    l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) # level and gold interface
    [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos) 
    xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') # x interface
    xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos)
    f_i=menu.create_f_i(renderer,sprite_layers,screen,c_pos) # arrow,armor,sword interface
    interf_fight=menu.create_interface_fight(renderer,sprite_layers,screen,c_pos)

    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT, 1000)

    # mainloop
    while running:
        dt = clock.tick(50)
        savegame=pk.load(open("./save.p","rb"))

        # event handling
        for event in pygame.event.get():
            if (event.type == pygame.QUIT):
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_w and savegame['arrow_count'] > 0:
                    enemy_attack.create_arrow(arrow_list,arrow_dir,h_drctn,hero,sprite_layers) # create arrow on pressing 'w'
                    remove_mon(HP_MON,mon,mon_dir,mon_image,sprite_layers) # remove monster sprite if health bacomes zero
                    savegame['arrow_count'] -= 1 # decrease the arrow count and update in the dictionary
                    pk.dump(savegame,open("./save.p","wb")) # save the changes of dictionary
                elif event.key == pygame.K_a:
                     # attack with sword on pressing 'a'
                    enemy_attack.attack(h_drctn,hero,mon,HP_MON)
                    remove_mon(HP_MON,mon,mon_dir,mon_image,sprite_layers)

            # interface update
            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)

        # calling hero_move() function for hero's movements
        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]

        # to detect the direction of hero
        if(mu>1):
            h_drctn='up'
        elif(mr>1):
            h_drctn='right'
        elif(md>1):
            h_drctn='down'
        elif(ml>1):
            h_drctn='left'

        # decresing the HP of player if collides any of the monsters
        # if HP becomes zero then start the game again
        for i in range(len(mon)):
            if pygame.sprite.collide_rect(hero,mon[i]):
                ouch_sound = sound.create_soundfx('./sounds/weapon_touch.ogg')
                sound.volume(ouch_sound,0.4)
                if savegame['sheild_hp']>0:
                    savegame['sheild_hp'] -= (point_enm/2)
                    savegame['hp'] -= (point_enm/2)
                    if savegame['sheild_hp']<0:
                        savegame['sheild_hp'] = 0
                else :
                    savegame['hp'] -= point_enm 
                    if savegame['hp'] <= 0:
                        sound.stop_soundfx(tunnel2_4_sound)
                        savegame['xp'] = old_xp
                        savegame['h_level'] = old_level
                        savegame['sheild_hp'] = old_armor
                        savegame['arrow_count'] = old_arrow
                        savegame['hp'] = savegame['max_hp']
                        pk.dump(savegame,open("./save.p","wb"))
                        menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0)
                        life = 0
                        running = False
                pk.dump(savegame,open("./save.p","wb"))

        (mon_dir,mon,mon_image) = move_mon(mon_dir,mon,mon_image,sprite_layers,enm_speed) # monsters's movement
        enemy_attack.remove_arrow(arrow_list,mon,HP_MON,arrow_dir,sprite_layers,point_arrow) # remove arrow if it goes out of the screen
        remove_mon(HP_MON,mon,mon_dir,mon_image,sprite_layers) # remove monsters
        menu.update_lg(l_g,c_pos) #interface update
        
        # adjust camera according to the hero's position, follow him
        # (don't make the hero follow the cam, maybe later you want different
        #  objects to be followed by the cam)
        cam_pos_x = hero.rect.centerx
        cam_pos_y = hero.rect.centery
        if hero.rect.centerx <= 520 :
            cam_pos_x = 520
        elif hero.rect.centerx >=2336:
            cam_pos_x = 2336
        if hero.rect.centery >= 2875:
            cam_pos_y = 2875
        elif hero.rect.centery <=408:
            cam_pos_y = 408
        renderer.set_camera_position(cam_pos_x,cam_pos_y)

        # interface update
        c_pos=(cam_pos_x,cam_pos_y)
        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)

        # next map
        if pygame.Rect.colliderect(hero.rect,portal1) or pygame.Rect.colliderect(hero.rect,portal2) :
            portal=True
            sound.stop_soundfx(tunnel2_4_sound)
            running=False

        # clear screen, might be left out if every pixel is redrawn anyway
        screen.fill((0, 0, 0))
        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)

    # Game restarts              
    if life == 0:
        demo_pygame('./maps/tunnel2_4.tmx',0)

    elif portal==True:
        shifty1.demo_pygame('./maps/village1.tmx',1)
Exemple #4
0
def demo_pygame(file_name,frm):

    # 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()

    #background music
    tunnel3_sound = sound.create_music(file_name)
    sound.volume(tunnel3_sound,0.1)
    
    # create hero,enemy sprites
    hero_pos_x = 12*32
    hero_pos_y = 3*32
    hero = person.create_person(hero_pos_x, hero_pos_y,'./images/hero_u2.png')
    
    # create enemy,crabs and ring sprites
    enm1 = person.create_person(6*32, 22*32,'./images/slime_d1.png')
    enm2 = person.create_person(16*32, 22*32,'./images/slime_d1.png')
    crab = person.create_person(30*32, 38*32,'./images/crab.png')
    crab1 = person.create_person(49*32, 38*32,'./images/crab.png')
    ring = person.create_person(49*32, 33*32,'./images/ring.png')
    
    # cam_offset is for scrolling
    cam_world_pos_x = screen_width
    cam_world_pos_y = screen_height

    # 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 and enemies to the right layer
    sprite_layers[1].add_sprite(hero)
    sprite_layers[1].add_sprite(enm1)
    sprite_layers[1].add_sprite(enm2)
    
    # variables for the main loop
    clock = pygame.time.Clock()
    running = True  # to run while loop
    speed = 7  # hero speed
    mr=ml=md=mu=0  # image variables(change images to show movements of hero)
    
    flag_crab = 0  # a variable to check when to add crab's sprite
    drctn='down' # direction where hero facing right now
    life = 1 # to keep track wheather hero is alive or not
    enm =[enm1,enm2] # list of enemy sprites
    dx_enm = [1,1] # list of direction in x of enemies
    dy_enm = [-1,-1] # list of direction in y of enemies
    left_enm = [1*32,9*32] # left collision coordinate for enemies(after which it will return back)
    right_enm = [12*32,21*32] # right collision coordinate for enemies(after which it will return back)
    weap_dir = [] # directions of weapons 
    weap_list = [] # contains a list of weapons (currently on screen) 
    arrow_list = [] # contains a list of arrows (currently on screen)
    arrow_dir = [] # directions of arrows
    # contains a list of enemy images
    enmimages = ['./images/slime_d1.png','./images/slime_d2.png','./images/slime_d3.png','./images/slime_u1.png','./images/slime_u2.png','./images/slime_u3.png']
    gold = [] # contains a list of gold (currently on screen)
    heart = [] # contains a list of heart (currently on screen)
    image_variable = [0,0]
    flag_ring = 0
    tic_flag = 0
    x = 0
    portal1 = pygame.Rect(58*32,28*32,2*32,8*32)
    portal=False

    point_weapon = 2.0 # decrease in health of hero when weapon of enemy collides with hero
    point_arrow = 15.0 # decrease in health of enemy when arrow of hero collides with enemy
    crab_attack = 10.0 # attack of crab
    point_heal = 20.0 # increase in health after healing
    HP_CRAB = 30.0 # health of crab
    gold_increase = 5 # increase in health of hero after getting gold
    heart_increase = 5.0 # increase in health of hero after getting heart
    speed_enm = 6 # speed of enemy
    HP_ENM = [100.0,100.0] # health of enemies
    hero_attack = 10 # hero attack
    defense_hero = 5 # hero defense

    #old variables to restore if hero dies in this map
    savegame=pk.load(open("./save.p","rb"))
    old_xp = savegame['xp']
    old_level = savegame['h_level']
    old_gold = savegame['gold']
    old_armor = savegame['sheild_hp']
    old_arrow = savegame['arrow_count']
    
    # interface code
    c_pos=[cam_world_pos_x, cam_world_pos_y]
    interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) 
    hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') # hp bar interface
    l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) # level and gold interface
    [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos)
    xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') # xp interface
    xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos)
    f_i=menu.create_f_i(renderer,sprite_layers,screen,c_pos) # arrow,armor,sword interface
    interf_fight=menu.create_interface_fight(renderer,sprite_layers,screen,c_pos)
    
    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT, 1000)

    # mainloop
    while running:
        dt = clock.tick(50)
        savegame=pk.load(open("./save.p","rb"))
        
        #set coordinates on which turn based fighting appears
        if(hero_pos_x > 24*32 and flag_crab == 0 and len(enm)==0):    
            flag_crab = 1
        if(hero_pos_x > 43*32 and flag_crab == 2):
            flag_crab = 3
           
        # event handling
        for event in pygame.event.get():
            if (event.type == pygame.QUIT):
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_w and savegame['arrow_count'] > 0:
                    enemy_attack.create_arrow(arrow_list,arrow_dir,drctn,hero,sprite_layers) # create arrow on pressing 'w'
                    enemy_attack.remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart) # remove enemy sprite if health bacomes zero
                    savegame['arrow_count'] -=1 # decrease the arrow count and update in the dictionary
                    pk.dump(savegame,open("./save.p","wb")) # save the changes of dictionary
                elif event.key == pygame.K_a:
                    # attack with sword on pressing 'a'
                    enemy_attack.attack(drctn,hero,enm,HP_ENM)
                    enemy_attack.remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart) # remove enemy sprite if health bacomes zero

            # interface update
            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)

        # if one enemy dies then other enemy's walking area increases(other enemy covers the region of previous enemy)            
        if len(enm)==1:
            right_enm[0] = 19*32
            left_enm[0] = 2*32
            
        # add crab sprite for turn based fighting
        if(flag_crab == 1):
            sprite_layers[1].add_sprite(crab)
            flag_crab = 2
            x = 35
            (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
        elif(flag_crab == 3):
            crab = crab1
            x = 54
            sprite_layers[1].add_sprite(crab)
            HP_CRAB = 30.0
            flag_crab = 4
            (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)

        # loop for turn based fighting until crab doesn't die
        while(HP_CRAB > 0 and (flag_crab==2 or flag_crab==4)):
            for event in pygame.event.get():
                # heal on pressing 'h'
                if event.type == pygame.KEYDOWN and event.key == pygame.K_h and tic_flag==0:
                    heal_sound = sound.create_soundfx('./sounds/heal.ogg')
                    sound.volume(heal_sound,0.4)
                    heal = person.create_person(hero.rect.centerx,hero.rect.top+11,'./images/heal_1.png') # create the heal sprite
                    sprite_layers[2].add_sprite(heal) # add the sprite to the right layer
                    savegame['hp'] += point_heal # increase the health and upadte in the dictionary
                    if savegame['hp'] > savegame['max_hp']:
                        savegame['hp'] = savegame['max_hp']
                    pk.dump(savegame,open("./save.p","wb")) # save the changes in dictionary
                    # interface update
                    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)
                    # image update
                    while tic_flag<=13:
                        heal.image=pygame.image.load('./images/heal_1.png')
                        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                        heal.image=pygame.image.load('./images/heal_2.png')
                        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                        heal.image=pygame.image.load('./images/heal_3.png')
                        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                        tic_flag += 1
                    tic_flag = 25
                    # remove the heal sprite
                    sprite_layers[2].remove_sprite(heal)
                    # rendering
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                elif event.type == pygame.KEYDOWN and event.key == pygame.K_a and tic_flag==0:
                    # hero attacks on pressing 'a'
                    sword_sound = sound.create_soundfx('./sounds/sword.ogg')
                    sound.volume(sword_sound,0.4)
                    var_attack_hero = random.randint(hero_attack-2.0, hero_attack+2.0)
                    HP_CRAB -= var_attack_hero # crab's health decreases
                    enemy_attack.create_score(var_attack_hero)
                    # crab's image changes after hero attacks
                    crab.image=pygame.image.load('./images/crab_1.png')
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    crab.image=pygame.image.load('./images/crab_2.png')
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    crab.image=pygame.image.load('./images/crab_3.png')
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    crab.image=pygame.image.load('./images/crab_3.png')
                    # create the score sprite and add it
                    score = person.create_person(x*32,32*32,'./images/sample-out.png')
                    sprite_layers[1].add_sprite(score)
                    while(tic_flag<25):
                        score.rect.centery -= 2
                        tic_flag += 1
                        if(tic_flag == 25): sprite_layers[1].remove_sprite(score)
                        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    crab.image=pygame.image.load('./images/crab.png')
            if tic_flag == 25:
                pygame.time.delay(1000)
                # crab attacks
                var_attack_crab = random.randint(crab_attack-2.0,crab_attack+2.0)
                var_defense_hero = random.randint(defense_hero-3.0,defense_hero)
                sh = (var_attack_crab - var_defense_hero)
                if  sh<0 : sh = 0
                enemy_attack.create_score(sh)
                savegame['hp'] -= (sh)
                pk.dump(savegame,open("./save.p","wb"))
                # crab's image changes when it attacks
                shine = 0
                while shine < 10 :
                    crab.image=pygame.image.load('./images/crab(1).png')
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    crab.image=pygame.image.load('./images/crab.png')
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    shine += 1
                turnbase_sound = sound.create_soundfx('./sounds/turnbase_touch.ogg')
                sound.volume(turnbase_sound,0.4)
                # interface update
                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)
                # create the score sprite and add it  
                score = person.create_person(hero_pos_x-32,hero_pos_y-32,'./images/sample-out.png')
                sprite_layers[1].add_sprite(score)
                while(tic_flag>0):
                    score.rect.centery += 2
                    tic_flag -= 1
                    if(tic_flag == 0): sprite_layers[1].remove_sprite(score)
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    
        # if crab's HP is zero then remove its sprite
        if(HP_CRAB <= 0) :
            sprite_layers[1].remove_sprite(crab)

        # add the ring sprite when second crab dies
        if(x==54):
            sprite_layers[1].add_sprite(ring)

        # increase the xp of player after killing the crab
        if(x==35 or x==54):
            savegame['xp'] +=15
            pk.dump(savegame,open("./save.p","wb"))
            x = 30

        # remove sprite when hero collides ring
        if pygame.sprite.collide_rect(hero,ring) and flag_ring!=1:
            ring_sound = sound.create_soundfx('./sounds/gold_heart.ogg')
            sound.volume(ring_sound,0.5)
            sprite_layers[1].remove_sprite(ring)
            flag_ring = 1
            ring_take=person.create_person(hero.rect.centerx,hero.rect.centery+200,'./images/ring_take.png')
            sprite_layers[2].add_sprite(ring_take)
            (renderer,sprite_layers,screen) = 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(ring_take)

        # calling hero_move() function for hero's movements
        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]

        # to detect the direction of hero
        if(mu>1):
            drctn='up'
        elif(mr>1):
            drctn='right'
        elif(md>1):
            drctn='down'
        elif(ml>1):
            drctn='left'

        enemy_attack.create_weapons(weap_list,sprite_layers,enm,weap_dir,dy_enm,0) # create the weapons
        enemy_attack.move_enemy(enm,right_enm,left_enm,dx_enm,speed_enm)  # random movement of enemy
        enemy_attack.dir_update(enm,hero,dy_enm) # direction update of enemy
        enemy_attack.image_update(enm,image_variable,dy_enm,enmimages) # image update of enemy

        enemy_attack.remove_arrow(arrow_list,enm,HP_ENM,arrow_dir,sprite_layers,point_arrow) # remove arrow if it goes out of the screen
        enemy_attack.remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart) # remove enemy if health of enemy becomes zero
        enemy_attack.remove_weapon(hero,enm,weap_list,weap_dir,point_weapon,sprite_layers) # remove weapon

        # interface update
        menu.update_f_i(f_i,c_pos)

        i = 0
        l = len(gold)
        # if hero collides with gold sprite then increase the gold count and remove the sprite
        while(i>=0 and i<l):
            if pygame.sprite.collide_rect(hero,gold[i]):
                savegame=pk.load(open("./save.p","rb"))
                savegame['gold'] += gold_increase
                pk.dump(savegame,open("./save.p","wb"))
                gold_sound = sound.create_soundfx('./sounds/gold_heart.ogg')
                sound.volume(gold_sound,0.3)
                sprite_layers[1].remove_sprite(gold[i])
                gold.pop(i)
            else: i+= 1
            l = len(gold)

        # if hero collides with heart sprite then increase the hp and remove the sprite
        i = 0
        l = len(heart)
        while(i>=0 and i<l):
            if pygame.sprite.collide_rect(hero,heart[i]):
                savegame=pk.load(open("./save.p","rb"))
                savegame['hp'] += heart_increase
                if savegame['hp'] > savegame['max_hp']:
                    savegame['hp'] = savegame['max_hp']
                pk.dump(savegame,open("./save.p","wb"))
                heart_sound = sound.create_soundfx('./sounds/gold_heart.ogg')
                sound.volume(heart_sound,0.3)
                sprite_layers[1].remove_sprite(heart[i])
                heart.pop(i)
            else: i+= 1
            l = len(heart)

        # game starts again if player dies
        if savegame['hp'] <= 0:
            sound.stop_soundfx(tunnel3_sound)
            savegame['xp'] = old_xp
            savegame['h_level'] = old_level
            savegame['gold'] = old_gold
            savegame['sheild_hp'] = old_armor
            savegame['arrow_count'] = old_arrow
            savegame['hp'] = savegame['max_hp']
            pk.dump(savegame,open("./save.p","wb"))
            menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0)
            life = 0
            running = False

        # another map starts 
        if (flag_ring==1 and pygame.Rect.colliderect(hero.rect,portal1)):
            portal=True
            sound.stop_soundfx(tunnel3_sound)
            running=False

            
        # adjust camera according to the hero's position, follow him
        cam_pos_x = hero.rect.centerx
        cam_pos_y = hero.rect.centery
        if hero.rect.centerx <= 524 :
            cam_pos_x = 524
        elif hero.rect.centerx >=1459:
            cam_pos_x = 1459
        if hero.rect.centery <=406:
            cam_pos_y = 406
        renderer.set_camera_position(cam_pos_x,cam_pos_y)

        # interface update
        c_pos=(cam_pos_x,cam_pos_y)
        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)

        # clear screen, might be left out if every pixel is redrawn anyway
        screen.fill((0, 0, 0))
        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
    if life == 0:
        demo_pygame('./maps/tunnel3.tmx',0)

    elif portal==True:
        shifty1.demo_pygame('./maps/ship.tmx',0)
def demo_pygame(file_name,frm):

    #portal
    portal=False

    # 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()

    #background music
    mountain_top_sound = sound.create_music(file_name)
    sound.volume(mountain_top_sound,0.1)
    
    # create hero
    hero_pos_x = 3*32
    hero_pos_y = 17*32
    hero = person.create_person(hero_pos_x, hero_pos_y,'./images/hero_u2.png')

    # create enemy sprites
    enm = []
    enm.append(person.create_person(19*32, 8*32,'./images/s1.png'))
    enm.append(person.create_person(19*32, 22*32,'./images/s2.png'))
    enm.append(person.create_person(24*32, 11*32,'./images/s1.png'))
    enm.append(person.create_person(26*32, 19*32,'./images/s2.png'))
    lizard = person.create_person(12*32, 22*32,'./images/lizard.png')

    # create the rectangle for portal
    portal1=pygame.Rect(16*32,3*32,3*32,1*32)
    
    # cam_offset is for scrolling
    cam_world_pos_x = 516
    cam_world_pos_y = 404

    # 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 and enemies the the right layer
    sprite_layers[1].add_sprite(hero)
    
    # variables for the main loop
    clock = pygame.time.Clock()
    running = True # to run while loop
    speed = 5 # hero speed
    mr=ml=md=mu=0 # image variables(change images to show movements of hero)
    
    flag_lizard = 0 # a variable to check when to add crab's sprite
    tic_flag = 0
    drctn='down'  # direction where hero facing right now
    life = 1 # to keep track wheather hero is alive or not
    dx_enm = [-1,1,1,-1] # list of direction in x of enemies
    dy_enm = [1,-1,1,-1] # list of direction in y of enemies
    left_enm = [15*32,16*32,21*32,23*32] # left collision coordinate for enemies(after which it will return back)
    right_enm = [21*32,23*32,26*32,29*32] # right collision coordinate for enemies(after which it will return back)
    weap_dir = [] # directions of weapons 
    weap_list = [] # contains a list of weapons (currently on screen) 
    arrow_list = [] # contains a list of arrows (currently on screen)
    arrow_dir = [] # directions of arrows
    gold = [] # contains a list of gold (currently on screen)
    heart = [] # contains a list of heart (currently on screen)
    flag_enm = 0

    point_weapon = 1.0 # decrease in health of hero when weapon of enemy collides with hero
    point_arrow = 15.0 # decrease in health of enemy when arrow of hero collides with enemy
    lizard_attack = 10.0 # attack of lizard
    point_heal = 10.0 # increase in health after healing
    HP_LIZARD = 30.0 # health of lizard
    gold_increase = 5
    gold_increase = 5 # increase in health of hero after getting gold
    heart_increase = 5.0 # increase in health of hero after getting heart
    speed_enm = 6 # speed of enemy
    HP_ENM = [100.0,100.0,100.0,100.0] # health of enemies
    hero_attack = 10 # hero attack
    defense_hero = 5 # hero defense

    #old variables to restore if hero dies in this map
    savegame=pk.load(open("save.p","rb"))
    old_xp = savegame['xp']
    old_level = savegame['h_level']
    old_gold = savegame['gold']
    old_armor = savegame['sheild_hp']
    old_arrow = savegame['arrow_count']

    # interface code
    c_pos=[cam_world_pos_x, cam_world_pos_y]
    interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) 
    hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') # hp bar interface
    l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) # level and gold interface
    [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos)
    xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') # xp interface
    xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos) # arrow,armor,sword interface
    f_i=menu.create_f_i(renderer,sprite_layers,screen,c_pos) # arrow,armor,sword interface
    interf_fight=menu.create_interface_fight(renderer,sprite_layers,screen,c_pos)

    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT, 1000)

    # mainloop
    while running:
        dt = clock.tick()
        savegame=pk.load(open("./save.p","rb"))

        #set coordinates on which turn based fighting appears
        if(hero_pos_x > 5*32 and flag_lizard == 0):    
            flag_lizard = 1
        elif (hero_pos_x > 16*32 and flag_enm == 0):
            flag_enm = 1
            
        # event handling
        for event in pygame.event.get():
            if (event.type == pygame.QUIT or portal == True):
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_w and ['arrow_count'] > 0 and flag_enm == 2:
                    enemy_attack.create_arrow(arrow_list,arrow_dir,drctn,hero,sprite_layers) # create arrow on pressing 'w'
                    enemy_attack.remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart) # remove enemy sprite if health bacomes zero
                    savegame['arrow_count'] -=1 # decrease the arrow count and update in the dictionary
                    pk.dump(savegame,open("./save.p","wb")) # save the changes of dictionary
                elif event.key == pygame.K_a:
                    # attack with sword on pressing 'a'
                    enemy_attack.attack(drctn,hero,enm,HP_ENM)
                    enemy_attack.remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart) # remove enemy sprite if health bacomes zero

            # interface update
            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)
            
        # add lizard sprite for turn based fighting
        if(flag_lizard == 1):
            sprite_layers[1].add_sprite(lizard)
            flag_lizard = 2
            (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)

        # loop for turn based fighting until lizard doesn't die
        while(HP_LIZARD > 0 and flag_lizard==2 ):
            for event in pygame.event.get():
                # heal on pressing 'h'
                if event.type == pygame.KEYDOWN and event.key == pygame.K_h and tic_flag==0:
                    heal_sound = sound.create_soundfx('./sounds/heal.ogg')
                    sound.volume(heal_sound,0.4)
                    heal = person.create_person(hero.rect.centerx,hero.rect.top+11,'./images/heal_1.png')  # create the heal sprite
                    sprite_layers[2].add_sprite(heal) # add the sprite to the right layer
                    savegame['hp'] += point_heal # increase the health and upadte in the dictionary
                    if savegame['hp'] > savegame['max_hp']:
                        savegame['hp'] = savegame['max_hp']
                    pk.dump(savegame,open("./save.p","wb")) # save the changes in dictionary
                    # interface update
                    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)
                    # image update
                    while tic_flag<=13:
                        heal.image=pygame.image.load('./images/heal_1.png')
                        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                        heal.image=pygame.image.load('./images/heal_2.png')
                        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                        heal.image=pygame.image.load('./images/heal_3.png')
                        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                        tic_flag += 1
                    tic_flag = 25
                    # remove the heal sprite
                    sprite_layers[2].remove_sprite(heal)
                    # rendering
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)               
                elif event.type == pygame.KEYDOWN and event.key == pygame.K_a and tic_flag==0:
                    # hero attacks on pressing 'a'
                    sword_sound = sound.create_soundfx('./sounds/sword.ogg')
                    sound.volume(sword_sound,0.4)
                    var_attack_hero = random.randint(hero_attack-2.0, hero_attack+2.0)
                    HP_LIZARD -= var_attack_hero # lizard's health decreases
                    enemy_attack.create_score(var_attack_hero)
                    # lizard's image changes after hero attacks
                    lizard.image=pygame.image.load('./images/lizard_1.png')
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    lizard.image=pygame.image.load('./images/lizard_2.png')
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    lizard.image=pygame.image.load('./images/lizard_3.png')
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    # create the score sprite and add it
                    score = person.create_person(16*32,17*32,'./images/sample-out.png')
                    sprite_layers[1].add_sprite(score)
                    while(tic_flag<25):
                        score.rect.centery -= 2
                        tic_flag += 1
                        if(tic_flag == 25): sprite_layers[1].remove_sprite(score)
                        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    lizard.image=pygame.image.load('./images/lizard.png')
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
            if tic_flag == 25:
                pygame.time.delay(1000)
                # lizard attacks
                var_attack_lizard = random.randint(lizard_attack-2.0,lizard_attack+2.0)
                var_defense_hero = random.randint(defense_hero-3.0,defense_hero)
                sh = (var_attack_lizard - var_defense_hero)
                if  sh<0 : sh = 0
                enemy_attack.create_score(sh)
                savegame['hp'] -= (sh)
                pk.dump(savegame,open("./save.p","wb"))
                # lizard's image changes when it attacks
                shine = 0
                while shine < 10 :
                    lizard.image=pygame.image.load('./images/lizard(1).png')
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    lizard.image=pygame.image.load('./images/lizard.png')
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
                    shine += 1
                turnbase_sound = sound.create_soundfx('./sounds/turnbase_touch.ogg')
                sound.volume(turnbase_sound,0.4)
                # interface update
                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)
                # create the score sprite and add it  
                score = person.create_person(hero_pos_x-32,hero_pos_y-32,'./images/sample-out.png')
                sprite_layers[1].add_sprite(score)
                while(tic_flag>0):
                    score.rect.centery += 2
                    tic_flag -= 1
                    if(tic_flag == 0): sprite_layers[1].remove_sprite(score)
                    (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)

        # if lizard's HP is zero then remove its sprite
        if(HP_LIZARD <= 0) :
            sprite_layers[1].remove_sprite(lizard)
            HP_LIZARD = 10000.0
            flag_lizard = 3

        # increase the xp of player after killing the lizard
        if(flag_lizard == 3):
            savegame=pk.load(open("./save.p","rb"))
            savegame['xp'] +=20
            pk.dump(savegame,open("./save.p","wb"))
            flag_lizard = 4

        # add enemies after a particular coordinate
        if flag_enm == 1:
            i = 0
            for i in range(len(enm)):
                sprite_layers[1].add_sprite(enm[i])
            flag_enm = 2 
            
        # calling hero_move() function for hero's movements
        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]

        # to detect the direction of hero
        if(mu>1):
            drctn='up'
        elif(mr>1):
            drctn='right'
        elif(md>1):
            drctn='down'
        elif(ml>1):
            drctn='left'

        if flag_enm == 2:
            enemy_attack.create_weapons(weap_list,sprite_layers,enm,weap_dir,dy_enm,0) # create the weapons
            enemy_attack.move_enemy(enm,right_enm,left_enm,dx_enm,speed_enm)   # random movement of enemy
            enemy_attack.remove_arrow(arrow_list,enm,HP_ENM,arrow_dir,sprite_layers,point_arrow) # remove arrow if it goes out of the screen
            enemy_attack.remove_weapon(hero,enm,weap_list,weap_dir,point_weapon,sprite_layers) # remove weapon
            enemy_attack.remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart) # remove enemy if health of enemy becomes zero
        
        i = 0
        l = len(gold)
        # if hero collides with gold sprite then increase the gold count and remove the sprite
        while(i>=0 and i<l):
            if pygame.sprite.collide_rect(hero,gold[i]):
                savegame=pk.load(open("./save.p","rb"))
                savegame['gold'] += gold_increase
                pk.dump(savegame,open("./save.p","wb"))
                gold_sound = sound.create_soundfx('./sounds/gold_heart.ogg')
                sound.volume(gold_sound,0.3)
                sprite_layers[1].remove_sprite(gold[i])
                gold.pop(i)
            else: i+= 1
            l = len(gold)
            
        i = 0
        l = len(heart)
        # if hero collides with heart sprite then increase the hp and remove the sprite
        while(i>=0 and i<l):
            if pygame.sprite.collide_rect(hero,heart[i]):
                savegame=pk.load(open("./save.p","rb"))
                savegame['hp'] += heart_increase
                if savegame['hp'] > savegame['max_hp']:
                    savegame['hp'] = savegame['max_hp']
                pk.dump(savegame,open("./save.p","wb"))
                heart_sound = sound.create_soundfx('./sounds/gold_heart.ogg')
                sound.volume(heart_sound,0.3)
                sprite_layers[1].remove_sprite(heart[i])
                heart.pop(i)
            else: i+= 1
            l = len(heart)
        
        if savegame['hp'] <= 0:
            # game starts again if player dies
            sound.stop_soundfx(mountain_top_sound)
            savegame['xp'] = old_xp
            savegame['h_level'] = old_level
            savegame['gold'] = old_gold
            savegame['sheild_hp'] = old_armor
            savegame['arrow_count'] = old_arrow
            savegame['hp'] = savegame['max_hp']
            pk.dump(savegame,open("./save.p","wb"))
            menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0)
            life = 0
            running = False
        elif len(enm)==0 and len(heart)==0 and len(gold)==0 and HP_LIZARD==10000.0:
            # another map starts
            l = len(weap_list)
            while(i>=0 and i<l):
                sprite_layers[2].remove_sprite(weap_list[i])
                weap_list.pop(i)
                l = len(enm)
            i = 0
            l = len(arrow_list)
            while(i>=0 and i<l):
                sprite_layers[1].remove_sprite(arrow_list[i])
                arrow_list.pop(i)
                l = len(arrow_list)
            sound.stop_soundfx(mountain_top_sound)
            render_update(renderer,sprite_layers,screen)
            portal=True
         
        # adjust camera according to the hero's position, follow him
        cam_pos_x = hero.rect.centerx
        cam_pos_y = hero.rect.centery
        if hero.rect.centerx <= 516 :
            cam_pos_x = 516
        elif hero.rect.centerx >=766:
            cam_pos_x = 766
        if hero.rect.centery <=404:
            cam_pos_y = 404
        elif hero.rect.centery >=570:
            cam_pos_y = 570
        renderer.set_camera_position(cam_pos_x,cam_pos_y)

        # adjust camera according to the hero's position, follow him
        c_pos=(cam_pos_x,cam_pos_y)
        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]+380)

        # clear screen, might be left out if every pixel is redrawn anyway
        screen.fill((0, 0, 0))
        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
        
    if life == 0:
        demo_pygame('./maps/mountain_top.tmx',0)
    elif portal==True:
        pal_lava.main()
Exemple #6
0
def demo_pygame(file_name):
 
    file = './sounds/Firestrm.ogg'
    # 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()
    # loading the sound files in different sound formats of mixer and main background sound in mixer stream 
    sound_ouch = mixer.Sound('./sounds/pain.ogg')
    mixer.music.load(file)
    mixer.music.play(-1);
	
    # 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()

    # create hero sprite
    # use floats for hero position
    hero_pos_x = 18*32+16
    hero_pos_y = 22*32
    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 = 5
	# create knife sprite
    knife_pos_x =  8 *32 
    knife_pos_y = 21 * 32 
    knife = create_knife(knife_pos_x, knife_pos_y)
	# create coin sprite
    coin_pos_x = 28*32 +16
    coin_pos_y = 16*32
    coin = create_coin(coin_pos_x, coin_pos_y)
 
    # cam_offset is for scrolling
    cam_world_pos_x = 1024/2
    cam_world_pos_y = 768/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[3].add_sprite(hero)
    sprite_layers[2].add_sprite(coin)
    sprite_layers[2].add_sprite(knife)

    # layer add/remove hero keys
    num_keys = [pygame.K_0, pygame.K_1, pygame.K_2, pygame.K_3, pygame.K_4, \
                    pygame.K_5, pygame.K_6, pygame.K_7, pygame.K_8, pygame.K_9]


    ###FOR INTERFACE on top-left corner loading the libraries from menu file and loading the local variables into the function 
    savegame=pk.load(open("./save.p","rb"))
    HERO_HEALTH = savegame['hp'] # loading the last hero health 
    hp=savegame['hp']
    hp_max=savegame['max_hp']   # keep updating the values in pk file 
    c_pos=[cam_world_pos_x, cam_world_pos_y]
    
	#c_pos=camra.camera(file_name,renderer,hero)       
    interf_toggle=0
    interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) 
    hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png')
    l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos)
    [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos)
	#for showing the xp in the interface
    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)

    # variables for the main loop
    clock = pygame.time.Clock()
    running = True
    speed = 4.75
	# setting up an environment for shifting the map while exiting from the map
    portal1 = pygame.Rect(17*32,22*32,96,32)
    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT, 1000)
    mr=ml=md=mu=0
    
    # mainloop
    while running:
        dt = clock.tick(50)  # value set to work same with different processors 
		## continously moving the interface and saving the health and other data in the files
        savegame=pk.load(open("./save.p","rb"))
        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)

        # 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
                    mixer.music.stop()


            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)

        # find directions
		# loading commom movement of hero stored in movements1 file and chaning its positions 
        mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[4])
        mr = mov[0]
        ml = mov[1]
        md = mov[2]
        mu = mov[3]
        hero_pos_x = mov[4]
        hero_pos_y = mov[5]
        # fire collision health loss 
        if(fire_ouch(hero_pos_x,hero_pos_y,sprite_layers[1])):
            sound_ouch.play()
            dmg=0.85
			# updating the new health
            menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,dmg)
            savegame['hp'] -=dmg
            HERO_HEALTH -=dmg
            if(HERO_HEALTH < 0):
				# setting the hero kill position from fire
                savegame['hp']=savegame['max_hp']
                HERO_HEALTH = savegame['hp']
                hero_pos_x = 18*32+16
                hero_pos_y = 22*32
				# if knife and coin not taken adding them here 
                if( not sprite_layers[2].contains_sprite(knife)):
                 sprite_layers[2].add_sprite(knife)
                if( not sprite_layers[2].contains_sprite(coin)):
                 sprite_layers[2].add_sprite(coin)

            
        # getting coin here
        if(pygame.sprite.collide_rect(hero,coin)):
           sprite_layers[2].remove_sprite(coin)

        #getting knife here
        if(pygame.sprite.collide_rect(hero,knife)):
           sprite_layers[2].remove_sprite(knife)
		# collision with portal for changing map
        if(portal1.collidepoint(hero.rect.midbottom) and not sprite_layers[2].contains_sprite(coin) \
            and not sprite_layers[2].contains_sprite(knife)):
            mixer.music.stop()
            savegame['b_h_vil']=1
            savegame['talk_vil']['./maps/village1.tmx'][1]=1
            savegame['dagger']=1
            savegame['eqp_weapon']='dagger'
            pk.dump(savegame,open("./save.p","wb"))
            running=False
            #CODE FOR MAP CHANGING HERE.........
        # condition for shifting map
        
        # adjust camera according to the hero's position, follow him
        # (don't make the hero follow the cam, maybe later you want different
        #  objects to be followd by the cam)
        #renderer.set_camera_position(hero.rect.centerx, hero.rect.centery)

        # 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)

        pk.dump(savegame,open("./save.p","wb"))
        pygame.display.flip()
	# calling the other map after completion of catching all the fishes
    shifty1.demo_pygame('./maps/village1.tmx',2) 
Exemple #7
0
def demo_pygame(file_name,frm):

    # 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()

    #background music
    battlefield_sound = sound.create_music(file_name)
    
    # create hero
    hero_pos_x = 10*32
    hero_pos_y = 41*32
    hero = person.create_person(hero_pos_x, hero_pos_y,'./images/hero_u2.png')
    
    # create enemy sprites
    enm = []
    enm.append(person.create_person(10*32, 3*32,'./images/haabu_d1.png'))
    enm.append(person.create_person(14*32, 3*32,'./images/haabu_d1.png'))
    enm.append(person.create_person(10*32, 7*32,'./images/haabu_d1.png'))
    enm.append(person.create_person(14*32, 7*32,'./images/haabu_d1.png'))

    # create dragon sprite
    dragon = person.create_person(10*32, 27*32,'./images/dragon_d1.png')
    
    # cam_offset is for scrolling
    cam_world_pos_x = 520
    cam_world_pos_y = 1050

    # 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 and enemies the the right layer
    sprite_layers[1].add_sprite(hero)
    sprite_layers[1].add_sprite(dragon)
    i = 0
    for i in range(len(enm)):
        sprite_layers[1].add_sprite(enm[i])
    
    # variables for the main loop
    clock = pygame.time.Clock()
    running = True # to run while loop
    speed = 7  # hero speed 
    mr=ml=md=mu=0  # image variables(change images to show movements of hero)
    
    tic_flag = 0
    drctn='down' # direction where hero facing right now
    life = 1 # to keep track wheather hero is alive or not
    arrow_list = [] # contains a list of arrows (currently on screen)
    arrow_dir = [] # directions of arrows
    enm_dir = [0,0,0,0]
    drag = [dragon]
    dx_dragon = [0]
    image_variable = [0]
    weap_dir = [] # directions of weapons 
    weap_list = [] # contains a list of weapons (currently on screen)
    color_change = 0 # a color variable for dragon
    dy_dragon = [1] # dragon direction
    specialarrow_list = [] # contains a list of specialarrows (currently on screen)
    specialarrow_dir = [] # directions of specialarrows
    dragonimages = ['./images/dragon_d1.png','./images/dragon_d2.png','./images/dragon_d3.png','./images/dragon_u1.png','./images/dragon_u2.png','./images/dragon_u3.png']
    enemyimages = ['./images/haabu_d1.png','./images/haabu_d2.png','./images/haabu_d3.png','./images/haabu_u1.png','./images/haabu_u2.png','./images/haabu_u3.png']
    chk = 0

    HP_ENM = [100.0,100.0,100.0,100.0] # health of enemies
    HP_DRAGON = [100.0] # health of dragon
    SPECIALARROW = 5    
    point_weapon = 1.0   # decrease in health of hero when weapon OR haabu collides with hero  ## HAABU MEANS ENEMY (in HINDI)
    point_arrow = 20.0    # arrow enemy collision
    point_dragon = 5.0    # hero dragon collision
    point_specialarrow = 10.0  # specialarrow hero collision
    haabu_speed = 6
    dragon_speed = 8

    #old variables to restore if hero dies in this map
    savegame=pk.load(open("./save.p","rb"))
    old_xp = savegame['xp']
    old_level = savegame['h_level']
    old_armor = savegame['sheild_hp']
    old_arrow = savegame['arrow_count']

     # interface code
    c_pos=[cam_world_pos_x, cam_world_pos_y]
    interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) 
    hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') # hp bar interface
    l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) # level and gold interface
    [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos) 
    xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') # xp interface
    xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos)
    s_a=menu.create_s_a(renderer,sprite_layers,screen,c_pos)
    f_i=menu.create_f_i(renderer,sprite_layers,screen,c_pos) # arrow,armor,sword interface
    interf_fight=menu.create_interface_fight(renderer,sprite_layers,screen,c_pos)
    spec_interf=menu.create_interface_spec_arrow(renderer,sprite_layers,screen,c_pos)

    d_hp=menu.create_interface_dragon(renderer,sprite_layers,screen,c_pos)
    dhp_sprite=person.create_person(c_pos[0]-400,c_pos[1],'./images/dragon_health.png') #dragon health interface
    dhp_sprite=menu.create_dragon_hp(renderer,sprite_layers,screen,dhp_sprite,c_pos,HP_DRAGON)
    
    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT, 1000)

    # mainloop
    while running:
        dt = clock.tick(70)
        savegame=pk.load(open("./save.p","rb"))

        # keep adding a group of four enemies after dying previous group
        if len(enm)==0: 
            color_change += 1
            enm.append(person.create_person(10*32, 3*32,'./images/haabu_d1.png'))
            enm.append(person.create_person(14*32, 3*32,'./images/haabu_d1.png'))
            enm.append(person.create_person(10*32, 7*32,'./images/haabu_d1.png'))
            enm.append(person.create_person(14*32, 7*32,'./images/haabu_d1.png'))
            HP_ENM = [100.0,100.0,100.0,100.0]
            enm_dir = [0,0,0,0]
            i = 0
            for i in range(len(enm)):
                sprite_layers[1].add_sprite(enm[i])

        # dragon can be killed only if it is of orange color and only by specialarrows
        # five specialarrows are provided when dragon becomes orange
        if color_change%2==0:
            SPECIALARROW = 0
            chk = 0
            dragonimages = ['./images/dragon_d1.png','./images/dragon_d2.png','./images/dragon_d3.png','./images/dragon_u1.png','./images/dragon_u2.png','./images/dragon_u3.png']
        else:
            if chk == 0: 
                SPECIALARROW = 5
            chk = 1
            dragonimages = ['./images/orange_d1.png','./images/orange_d2.png','./images/orange_d3.png','./images/orange_u1.png','./images/orange_u2.png','./images/orange_u3.png']
            #spec_arrow_interf
            menu.update_s_a(s_a,c_pos,SPECIALARROW)
        # event handling
        for event in pygame.event.get():
            if (event.type == pygame.QUIT):
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_w and savegame['arrow_count'] > 0:
                    enemy_attack.create_arrow(arrow_list,arrow_dir,drctn,hero,sprite_layers) # create arrow on pressing 'w'
                    haabu_remove(enm,HP_ENM,sprite_layers,enm_dir)  # remove enemy sprite if health bacomes zero
                    savegame['arrow_count'] -=1 # decrease the arrow count and update in the dictionary
                    pk.dump(savegame,open("./save.p","wb")) # save the changes of dictionary
                elif event.key == pygame.K_a:
                    # attack with sword on pressing 'a'
                    enemy_attack.attack(drctn,hero,enm,HP_ENM)
                    haabu_remove(enm,HP_ENM,sprite_layers,enm_dir)
                elif event.key == pygame.K_s and color_change%2!=0 and SPECIALARROW > 0:
                    # attack with specialarrow on pressing 's'
                    enemy_attack.create_specialarrow(specialarrow_list,specialarrow_dir,drctn,hero,sprite_layers)
                    SPECIALARROW -= 1
                    
                # interface update
                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)
                menu.update_dhp_bar(renderer,sprite_layers,screen,dhp_sprite,c_pos,HP_DRAGON)
                
                if(color_change%2==1):
                    menu.update_s_a(s_a,c_pos,SPECIALARROW)

        # calling hero_move() function for hero's movements
        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]

        # to detect the direction of hero
        if(mu>1):
            drctn='up'
        elif(mr>1):
            drctn='right'
        elif(md>1):
            drctn='down'
        elif(ml>1):
            drctn='left'

        haabu_move(hero,enm,enm_dir,enemyimages,haabu_speed) # random movement of enemy
        haabu_remove(enm,HP_ENM,sprite_layers,enm_dir)# remove enemy if health of enemy becomes zero
        
        if(color_change%2==0):enemy_attack.create_weapons(weap_list,sprite_layers,drag,weap_dir,dy_dragon,1) # create the weapons only if it is not of orange color
        enemy_attack.remove_weapon(hero,enm,weap_list,weap_dir,point_weapon,sprite_layers)

        # interface update
        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)
        menu.update_dhp_bar(renderer,sprite_layers,screen,dhp_sprite,c_pos,HP_DRAGON)
        
        enemy_attack.move_enemy(drag,[19*32],[1*32],dx_dragon,dragon_speed)# random movement of dragon
        enemy_attack.dir_update(drag,hero,dy_dragon) # direction update of enemy
        enemy_attack.image_update(drag,image_variable,dy_dragon,dragonimages) # image update of enemy

        enemy_attack.remove_arrow(arrow_list,enm,HP_ENM,arrow_dir,sprite_layers,point_arrow) # removes arrow from the screen
        enemy_attack.remove_arrow(specialarrow_list,drag,HP_DRAGON,specialarrow_dir,sprite_layers,point_specialarrow) # removes specialarrow from the screen

        # decrease health of hero if it colldes with dragon
        if pygame.sprite.collide_rect(hero,drag[0]):
            weap_sound = sound.create_soundfx('./sounds/weapon_touch.ogg')
            sound.volume(weap_sound,0.4)
            savegame=pk.load(open("./save.p","rb"))
            savegame['hp'] -= point_dragon
            pk.dump(savegame,open("./save.p","wb"))
            
        # game starts again if player dies
        if savegame['hp'] <= 0:
            sound.stop_soundfx(battlefield_sound)
            savegame['xp'] = old_xp
            savegame['h_level'] = old_level
            savegame['sheild_hp'] = old_armor
            savegame['arrow_count'] = old_arrow
            savegame['hp'] = savegame['max_hp']
            pk.dump(savegame,open("./save.p","wb"))
            menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0)
            life = 0
            running = False

        # Game ends!
        # clean the screen!
        if HP_DRAGON[0] <= 0:
            i = 0
            l = len(enm)
            while(i>=0 and i<l):
                sprite_layers[1].remove_sprite(enm[i])
                enm.pop(i)
                l = len(enm)
            i = 0
            l = len(weap_list)
            while(i>=0 and i<l):
                sprite_layers[2].remove_sprite(weap_list[i])
                weap_list.pop(i)
                l = len(weap_list)
            i = 0
            l = len(arrow_list)
            while(i>=0 and i<l):
                sprite_layers[1].remove_sprite(arrow_list[i])
                arrow_list.pop(i)
                l = len(arrow_list)
            i = 0
            l = len(specialarrow_list)
            while(i>=0 and i<l):
                sprite_layers[1].remove_sprite(specialarrow_list[i])
                specialarrow_list.pop(i)
                l = len(specialarrow_list)
            sprite_layers[1].remove_sprite(drag[0])
            render_update(renderer,sprite_layers,screen)
            sound.stop_soundfx(battlefield_sound)
            running = False
            life = 2
            
        # adjust camera according to the hero's position, follow him
        cam_pos_x = hero.rect.centerx
        cam_pos_y = hero.rect.centery
        if hero.rect.centerx <= 520 :
            cam_pos_x = 520
        if hero.rect.centery >=1050:
            cam_pos_y = 1050
        elif hero.rect.centery <=407:
            cam_pos_y = 407
        renderer.set_camera_position(cam_pos_x, cam_pos_y)

        # interface update
        c_pos=(cam_pos_x,cam_pos_y)
        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)
        dhp_sprite.rect.midbottom=(c_pos[0],c_pos[1]+350)
        d_hp.rect.midbottom=(c_pos[0],c_pos[1]+350)
        spec_interf.rect.topleft=(c_pos[0]-512,c_pos[1]-240)
        s_a.rect.topleft=(c_pos[0]-540,c_pos[1]-280)

        # clear screen, might be left out if every pixel is redrawn anyway
        screen.fill((0, 0, 0))
        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
        
    if life == 0:
        demo_pygame('./maps/palace_final.tmx',0)
    elif life ==2:
        # Game ends!
        # Quit the window after pressing 'Esc'
        running = True
        ending_sound = sound.create_soundfx('./sounds/ending.ogg')
        sound.volume(ending_sound,1)
        while running :
            for event in pygame.event.get():
                if (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE ):
                    sound.stop_soundfx(ending_sound)
                    running = False
        pygame.quit()
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)
Exemple #9
0
def demo_pygame(file_name,frm):
    # 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)

    #for background music and special sound effects
    mixer.init()
    sound1 = mixer.Sound('./sounds/ouch.ogg')
    sound2=mixer.Sound('./sounds/stone.ogg')

    file = './sounds/Rock_Slide.ogg'
    m = mixer.music.load(file)
    #(-1) argument plays it infinitely unless stopped explicitly
    mixer.music.play(-1);
    
    #set up a screen
    screen_width = min(704, world_map.pixel_width)
    screen_height = min(800, 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 = screen_width/2
    hero_pos_y = 6300
    #create hero on specified co-ordinates and with specified image
    hero = person.create_person(hero_pos_x, hero_pos_y ,'./images/up.png')

    #portal to detect change of map
    portal2 = pygame.Rect(0,1*32,21*32,60)
    
    # create stones sprite
    stone_width =3
    stone1_height=3
    stone2_height=4
    stone3_height=5
    stone1=[]
    stone2=[]
    stone3=[]
    
    # dimensions of the hero for collision detection
    hero_width = hero.rect.width
    hero_height = 5

    # 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 to the the right layer
    sprite_layers[1].add_sprite(hero)
    
    # add stone positions
    stone1_pos_x=[]
    stone1_pos_y=[]
    stone2_pos_x=[]
    stone2_pos_y=[]
    stone3_pos_x=[]
    stone3_pos_y=[]
    
    # variables for the main loop
    clock = pygame.time.Clock()
    running = True
    speed_x = 4
    speed_y= 6
    last=0
    #load the saved game variables based on game progress
    sv=pk.load(open("./save.p","rb"))
    health=sv['hp']
    hp=sv['hp']
    hp_max=sv['max_hp']
    c_pos=[cam_world_pos_x, cam_world_pos_y]    
    interf_toggle=0
    interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) 
    hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png')
    l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos)
    [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos)
    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)

    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT,1000)
    cl = 0
    # mainloop
    while running:
        dt = clock.tick(40)
        sv=pk.load(open("./save.p","rb"))
                    
        # event handling
        for event in pygame.event.get():
            #update the health,experience and armour
            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)
            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
            

        #based on collision with environment decide number of steps allowed
        mov = climb.hero_climb(cl,hero_pos_x,hero_pos_y,hero,speed_x,speed_y,sprite_layers[3])
        cl = mov[0]
        hero_pos_x = mov[1]
        hero_pos_y = mov[2]
        
        #check collision with portal to change map
        if(pygame.Rect.colliderect(portal2,hero.rect)):
            portal=True
            #stop the background music for this map
            mixer.music.stop()
            running =False

            

        # adjust camera according to the hero's position, follow him
        if ( hero.rect.centery >=6000):
            renderer.set_camera_position(350, 6000)
            c_pos=(350,6000)
        elif (hero.rect.centery <=400):
            renderer.set_camera_position(350, 400)
            c_pos=(350,400)
        else:
            renderer.set_camera_position(350,hero.rect.centery )
            c_pos=(350,hero.rect.centery)

        #position health bar, experience bar and armour
        interface.rect.topleft=(c_pos[0]-352,c_pos[1]-384)
        hp_sprite.rect.topleft=(c_pos[0]-240,c_pos[1]-382)
        xp_sprite.rect.topleft=(c_pos[0]-240,c_pos[1]-345)
        l_g.rect.topleft=(c_pos[0]-348,c_pos[1]-381)

        # 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)

        time=(pygame.time.get_ticks() / 500)
        #to decide interval when to drop stones
        if time > last and len(stone1)+len(stone2)+len(stone3) <30:
            last=time
            hero_temp_x = hero.rect.centerx
            #decide x co-ordinate of stone randomly
            r=random.randint(0,100)
            if( r < 25):
                left_limit=hero_temp_x - 10
                right_limit = hero_temp_x +10
            elif ( r < 90) :
                left_limit = hero_temp_x - 200
                right_limit = hero_temp_x +200 
                if(left_limit<40): 
                    left_limit = 40
                    right_limit = 400
            
                if(right_limit >640):
                    left_limit = 300
                    right_limit = 660
            else :
                left_limit=10
                right_limit=690

            #to decide randomly the type of stone
            t=random.randint(0,math.floor(hero_pos_y))
            if t < 2000:
                t=3
            elif t < 4000:
                t=2
            else :
                t=1
            permission = random.randint(left_limit,right_limit);
            if(permission<50):
                permission = 55
            elif (permission > 650):
                permission = 645

            #append initial stone locations  and create stone sprites   
            if( t==1):             
                stone1_pos_x.append(permission)
                stone1_pos_y.append(max(hero_pos_y -800,50))
                stone1.append(create_stone(stone1_pos_x[len(stone1)],stone1_pos_y[len(stone1)],1))
                sprite_layers[1].add_sprite(stone1[len(stone1)-1])
            elif t==2 :
                stone2_pos_x.append(permission)
                stone2_pos_y.append(max(hero_pos_y -800,50))
                stone2.append(create_stone(stone2_pos_x[len(stone2)],stone2_pos_y[len(stone2)],2))
                sprite_layers[1].add_sprite(stone2[len(stone2)-1])
            else :
                stone3_pos_x.append(permission)
                stone3_pos_y.append(max(hero_pos_y -800,50))
                stone3.append(create_stone(stone3_pos_x[len(stone3)],stone3_pos_y[len(stone3)],3))
                sprite_layers[1].add_sprite(stone3[len(stone3)-1])
                
        n=0
        while n < len(stone1):
            #moving the stones of type1
            step_x, step_y = climb.check_collision(stone1_pos_x[n], stone1_pos_y[n], 0,8 *(6400-hero_pos_y) //6400 +10, stone_width, stone1_height, sprite_layers[3])
            stone1_pos_y[n] += step_y
            stone1[n].rect.midbottom = (stone1_pos_x[n], stone1_pos_y[n])
            #if stone is out of visible region remove stone sprite
            if (stone1_pos_y[n] >=hero_pos_y +400 or stone1_pos_y[n]>= 6300) :
                sprite_layers[1].remove_sprite(stone1[n])
                stone1.pop(n)
                stone1_pos_y.pop(n)
                stone1_pos_x.pop(n)
                #stop background music and play sound of stone reaching bottom of sea
                mixer.music.stop()
                sound2.play(0)
                #play background music again
                mixer.music.play(-1);
                continue
            else:
                n=n+1
        #to check players' collision with stone type1
        n=hero.rect.collidelist(stone1)
        if  n!= -1:
            #remove stone sprite
            sprite_layers[1].remove_sprite(stone1[n])
            stone1.pop(n)
            stone1_pos_y.pop(n)
            stone1_pos_x.pop(n)
            #decrease the health
            health=health-3
            sv['hp']=health
            pk.dump(sv,open("./save.p","wb"))
            mixer.music.stop()
            #play the hurt sound
            sound1.play(0)
            mixer.music.play(-1)

        if health <=0:
            #go back to initial position
            hero_pos_x=screen_width/2
            hero_pos_y=6300
            sv['hp']=sv['max_hp']
            health=sv['hp']
            
        n=0
        #similarly for stones of type2
        while n < len(stone2):
            step_x, step_y = climb.check_collision(stone2_pos_x[n], stone2_pos_y[n], 0,8 *(6400-hero_pos_y) //6400 + 10, stone_width, stone2_height, sprite_layers[3])
            stone2_pos_y[n] += step_y
            stone2[n].rect.midbottom = (stone2_pos_x[n], stone2_pos_y[n])
            if (stone2_pos_y[n] >=hero_pos_y +400 or stone2_pos_y[n]>= 6300):
                sprite_layers[1].remove_sprite(stone2[n])
                stone2.pop(n)
                stone2_pos_y.pop(n)
                stone2_pos_x.pop(n)
                mixer.music.stop()
                sound2.play(0)
                mixer.music.play(-1);
                continue
            else:
                n=n+1
        n=hero.rect.collidelist(stone2)
        if  n!= -1:
            sprite_layers[1].remove_sprite(stone2[n])
            stone2.pop(n)
            stone2_pos_y.pop(n)
            stone2_pos_x.pop(n)
            health=health-6
            sv['hp']=health
            pk.dump(sv,open("./save.p","wb"))
            mixer.music.stop()
            sound1.play(0)
            mixer.music.play(-1);
        if health <=0 : # changes to switch screen to game over
            hero_pos_x=screen_width/2
            hero_pos_y=6300
            sv['hp']=sv['max_hp']
            health=sv['hp']
            
            
        n=0
        #similarly for stone of type3
        while n < len(stone3):
            step_x, step_y = climb.check_collision(stone3_pos_x[n], stone3_pos_y[n], 0,8 *(6400-hero_pos_y) //6400  +10, stone_width, stone3_height, sprite_layers[3])
            stone3_pos_y[n] += step_y
            stone3[n].rect.midbottom = (stone3_pos_x[n], stone3_pos_y[n])
            if (stone3_pos_y[n] >=hero_pos_y +400  or stone3_pos_y[n]>= 6300):
                sprite_layers[1].remove_sprite(stone3[n])
                stone3.pop(n)
                stone3_pos_y.pop(n)
                stone3_pos_x.pop(n)
                mixer.music.stop()
                sound2.play(0)
                mixer.music.play(-1);
                continue
            else:
                n=n+1
        n=hero.rect.collidelist(stone3)
        if  n!= -1:
            sprite_layers[1].remove_sprite(stone3[n])
            stone3.pop(n)
            stone3_pos_y.pop(n)
            stone3_pos_x.pop(n)
            health=health-10
            sv['hp']=health
            pk.dump(sv,open("./save.p","wb"))
            mixer.music.stop()
            sound1.play(0)
            mixer.music.play(-1);
        if health <=0 : 
            hero_pos_x=screen_width/2
            hero_pos_y=6300# changes to switch screen to game over
            sv['hp']=sv['max_hp']
            health=sv['hp']
            
        pygame.display.flip()

    if portal==True:
        #chnage the map
        mountain_top.main()
Exemple #10
0
def demo_pygame(file_name, frm):
    # 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
    file = './sounds/hotel.ogg'
    m = mixer.music.load(file)
    mixer.music.play(-1)

    #set up a screen
    screen_width = min(900, 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()

    # create hero sprite
    hero_pos_x = 200
    hero_pos_y = 1600
    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 = 5

    # 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[2].add_sprite(hero)

    # add pots positions
    ty = pk.load(open("./save.p", "rb"))
    t = ty['hotel_treasure']
    pots_pos_x = [100, 520, 800, 180]
    pots_pos_y = [960, 960, 820, 120]
    pots = []
    flag = [0, 0, 0, 0, 0]
    for i in range(4):
        if t[i] == 0:
            pots.append(create_pot(pots_pos_x[i], pots_pos_y[i]))

    c_pos = [cam_world_pos_x, cam_world_pos_y]
    ty = pk.load(open("./save.p", "rb"))
    hp = ty['hp']
    hp_max = ty['max_hp']
    interf_toggle = 0
    interface = menu.create_interface(renderer, sprite_layers, screen, c_pos)
    hp_sprite = person.create_person(c_pos[0], c_pos[1], './images/hp_bar.png')
    l_g = menu.create_l_g(renderer, sprite_layers, screen, c_pos)
    [hp_sprite, hp] = menu.create_hp_bar(renderer, sprite_layers, screen,
                                         hp_sprite, c_pos)
    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)

    # variables for the main loop
    clock = pygame.time.Clock()
    running = True
    speed = 6
    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT, 1000)
    mr = ml = md = mu = 0

    #create portals to detect when to change map
    portal1 = pygame.Rect(19 * 20, 73 * 20, 5 * 20, 2 * 20)
    portal2 = pygame.Rect(2 * 20, 81 * 20, 40 * 20, 40)

    # mainloop
    while running:
        dt = clock.tick(40)
        ty = pk.load(open("./save.p", "rb"))

        # event handling

        for event in pygame.event.get():
            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)

            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

        # 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]

        # adjust camera according to the hero's position, follow him
        if (hero.rect.centery >= 1280):
            renderer.set_camera_position(450, 1280)
            c_pos = (450 + 60, 1360)
        elif (hero.rect.centery <= 400):
            renderer.set_camera_position(450, 400)
            c_pos = (450 + 60, 400)
        else:
            renderer.set_camera_position(450, hero.rect.centery)
            c_pos = (450 + 60, hero.rect.centery)

        #place health,experience and armours
        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)

        # 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)

        ##If talk to receptionist
        #List Variable to check if the person has bought the room or not
        pos_hero = None
        if (flag[4] == 0 and pygame.Rect.colliderect(portal1, hero.rect)
                and pygame.key.get_pressed()[pygame.K_SPACE] == 1):
            pos_hero = menu.warning_msg(file_name, renderer, sprite_layers,
                                        screen, c_pos, 0)

        if pos_hero != None:
            hero_pos_x = pos_hero[0]
            hero_pos_y = pos_hero[1]
            ty = pk.load(open("./save.p", "rb"))

        if (portal2.collidepoint(hero.rect.midbottom)):
            pk.dump(ty, open("./save.p", "wb"))
            mixer.music.stop()
            running = False
        t = ty['hotel_treasure']
        n = hero.rect.collidelist(pots)
        if n == 0 and flag[n] == 0 and t[n] == 0:
            ty['hp'] += 5
            flag[n] = 1
            t[n] = 1
        elif n == 1 and flag[n] == 0 and t[n] == 0:
            ty['gold'] += 5
            flag[n] = 1
            t[n] = 1
        elif n == 2 and flag[n] == 0 and t[n] == 0:
            ty['gold'] += 10
            flag[n] = 1
            t[n] = 1
        elif n == 3 and flag[n] == 0 and t[n] == 0:
            ty['hp'] += 10
            flag[n] = 1
            t[n] = 1

        ty['hotel_treasure'] = t
        pk.dump(ty, open("./save.p", "wb"))
        pygame.display.flip()

    shifty1.demo_pygame('./maps/village2_inside.tmx', 1)
Exemple #11
0
def demo_pygame(file_name, frm):

    # 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()

    #background music
    tunnel2_4_sound = sound.create_music(file_name)
    sound.volume(tunnel2_4_sound, 0.2)

    # create hero sprite
    if frm == 0:
        hero_pos_x = 5 * 32
        hero_pos_y = 95 * 32
    else:
        hero_pos_x = 81 * 32
        hero_pos_y = 62 * 32
    hero = person.create_person(hero_pos_x, hero_pos_y, './images/hero_u2.png')

    # create monster sprites
    mon = []
    mon_dir = []
    mon_image = []
    mon.append(person.create_person(16 * 32, 82 * 32, './images/slime14.png'))
    mon.append(person.create_person(39 * 32, 82 * 32, './images/slime14.png'))
    mon.append(person.create_person(50 * 32, 82 * 32, './images/slime14.png'))
    mon.append(person.create_person(60 * 32, 82 * 32, './images/slime14.png'))
    mon.append(person.create_person(67 * 32, 82 * 32, './images/slime14.png'))
    mon.append(person.create_person(5 * 32, 74 * 32, './images/slime14.png'))
    mon.append(person.create_person(5 * 32, 47 * 32, './images/slime14.png'))
    mon.append(person.create_person(14 * 32, 47 * 32, './images/slime14.png'))
    mon.append(person.create_person(23 * 32, 33 * 32, './images/slime14.png'))
    mon.append(person.create_person(23 * 32, 20 * 32, './images/slime14.png'))
    mon.append(person.create_person(20 * 32, 8 * 32, './images/slime14.png'))
    mon.append(person.create_person(43 * 32, 8 * 32, './images/slime14.png'))
    mon.append(person.create_person(43 * 32, 24 * 32, './images/slime14.png'))
    mon.append(person.create_person(43 * 32, 41 * 32, './images/slime14.png'))
    mon.append(person.create_person(49 * 32, 47 * 32, './images/slime14.png'))
    mon.append(person.create_person(66 * 32, 47 * 32, './images/slime14.png'))
    mon.append(person.create_person(72 * 32, 32 * 32, './images/slime14.png'))
    mon.append(person.create_person(72 * 32, 23 * 32, './images/slime14.png'))
    mon.append(person.create_person(72 * 32, 8 * 32, './images/slime14.png'))
    mon.append(person.create_person(81 * 32, 8 * 32, './images/slime14.png'))
    mon.append(person.create_person(81 * 32, 19 * 32, './images/slime14.png'))
    mon.append(person.create_person(81 * 32, 36 * 32, './images/slime14.png'))
    mon.append(person.create_person(81 * 32, 49 * 32, './images/slime14.png'))
    mon.append(person.create_person(67 * 32, 64 * 32, './images/slime14.png'))
    mon.append(person.create_person(82 * 32, 64 * 32, './images/slime14.png'))

    #list to save the direcion constraints for enemy's movements
    mon_dir = [
        -1, 0, -1, 0, 1, 0, 1, 0, 1, 0, 0, -1, 1, 0, -1, 0, 0, -1, 0, 1, 1, 0,
        -1, 0, 0, 1, 0, -1, 1, 0, -1, 0, 0, -1, 0, 1, 1, 0, -1, 0, 0, 1, 0, -1,
        0, 1, 1, 0, -1, 0
    ]

    # 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 and monsters to the the right layer
    sprite_layers[1].add_sprite(hero)
    i = 0
    for i in range(len(mon)):
        mon_image.append(1)
        sprite_layers[1].add_sprite(mon[i])

    # portal for entry and exit of hero
    portal1 = pygame.Rect(4 * 32, 96 * 32, 3 * 32, 2 * 32)
    portal2 = pygame.Rect(85 * 32, 61 * 32, 1 * 32, 3 * 32)

    # variables for the main loop
    clock = pygame.time.Clock()
    running = True  # to run while loop
    speed = 10  # hero speed
    mr = ml = md = mu = 0  # image variables(change images to show movements of hero)
    h_drctn = 'up'  # direction where hero facing right now
    life = 1  # to keep track wheather hero is alive or not
    arrow_list = []  # contains a list of arrows (currently on screen)
    arrow_dir = []  # directions of arrows

    HP_MON = [10.0] * (len(mon))  # health of monster
    point_arrow = 10.0  # decrease in health of enemy when arrow of hero collides with enemy
    point_enm = 1.0  # decrease in health of hero after collision with enemy
    enm_speed = 8.0  # speed of enemy

    savegame = pk.load(open("./save.p", "rb"))
    old_xp = savegame['xp']
    old_level = savegame['h_level']
    old_armor = savegame['sheild_hp']
    old_arrow = savegame['arrow_count']

    # interface code
    c_pos = [cam_world_pos_x, cam_world_pos_y]
    interface = menu.create_interface(renderer, sprite_layers, screen, c_pos)
    hp_sprite = person.create_person(c_pos[0], c_pos[1],
                                     './images/hp_bar.png')  # hp bar interface
    l_g = menu.create_l_g(renderer, sprite_layers, screen,
                          c_pos)  # level and gold interface
    [hp_sprite, hp] = menu.create_hp_bar(renderer, sprite_layers, screen,
                                         hp_sprite, c_pos)
    xp_sprite = person.create_person(c_pos[0], c_pos[1],
                                     './images/exp_bar.png')  # x interface
    xp_sprite = menu.create_xp_bar(renderer, sprite_layers, screen, xp_sprite,
                                   c_pos)
    f_i = menu.create_f_i(renderer, sprite_layers, screen,
                          c_pos)  # arrow,armor,sword interface
    interf_fight = menu.create_interface_fight(renderer, sprite_layers, screen,
                                               c_pos)

    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT, 1000)

    # mainloop
    while running:
        dt = clock.tick(50)
        savegame = pk.load(open("./save.p", "rb"))

        # event handling
        for event in pygame.event.get():
            if (event.type == pygame.QUIT):
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_w and savegame['arrow_count'] > 0:
                    enemy_attack.create_arrow(
                        arrow_list, arrow_dir, h_drctn, hero,
                        sprite_layers)  # create arrow on pressing 'w'
                    remove_mon(
                        HP_MON, mon, mon_dir, mon_image, sprite_layers
                    )  # remove monster sprite if health bacomes zero
                    savegame[
                        'arrow_count'] -= 1  # decrease the arrow count and update in the dictionary
                    pk.dump(savegame,
                            open("./save.p",
                                 "wb"))  # save the changes of dictionary
                elif event.key == pygame.K_a:
                    # attack with sword on pressing 'a'
                    enemy_attack.attack(h_drctn, hero, mon, HP_MON)
                    remove_mon(HP_MON, mon, mon_dir, mon_image, sprite_layers)

            # interface update
            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)

        # calling hero_move() function for hero's movements
        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]

        # to detect the direction of hero
        if (mu > 1):
            h_drctn = 'up'
        elif (mr > 1):
            h_drctn = 'right'
        elif (md > 1):
            h_drctn = 'down'
        elif (ml > 1):
            h_drctn = 'left'

        # decresing the HP of player if collides any of the monsters
        # if HP becomes zero then start the game again
        for i in range(len(mon)):
            if pygame.sprite.collide_rect(hero, mon[i]):
                ouch_sound = sound.create_soundfx('./sounds/weapon_touch.ogg')
                sound.volume(ouch_sound, 0.4)
                if savegame['sheild_hp'] > 0:
                    savegame['sheild_hp'] -= (point_enm / 2)
                    savegame['hp'] -= (point_enm / 2)
                    if savegame['sheild_hp'] < 0:
                        savegame['sheild_hp'] = 0
                else:
                    savegame['hp'] -= point_enm
                    if savegame['hp'] <= 0:
                        sound.stop_soundfx(tunnel2_4_sound)
                        savegame['xp'] = old_xp
                        savegame['h_level'] = old_level
                        savegame['sheild_hp'] = old_armor
                        savegame['arrow_count'] = old_arrow
                        savegame['hp'] = savegame['max_hp']
                        pk.dump(savegame, open("./save.p", "wb"))
                        menu.update_hp_bar(renderer, sprite_layers, screen,
                                           hp_sprite, c_pos, 0)
                        life = 0
                        running = False
                pk.dump(savegame, open("./save.p", "wb"))

        (mon_dir, mon, mon_image) = move_mon(mon_dir, mon, mon_image,
                                             sprite_layers,
                                             enm_speed)  # monsters's movement
        enemy_attack.remove_arrow(
            arrow_list, mon, HP_MON, arrow_dir, sprite_layers,
            point_arrow)  # remove arrow if it goes out of the screen
        remove_mon(HP_MON, mon, mon_dir, mon_image,
                   sprite_layers)  # remove monsters
        menu.update_lg(l_g, c_pos)  #interface update

        # adjust camera according to the hero's position, follow him
        # (don't make the hero follow the cam, maybe later you want different
        #  objects to be followed by the cam)
        cam_pos_x = hero.rect.centerx
        cam_pos_y = hero.rect.centery
        if hero.rect.centerx <= 520:
            cam_pos_x = 520
        elif hero.rect.centerx >= 2336:
            cam_pos_x = 2336
        if hero.rect.centery >= 2875:
            cam_pos_y = 2875
        elif hero.rect.centery <= 408:
            cam_pos_y = 408
        renderer.set_camera_position(cam_pos_x, cam_pos_y)

        # interface update
        c_pos = (cam_pos_x, cam_pos_y)
        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)

        # next map
        if pygame.Rect.colliderect(hero.rect,
                                   portal1) or pygame.Rect.colliderect(
                                       hero.rect, portal2):
            portal = True
            sound.stop_soundfx(tunnel2_4_sound)
            running = False

        # clear screen, might be left out if every pixel is redrawn anyway
        screen.fill((0, 0, 0))
        (renderer, sprite_layers,
         screen) = render_update(renderer, sprite_layers, screen)

    # Game restarts
    if life == 0:
        demo_pygame('./maps/tunnel2_4.tmx', 0)

    elif portal == True:
        shifty1.demo_pygame('./maps/village1.tmx', 1)
def demo_pygame(file_name):

    file = './sounds/Firestrm.ogg'
    # 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()
    # loading the sound files in different sound formats of mixer and main background sound in mixer stream
    sound_ouch = mixer.Sound('./sounds/pain.ogg')
    mixer.music.load(file)
    mixer.music.play(-1)

    # 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()

    # create hero sprite
    # use floats for hero position
    hero_pos_x = 18 * 32 + 16
    hero_pos_y = 22 * 32
    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 = 5
    # create knife sprite
    knife_pos_x = 8 * 32
    knife_pos_y = 21 * 32
    knife = create_knife(knife_pos_x, knife_pos_y)
    # create coin sprite
    coin_pos_x = 28 * 32 + 16
    coin_pos_y = 16 * 32
    coin = create_coin(coin_pos_x, coin_pos_y)

    # cam_offset is for scrolling
    cam_world_pos_x = 1024 / 2
    cam_world_pos_y = 768 / 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[3].add_sprite(hero)
    sprite_layers[2].add_sprite(coin)
    sprite_layers[2].add_sprite(knife)

    # layer add/remove hero keys
    num_keys = [pygame.K_0, pygame.K_1, pygame.K_2, pygame.K_3, pygame.K_4, \
                    pygame.K_5, pygame.K_6, pygame.K_7, pygame.K_8, pygame.K_9]

    ###FOR INTERFACE on top-left corner loading the libraries from menu file and loading the local variables into the function
    savegame = pk.load(open("./save.p", "rb"))
    HERO_HEALTH = savegame['hp']  # loading the last hero health
    hp = savegame['hp']
    hp_max = savegame['max_hp']  # keep updating the values in pk file
    c_pos = [cam_world_pos_x, cam_world_pos_y]

    #c_pos=camra.camera(file_name,renderer,hero)
    interf_toggle = 0
    interface = menu.create_interface(renderer, sprite_layers, screen, c_pos)
    hp_sprite = person.create_person(c_pos[0], c_pos[1], './images/hp_bar.png')
    l_g = menu.create_l_g(renderer, sprite_layers, screen, c_pos)
    [hp_sprite, hp] = menu.create_hp_bar(renderer, sprite_layers, screen,
                                         hp_sprite, c_pos)
    #for showing the xp in the interface
    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)

    # variables for the main loop
    clock = pygame.time.Clock()
    running = True
    speed = 4.75
    # setting up an environment for shifting the map while exiting from the map
    portal1 = pygame.Rect(17 * 32, 22 * 32, 96, 32)
    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT, 1000)
    mr = ml = md = mu = 0

    # mainloop
    while running:
        dt = clock.tick(50)  # value set to work same with different processors
        ## continously moving the interface and saving the health and other data in the files
        savegame = pk.load(open("./save.p", "rb"))
        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)

        # 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
                    mixer.music.stop()

            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)

        # find directions
# loading commom movement of hero stored in movements1 file and chaning its positions
        mov = movements1.hero_move(mr, ml, md, mu, hero_pos_x, hero_pos_y,
                                   hero, speed, sprite_layers[4])
        mr = mov[0]
        ml = mov[1]
        md = mov[2]
        mu = mov[3]
        hero_pos_x = mov[4]
        hero_pos_y = mov[5]
        # fire collision health loss
        if (fire_ouch(hero_pos_x, hero_pos_y, sprite_layers[1])):
            sound_ouch.play()
            dmg = 0.85
            # updating the new health
            menu.update_hp_bar(renderer, sprite_layers, screen, hp_sprite,
                               c_pos, dmg)
            savegame['hp'] -= dmg
            HERO_HEALTH -= dmg
            if (HERO_HEALTH < 0):
                # setting the hero kill position from fire
                savegame['hp'] = savegame['max_hp']
                HERO_HEALTH = savegame['hp']
                hero_pos_x = 18 * 32 + 16
                hero_pos_y = 22 * 32
                # if knife and coin not taken adding them here
                if (not sprite_layers[2].contains_sprite(knife)):
                    sprite_layers[2].add_sprite(knife)
                if (not sprite_layers[2].contains_sprite(coin)):
                    sprite_layers[2].add_sprite(coin)

        # getting coin here
        if (pygame.sprite.collide_rect(hero, coin)):
            sprite_layers[2].remove_sprite(coin)

        #getting knife here
        if (pygame.sprite.collide_rect(hero, knife)):
            sprite_layers[2].remove_sprite(knife)
# collision with portal for changing map
        if(portal1.collidepoint(hero.rect.midbottom) and not sprite_layers[2].contains_sprite(coin) \
            and not sprite_layers[2].contains_sprite(knife)):
            mixer.music.stop()
            savegame['b_h_vil'] = 1
            savegame['talk_vil']['./maps/village1.tmx'][1] = 1
            savegame['dagger'] = 1
            savegame['eqp_weapon'] = 'dagger'
            pk.dump(savegame, open("./save.p", "wb"))
            running = False
            #CODE FOR MAP CHANGING HERE.........
        # condition for shifting map

        # adjust camera according to the hero's position, follow him
        # (don't make the hero follow the cam, maybe later you want different
        #  objects to be followd by the cam)
        #renderer.set_camera_position(hero.rect.centerx, hero.rect.centery)

        # 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)

        pk.dump(savegame, open("./save.p", "wb"))
        pygame.display.flip()
# calling the other map after completion of catching all the fishes
    shifty1.demo_pygame('./maps/village1.tmx', 2)
Exemple #13
0
def demo_pygame(file_name,frm):

    # 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()

    #background music
    battlefield_sound = sound.create_music(file_name)
    
    # create hero
    hero_pos_x = 10*32
    hero_pos_y = 41*32
    hero = person.create_person(hero_pos_x, hero_pos_y,'./images/hero_u2.png')
    
    # create enemy sprites
    enm = []
    enm.append(person.create_person(10*32, 3*32,'./images/haabu_d1.png'))
    enm.append(person.create_person(14*32, 3*32,'./images/haabu_d1.png'))
    enm.append(person.create_person(10*32, 7*32,'./images/haabu_d1.png'))
    enm.append(person.create_person(14*32, 7*32,'./images/haabu_d1.png'))

    # create dragon sprite
    dragon = person.create_person(10*32, 27*32,'./images/dragon_d1.png')
    
    # cam_offset is for scrolling
    cam_world_pos_x = 520
    cam_world_pos_y = 1050

    # 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 and enemies the the right layer
    sprite_layers[1].add_sprite(hero)
    sprite_layers[1].add_sprite(dragon)
    i = 0
    for i in range(len(enm)):
        sprite_layers[1].add_sprite(enm[i])
    
    # variables for the main loop
    clock = pygame.time.Clock()
    running = True # to run while loop
    speed = 7  # hero speed 
    mr=ml=md=mu=0  # image variables(change images to show movements of hero)
    
    tic_flag = 0
    drctn='down' # direction where hero facing right now
    life = 1 # to keep track wheather hero is alive or not
    arrow_list = [] # contains a list of arrows (currently on screen)
    arrow_dir = [] # directions of arrows
    enm_dir = [0,0,0,0]
    drag = [dragon]
    dx_dragon = [0]
    image_variable = [0]
    weap_dir = [] # directions of weapons 
    weap_list = [] # contains a list of weapons (currently on screen)
    color_change = 0 # a color variable for dragon
    dy_dragon = [1] # dragon direction
    specialarrow_list = [] # contains a list of specialarrows (currently on screen)
    specialarrow_dir = [] # directions of specialarrows
    dragonimages = ['./images/dragon_d1.png','./images/dragon_d2.png','./images/dragon_d3.png','./images/dragon_u1.png','./images/dragon_u2.png','./images/dragon_u3.png']
    enemyimages = ['./images/haabu_d1.png','./images/haabu_d2.png','./images/haabu_d3.png','./images/haabu_u1.png','./images/haabu_u2.png','./images/haabu_u3.png']
    chk = 0

    HP_ENM = [100.0,100.0,100.0,100.0] # health of enemies
    HP_DRAGON = [100.0] # health of dragon
    SPECIALARROW = 5    
    point_weapon = 1.0   # decrease in health of hero when weapon OR haabu collides with hero  ## HAABU MEANS ENEMY (in HINDI)
    point_arrow = 20.0    # arrow enemy collision
    point_dragon = 5.0    # hero dragon collision
    point_specialarrow = 10.0  # specialarrow hero collision
    haabu_speed = 6
    dragon_speed = 8

    #old variables to restore if hero dies in this map
    savegame=pk.load(open("./save.p","rb"))
    old_xp = savegame['xp']
    old_level = savegame['h_level']
    old_armor = savegame['sheild_hp']
    old_arrow = savegame['arrow_count']

     # interface code
    c_pos=[cam_world_pos_x, cam_world_pos_y]
    interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) 
    hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') # hp bar interface
    l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) # level and gold interface
    [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos) 
    xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') # xp interface
    xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos)
    s_a=menu.create_s_a(renderer,sprite_layers,screen,c_pos)
    f_i=menu.create_f_i(renderer,sprite_layers,screen,c_pos) # arrow,armor,sword interface
    interf_fight=menu.create_interface_fight(renderer,sprite_layers,screen,c_pos)
    spec_interf=menu.create_interface_spec_arrow(renderer,sprite_layers,screen,c_pos)

    d_hp=menu.create_interface_dragon(renderer,sprite_layers,screen,c_pos)
    dhp_sprite=person.create_person(c_pos[0]-400,c_pos[1],'./images/dragon_health.png') #dragon health interface
    dhp_sprite=menu.create_dragon_hp(renderer,sprite_layers,screen,dhp_sprite,c_pos,HP_DRAGON)
    
    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT, 1000)

    # mainloop
    while running:
        dt = clock.tick(70)
        savegame=pk.load(open("./save.p","rb"))

        # keep adding a group of four enemies after dying previous group
        if len(enm)==0: 
            color_change += 1
            enm.append(person.create_person(10*32, 3*32,'./images/haabu_d1.png'))
            enm.append(person.create_person(14*32, 3*32,'./images/haabu_d1.png'))
            enm.append(person.create_person(10*32, 7*32,'./images/haabu_d1.png'))
            enm.append(person.create_person(14*32, 7*32,'./images/haabu_d1.png'))
            HP_ENM = [100.0,100.0,100.0,100.0]
            enm_dir = [0,0,0,0]
            i = 0
            for i in range(len(enm)):
                sprite_layers[1].add_sprite(enm[i])

        # dragon can be killed only if it is of orange color and only by specialarrows
        # five specialarrows are provided when dragon becomes orange
        if color_change%2==0:
            SPECIALARROW = 0
            chk = 0
            dragonimages = ['./images/dragon_d1.png','./images/dragon_d2.png','./images/dragon_d3.png','./images/dragon_u1.png','./images/dragon_u2.png','./images/dragon_u3.png']
        else:
            if chk == 0: 
                SPECIALARROW = 5
            chk = 1
            dragonimages = ['./images/orange_d1.png','./images/orange_d2.png','./images/orange_d3.png','./images/orange_u1.png','./images/orange_u2.png','./images/orange_u3.png']
            #spec_arrow_interf
            menu.update_s_a(s_a,c_pos,SPECIALARROW)
        # event handling
        for event in pygame.event.get():
            if (event.type == pygame.QUIT):
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_w and savegame['arrow_count'] > 0:
                    enemy_attack.create_arrow(arrow_list,arrow_dir,drctn,hero,sprite_layers) # create arrow on pressing 'w'
                    haabu_remove(enm,HP_ENM,sprite_layers,enm_dir)  # remove enemy sprite if health bacomes zero
                    savegame['arrow_count'] -=1 # decrease the arrow count and update in the dictionary
                    pk.dump(savegame,open("./save.p","wb")) # save the changes of dictionary
                elif event.key == pygame.K_a:
                    # attack with sword on pressing 'a'
                    enemy_attack.attack(drctn,hero,enm,HP_ENM)
                    haabu_remove(enm,HP_ENM,sprite_layers,enm_dir)
                elif event.key == pygame.K_s and color_change%2!=0 and SPECIALARROW > 0:
                    # attack with specialarrow on pressing 's'
                    enemy_attack.create_specialarrow(specialarrow_list,specialarrow_dir,drctn,hero,sprite_layers)
                    SPECIALARROW -= 1
                    
                # interface update
                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)
                menu.update_dhp_bar(renderer,sprite_layers,screen,dhp_sprite,c_pos,HP_DRAGON)
                
                if(color_change%2==1):
                    menu.update_s_a(s_a,c_pos,SPECIALARROW)

        # calling hero_move() function for hero's movements
        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]

        # to detect the direction of hero
        if(mu>1):
            drctn='up'
        elif(mr>1):
            drctn='right'
        elif(md>1):
            drctn='down'
        elif(ml>1):
            drctn='left'

        haabu_move(hero,enm,enm_dir,enemyimages,haabu_speed) # random movement of enemy
        haabu_remove(enm,HP_ENM,sprite_layers,enm_dir)# remove enemy if health of enemy becomes zero
        
        if(color_change%2==0):enemy_attack.create_weapons(weap_list,sprite_layers,drag,weap_dir,dy_dragon,1) # create the weapons only if it is not of orange color
        enemy_attack.remove_weapon(hero,enm,weap_list,weap_dir,point_weapon,sprite_layers)

        # interface update
        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)
        menu.update_dhp_bar(renderer,sprite_layers,screen,dhp_sprite,c_pos,HP_DRAGON)
        
        enemy_attack.move_enemy(drag,[19*32],[1*32],dx_dragon,dragon_speed)# random movement of dragon
        enemy_attack.dir_update(drag,hero,dy_dragon) # direction update of enemy
        enemy_attack.image_update(drag,image_variable,dy_dragon,dragonimages) # image update of enemy

        enemy_attack.remove_arrow(arrow_list,enm,HP_ENM,arrow_dir,sprite_layers,point_arrow) # removes arrow from the screen
        enemy_attack.remove_arrow(specialarrow_list,drag,HP_DRAGON,specialarrow_dir,sprite_layers,point_specialarrow) # removes specialarrow from the screen

        # decrease health of hero if it colldes with dragon
        if pygame.sprite.collide_rect(hero,drag[0]):
            weap_sound = sound.create_soundfx('./sounds/weapon_touch.ogg')
            sound.volume(weap_sound,0.4)
            savegame=pk.load(open("./save.p","rb"))
            savegame['hp'] -= point_dragon
            pk.dump(savegame,open("./save.p","wb"))
            
        # game starts again if player dies
        if savegame['hp'] <= 0:
            sound.stop_soundfx(battlefield_sound)
            savegame['xp'] = old_xp
            savegame['h_level'] = old_level
            savegame['sheild_hp'] = old_armor
            savegame['arrow_count'] = old_arrow
            savegame['hp'] = savegame['max_hp']
            pk.dump(savegame,open("./save.p","wb"))
            menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0)
            life = 0
            running = False

        # Game ends!
        # clean the screen!
        if HP_DRAGON[0] <= 0:
            i = 0
            l = len(enm)
            while(i>=0 and i<l):
                sprite_layers[1].remove_sprite(enm[i])
                enm.pop(i)
                l = len(enm)
            i = 0
            l = len(weap_list)
            while(i>=0 and i<l):
                sprite_layers[2].remove_sprite(weap_list[i])
                weap_list.pop(i)
                l = len(weap_list)
            i = 0
            l = len(arrow_list)
            while(i>=0 and i<l):
                sprite_layers[1].remove_sprite(arrow_list[i])
                arrow_list.pop(i)
                l = len(arrow_list)
            i = 0
            l = len(specialarrow_list)
            while(i>=0 and i<l):
                sprite_layers[1].remove_sprite(specialarrow_list[i])
                specialarrow_list.pop(i)
                l = len(specialarrow_list)
            sprite_layers[1].remove_sprite(drag[0])
            render_update(renderer,sprite_layers,screen)
            sound.stop_soundfx(battlefield_sound)
            running = False
            life = 2
            
        # adjust camera according to the hero's position, follow him
        cam_pos_x = hero.rect.centerx
        cam_pos_y = hero.rect.centery
        if hero.rect.centerx <= 520 :
            cam_pos_x = 520
        if hero.rect.centery >=1050:
            cam_pos_y = 1050
        elif hero.rect.centery <=407:
            cam_pos_y = 407
        renderer.set_camera_position(cam_pos_x, cam_pos_y)

        # interface update
        c_pos=(cam_pos_x,cam_pos_y)
        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)
        dhp_sprite.rect.midbottom=(c_pos[0],c_pos[1]+350)
        d_hp.rect.midbottom=(c_pos[0],c_pos[1]+350)
        spec_interf.rect.topleft=(c_pos[0]-512,c_pos[1]-240)
        s_a.rect.topleft=(c_pos[0]-540,c_pos[1]-280)

        # clear screen, might be left out if every pixel is redrawn anyway
        screen.fill((0, 0, 0))
        (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen)
        
    if life == 0:
        demo_pygame('./maps/palace_final.tmx',0)
    elif life ==2:
        # Game ends!
        # Quit the window after pressing 'Esc'
        running = True
        ending_sound = sound.create_soundfx('./sounds/ending.ogg')
        sound.volume(ending_sound,1)
        while running :
            for event in pygame.event.get():
                if (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE ):
                    sound.stop_soundfx(ending_sound)
                    running = False
        pygame.quit()
Exemple #14
0
def demo_pygame(file_name,frm):
    # 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 
    file = './sounds/hotel.ogg'
    m = mixer.music.load(file)
    mixer.music.play(-1);
    
    #set up a screen
    screen_width = min(900, 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()

    # create hero sprite
    hero_pos_x = 200
    hero_pos_y = 1600
    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 = 5

    # 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[2].add_sprite(hero)
    
    # add pots positions
    ty=pk.load(open("./save.p","rb"))
    t=ty['hotel_treasure']
    pots_pos_x=[100,520,800,180]
    pots_pos_y=[960,960,820,120]
    pots=[]
    flag=[0,0,0,0,0]
    for i in range(4):
        if t[i]==0 :
            pots.append(create_pot(pots_pos_x[i], pots_pos_y[i]));
    
    c_pos=[cam_world_pos_x, cam_world_pos_y]
    ty=pk.load(open("./save.p","rb"))
    hp=ty['hp']
    hp_max=ty['max_hp']      
    interf_toggle=0
    interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) 
    hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png')
    l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos)
    [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos)
    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)

        
    # variables for the main loop
    clock = pygame.time.Clock()
    running = True
    speed=6
    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT,1000)
    mr=ml=md=mu=0

    #create portals to detect when to change map
    portal1 = pygame.Rect(19*20,73*20,5*20,2*20)
    portal2 = pygame.Rect(2*20,81*20,40*20,40)

    # mainloop
    while running:
        dt = clock.tick(40)
        ty=pk.load(open("./save.p","rb"))
                    
        # event handling

        for event in pygame.event.get():
            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)

            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
                

        # 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]

        # adjust camera according to the hero's position, follow him
        if ( hero.rect.centery >=1280):
            renderer.set_camera_position(450, 1280)
            c_pos=(450+60,1360)
        elif (hero.rect.centery <=400):
            renderer.set_camera_position(450, 400)
            c_pos=(450+60,400)
        else:
            renderer.set_camera_position(450,hero.rect.centery )
            c_pos=(450+60,hero.rect.centery)


        #place health,experience and armours
        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)

        # 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)
                
        ##If talk to receptionist
        #List Variable to check if the person has bought the room or not
        pos_hero=None
        if(flag[4] == 0 and pygame.Rect.colliderect(portal1,hero.rect) and pygame.key.get_pressed()[pygame.K_SPACE]==1):
            pos_hero=menu.warning_msg(file_name,renderer,sprite_layers,screen,c_pos,0)

        if pos_hero!=None:
            hero_pos_x=pos_hero[0]
            hero_pos_y= pos_hero[1]
            ty=pk.load(open("./save.p","rb"))

        if(portal2.collidepoint(hero.rect.midbottom)): 
            pk.dump(ty,open("./save.p","wb"))
            mixer.music.stop()
            running=False
        t=ty['hotel_treasure']
        n=hero.rect.collidelist(pots)
        if  n== 0 and flag[n]==0 and t[n]==0 :
            ty['hp']+=5
            flag[n]=1
            t[n]=1 
        elif n==1 and flag[n]==0 and t[n]==0 :
            ty['gold']+=5
            flag[n]=1
            t[n]=1 
        elif n==2 and flag[n]==0 and t[n]==0 :
            ty['gold']+=10
            flag[n]=1
            t[n]=1 
        elif n==3 and flag[n]==0 and t[n]==0 :
            ty['hp']+=10
            flag[n]=1
            t[n]=1 
                     
            
        ty['hotel_treasure']=t
        pk.dump(ty,open("./save.p","wb"))
        pygame.display.flip()

    shifty1.demo_pygame('./maps/village2_inside.tmx',1)