Simple minigames (Screen Language only).

A place for Ren'Py tutorials and reusable Ren'Py code.
Forum rules
Do not post questions here!

This forum is for example code you want to show other people. Ren'Py questions should be asked in the Ren'Py Questions and Announcements forum.
Message
Author
User avatar
Trafagal
Regular
Posts: 100
Joined: Mon Apr 29, 2019 9:32 am
Contact:

Re: Simple minigames (Screen Language only).

#106 Post by Trafagal »

Alex wrote: Sun Aug 29, 2021 11:20 am Try to set any default value for variable

Code: Select all

default diff_timer = 0
The original code was made long time ago, and for now the proper way is to set default values for variables that will be changed during the game.
https://www.renpy.org/doc/html/python.h ... -statement
Thank you Alex, I manage to find the reason why. I think maybe no need to define the diff_timer.

Just to share with others who might be looking for the "Find the Difference" Game.
You need to update a small part of this section in the original codes for the screen left and right. Be careful of the indentation.

Code: Select all

screen left_scr:
# Screen at left has all differences
    fixed:
        xpos 50 ypos 100
        button:
            background "base_image_{}.png".format(x)
            action Show('left_scr', diff_timer-1)
            mouse "left" 
Check out some of my stuffs here:https://linktr.ee/theartofjoshlab

Art Portfolio: https://www.instagram.com/theartofjoshlab/

Working on a personal Visual Novel~

User avatar
Bryy
Veteran
Posts: 407
Joined: Thu Dec 20, 2012 10:12 pm
Completed: 30+ games so far
Projects: Furry Shakespeare
Organization: Stegalosaurus Game Development
Location: Portage, MI
Contact:

Re: Simple minigames (Screen Language only).

#107 Post by Bryy »

Is there a way to do an effective Tower Defense in Renpy?

User avatar
Alex
Lemma-Class Veteran
Posts: 3094
Joined: Fri Dec 11, 2009 5:25 pm
Contact:

Re: Simple minigames (Screen Language only).

#108 Post by Alex »

CDD or sprite manager maybe...
Maybe someone will share the code if you'll ask in Q&A forum...;)

User avatar
Bryy
Veteran
Posts: 407
Joined: Thu Dec 20, 2012 10:12 pm
Completed: 30+ games so far
Projects: Furry Shakespeare
Organization: Stegalosaurus Game Development
Location: Portage, MI
Contact:

Re: Simple minigames (Screen Language only).

#109 Post by Bryy »

Alex wrote: Fri Oct 01, 2021 12:52 pm Maybe someone will share the code if you'll ask in Q&A forum...;)
Don't bring logic into this.

Neyunse
Newbie
Posts: 8
Joined: Fri Aug 17, 2018 7:08 pm
Projects: Roses Of Love
Organization: KagariSoft
Github: Neyunse
itch: KagariSoft
Location: Argentina
Contact:

Re: Simple minigames (Screen Language only).

#110 Post by Neyunse »

Alex wrote: Sat Dec 12, 2015 8:25 pm Group battle game.

Code: Select all

define battle_narrator = Character(None, interact=False)

screen battle_screen:
    vbox:
        xalign 0.01 yalign 0.05
        spacing 5
        
        for each_party_member in party_list:
            frame:
                size_group "party"
                xminimum 250 xmaximum 250
                yminimum 75
                vbox:
                    text "[each_party_member[name]]" size 22 xalign 0.5
                    null height 5
                    hbox:
                        bar:
                            xmaximum 130
                            value each_party_member["current_hp"]
                            range each_party_member["max_hp"]
                            left_gutter 0
                            right_gutter 0
                            thumb None
                            thumb_shadow None
                            
                        null width 5
                        
                        text "[each_party_member[current_hp]] / [each_party_member[max_hp]]" size 16
        hbox:
            frame:
                size_group "party"
                yminimum 40
                text "Potions left - [potions_left]" yalign 0.5
            if players_turn and potions_left > 0:
                textbutton "<- Use" action Return("heal") yminimum 40
            else:
                textbutton "<- Use" action None yminimum 40
                        
                        
    vbox:
        xalign 0.99 yalign 0.05
        spacing 5
        
        if enemies_list != []:
            for i, each_enemy_member in enumerate(enemies_list):
                hbox:
                    if players_turn and each_enemy_member["current_hp"] > 0:
                        textbutton "Attack ->" action Return(i) yminimum 75
                    else:
                        textbutton "Attack ->" action None yminimum 75
                    
                    frame:
                        size_group "enemies"
                        xminimum 250 xmaximum 250
                        yminimum 75
                        vbox:
                            text "[each_enemy_member[name]]" size 22 xalign 0.5
                            null height 5
                            hbox:
                                bar:
                                    xmaximum 130
                                    value each_enemy_member["current_hp"]
                                    range each_enemy_member["max_hp"]
                                    left_gutter 0
                                    right_gutter 0
                                    thumb None
                                    thumb_shadow None
                                    
                                null width 5
                                
                                text "[each_enemy_member[current_hp]] / [each_enemy_member[max_hp]]" size 16
            
            

init python:
    def check_party(x):
        #### This function will check
        # if at least one of X party members is alive.
        #        
        for member in x:
            if member["current_hp"] > 0:
                return "ok"
                
        return "lost"



label battle_game_2:
    #### Some variables that describes the game state.
    #
    # The "party_list" is a list of all allies each one of that
    # is described by a dictionary.
    #
    $ party_list =[{"name":"Me", "max_hp":50, "current_hp":50, "min_damage":3, "max_damage":5}]
    $ potions_left = 10
    $ players_turn = False
    
    #### Enemies list will have the description for enemies.
    #
    $ enemies_list = []
    
    scene black
    
    #### Let's show the game screen.
    #
    show screen battle_screen
    
    
    #### We can add some allies to the party:
    #
    menu:
        "Who do you take with you?"
        
        "Friend 1":
            $ party_list.append ( {"name":"Friend 1", "max_hp":30, "current_hp":30, "min_damage":5, "max_damage":6} )
            
        "Friend 2":
            $ party_list.append ( {"name":"Friend 2", "max_hp":60, "current_hp":60, "min_damage":1, "max_damage":4} )
            
        "Noone... :(":
            pass
            
    
    #### Enemies party can be set manually or automatically like:
    #
    python:
        for i in range ( 0, renpy.random.randint(1,4) ):
            enemy_name = "Enemy %d" %i
            enemy_max_hp = renpy.random.randint(10,20)
            enemy_current_hp = enemy_max_hp
            enemy_min_damage = renpy.random.randint(1,3)
            enemy_max_damage = renpy.random.randint(4,6)
            
            enemies_list.append ( {"name":enemy_name, "max_hp":enemy_max_hp, "current_hp":enemy_current_hp, "min_damage":enemy_min_damage, "max_damage":enemy_max_damage} )
            
    
    "Let the battle begins!"
    
    #### Main battle loop.
    #
    label battle_2_loop:
        
        #### At first let's check if player's party is ok.
        #
        if check_party(party_list) == "lost":
            jump battle_2_lose
                
        
        #### All the party members will do their actions one after another.
        #
        $ party_index = 0
        
        while party_index < len(party_list):
            
            $ current_player = party_list[party_index]
            
            #### Current player will act only if he still alive.
            #
            if current_player["current_hp"] > 0:
                
                #### Let's check if enemies party is still ok.
                #
                if check_party(enemies_list) == "lost":
                    jump battle_2_win
            
                #### Let the player make his turn.
                #
                $ players_turn = True
                
                battle_narrator"[current_player[name]], it's your turn now."
                
                #### Store the result of player's interaction.
                #
                $ res = ui.interact()
                
                #### Now disallow player's interact with the game.
                #
                $ players_turn = False
                
                if res == "heal":
                    $ current_player["current_hp"] = min( current_player["current_hp"]+5, current_player["max_hp"] )
                    $ potions_left -= 1
                    "*Drink* 5hp restored"
                
                else:
                    $ player_damage = renpy.random.randint( current_player["min_damage"], current_player["max_damage"] )
                    $ enemies_list[res]["current_hp"] -= player_damage
                    "Take this! (damage dealt - [player_damage]hp)"
                    
            
            #### And the turn goes to the next party member.
            #
            $ party_index += 1
                    
            
            
        ##### And now it's enemies party turn.
        # 
        # At first let's check if enemy's party is ok.
        #
        if check_party(enemies_list) == "lost":
            jump battle_2_win
        
        
        
        #### All the party members will do their actions one after another.
        #
        $ enemy_index = 0
        
        while enemy_index < len(enemies_list):
            $ current_enemy = enemies_list[enemy_index]
            
            #### Current enemy will act only if he is still alive.
            #
            if current_enemy["current_hp"] > 0:
                
                #### Let's check if player's party is still ok.
                #
                if check_party(party_list) == "lost":
                    jump battle_2_lose
                
                #### Enemy will attack the random player.
                #
                $ party_member_to_attack = party_list[renpy.random.randint( 0, (len(party_list)-1) )]
                
                $ enemy_damage = renpy.random.randint( current_enemy["min_damage"], current_enemy["max_damage"] )
                
                $ party_member_to_attack["current_hp"] -= enemy_damage
                
                "Rrrrr! ([current_enemy[name]] dealt [enemy_damage]hp damage to [party_member_to_attack[name]])"
                
            
            #### And the turn goes to the next party member.
            #
            $ enemy_index += 1
            
            
        #### Next round of the battle.
        #
        jump battle_2_loop
            
            
#### The results of the game.
#
label battle_2_win:
    "Well done!"
    hide screen battle_screen
    return
    
label battle_2_lose:
    "X_X"
    hide screen battle_screen
    return
A question, how can I display interactive sprites (ex. imagebuttons), to choose who to attack?
----------------------------------------------------
My Twitter: @Neyunse
My Discord: ねゆんせ#7916
----------------------------------------------------
KagariSoft Twitter: @KagariSoft
My Discord Server

User avatar
Alex
Lemma-Class Veteran
Posts: 3094
Joined: Fri Dec 11, 2009 5:25 pm
Contact:

Re: Simple minigames (Screen Language only).

#111 Post by Alex »

Neyunse wrote: Thu Mar 24, 2022 4:14 pm A question, how can I display interactive sprites (ex. imagebuttons), to choose who to attack?
Well, add an image to enemy description

Code: Select all

    #### Enemies party can be set manually or automatically like:
    #
    python:
        for i in range ( 0, renpy.random.randint(1,4) ):
            enemy_name = "Enemy %d" %i
            enemy_max_hp = renpy.random.randint(10,20)
            enemy_current_hp = enemy_max_hp
            enemy_min_damage = renpy.random.randint(1,3)
            enemy_max_damage = renpy.random.randint(4,6)
            enemy_image = "images/enemy.png"
            
            enemies_list.append ( {"name":enemy_name, "image":enemy_image, "max_hp":enemy_max_hp, "current_hp":enemy_current_hp, "min_damage":enemy_min_damage, "max_damage":enemy_max_damage} )

Then change this part of "battle_screen" to show enemies as buttons using their images

Code: Select all

    vbox:
        xalign 0.99 yalign 0.05
        spacing 5
        
        if enemies_list != []:
            for i, each_enemy_member in enumerate(enemies_list):
                hbox:
                    if players_turn and each_enemy_member["current_hp"] > 0:
                        textbutton "Attack ->" action Return(i) yminimum 75
                    else:
                        textbutton "Attack ->" action None yminimum 75
                    
                    frame:
                        size_group "enemies"
                        xminimum 250 xmaximum 250
                        yminimum 75
                        vbox:
                            text "[each_enemy_member[name]]" size 22 xalign 0.5
                            null height 5
                            hbox:
                                bar:
                                    xmaximum 130
                                    value each_enemy_member["current_hp"]
                                    range each_enemy_member["max_hp"]
                                    left_gutter 0
                                    right_gutter 0
                                    thumb None
                                    thumb_shadow None
                                    
                                null width 5
                                
                                text "[each_enemy_member[current_hp]] / [each_enemy_member[max_hp]]" size 16

Max987r
Newbie
Posts: 11
Joined: Fri May 13, 2022 10:28 am
Contact:

Re: Simple minigames (Screen Language only).

#112 Post by Max987r »

Hey Alex
How can I make (in memoria )that if you match certain cards it will reduce timer ?

Like eg:- AA is matched timer reduce to 50 to 40 or 45 to 35 decreases 10


Pls help 🙏

Max987r
Newbie
Posts: 11
Joined: Fri May 13, 2022 10:28 am
Contact:

Re: Simple minigames (Screen Language only).

#113 Post by Max987r »

Max987r wrote: Mon May 16, 2022 7:24 am Hey Alex
How can I make (in memoria )that if you match certain cards it will reduce timer ?

Like eg:- AA is matched timer reduce to 50 to 40 or 45 to 35 decreases 10


Pls help 🙏
Solved it BTW thanks for the game idea.

Max987r
Newbie
Posts: 11
Joined: Fri May 13, 2022 10:28 am
Contact:

Re: Simple minigames (Screen Language only).

#114 Post by Max987r »

Max987r wrote: Mon May 16, 2022 9:31 am
Max987r wrote: Mon May 16, 2022 7:24 am Hey Alex
How can I make (in memoria )that if you match certain cards it will reduce timer ?

Like eg:- AA is matched timer reduce to 50 to 40 or 45 to 35 decreases 10


Pls help 🙏
Solved it BTW thanks for the game idea.
Help again how can I make it even if the trap cards are not removed from the grid the game end?

That is if player not open the traps game win but the have to match all none trap cards


Eg: AA you have to match if you dont find T(trap) game ends

User avatar
Alex
Lemma-Class Veteran
Posts: 3094
Joined: Fri Dec 11, 2009 5:25 pm
Contact:

Re: Simple minigames (Screen Language only).

#115 Post by Alex »

Max987r wrote: Mon May 16, 2022 10:54 am Help again how can I make it even if the trap cards are not removed from the grid the game end?

That is if player not open the traps game win but the have to match all none trap cards


Eg: AA you have to match if you dont find T(trap) game ends
If you've made your trap cards this way - viewtopic.php?f=51&t=18047&start=45#p466948 then winning condition will be

Code: Select all

            # If cards are matched, will check if player has opened all the cards
            else:
                $ renpy.pause (1.0, hard = True)
                python: 
                    
                    # Let's remove opened cards from game field
                    # But if you prefere to let them stay - just comment out next 2 lines
                    for i in range (0, len(turned_cards_numbers) ):
                        cards_list[turned_cards_numbers[i]]["c_value"] = Null()
                        
                        
                    for j in cards_list:
                        if j["c_chosen"] == False and j["c_value"] not in trap_cards: # <---
                            renpy.jump ("memo_game_loop")
                    renpy.jump ("memo_game_win")

Max987r
Newbie
Posts: 11
Joined: Fri May 13, 2022 10:28 am
Contact:

Re: Simple minigames (Screen Language only).

#116 Post by Max987r »

Alex wrote: Mon May 16, 2022 3:19 pm
Max987r wrote: Mon May 16, 2022 10:54 am Help again how can I make it even if the trap cards are not removed from the grid the game end?

That is if player not open the traps game win but the have to match all none trap cards


Eg: AA you have to match if you dont find T(trap) game ends
If you've made your trap cards this way - viewtopic.php?f=51&t=18047&start=45#p466948 then winning condition will be

Code: Select all

            # If cards are matched, will check if player has opened all the cards
            else:
                $ renpy.pause (1.0, hard = True)
                python: 
                    
                    # Let's remove opened cards from game field
                    # But if you prefere to let them stay - just comment out next 2 lines
                    for i in range (0, len(turned_cards_numbers) ):
                        cards_list[turned_cards_numbers[i]]["c_value"] = Null()
                        
                        
                    for j in cards_list:
                        if j["c_chosen"] == False and j["c_value"] not in trap_cards: # <---
                            renpy.jump ("memo_game_loop")
                    renpy.jump ("memo_game_win")
Thanks Alex I will try it out
:D

Max987r
Newbie
Posts: 11
Joined: Fri May 13, 2022 10:28 am
Contact:

Re: Simple minigames (Screen Language only).

#117 Post by Max987r »

Max987r wrote: Tue May 17, 2022 1:53 am
Alex wrote: Mon May 16, 2022 3:19 pm
Max987r wrote: Mon May 16, 2022 10:54 am Help again how can I make it even if the trap cards are not removed from the grid the game end?

That is if player not open the traps game win but the have to match all none trap cards


Eg: AA you have to match if you dont find T(trap) game ends
If you've made your trap cards this way - viewtopic.php?f=51&t=18047&start=45#p466948 then winning condition will be

Code: Select all

            # If cards are matched, will check if player has opened all the cards
            else:
                $ renpy.pause (1.0, hard = True)
                python: 
                    
                    # Let's remove opened cards from game field
                    # But if you prefere to let them stay - just comment out next 2 lines
                    for i in range (0, len(turned_cards_numbers) ):
                        cards_list[turned_cards_numbers[i]]["c_value"] = Null()
                        
                        
                    for j in cards_list:
                        if j["c_chosen"] == False and j["c_value"] not in trap_cards: # <---
                            renpy.jump ("memo_game_loop")
                    renpy.jump ("memo_game_win")
Thanks Alex I will try it out
:D
it work but not as I intended

what i meant is player must match card that are in value_list but if you open card in trap_list time will decreaseand it will get removed and if the player matches all the cards only in value list then the game end it doest matter if trap_list cards are matched or not.


eg:-

Code: Select all

   value_list = [A,B,C,D] Trap_list = [T] 
 grid:  ABCD                                 
        TABC          
        DTAA

if player open (T) time decreases (X represent open matches)
End Of game grid:  
       XXXX
       TXXX
       XTXX   
  game ends even with trap cards on the field (just the cards in value list are matched) 

User avatar
Alex
Lemma-Class Veteran
Posts: 3094
Joined: Fri Dec 11, 2009 5:25 pm
Contact:

Re: Simple minigames (Screen Language only).

#118 Post by Alex »

Max987r wrote: Tue May 17, 2022 4:30 am ...what i meant is player must match card that are in value_list but if you open card in trap_list time will decreaseand ...
Try to make time penalty like

Code: Select all

        label turns_loop:
            if turns_left > 0:
                $ result = ui.interact()
                $ memo_timer = memo_timer
                $ turned_cards_numbers.append (cards_list[result]["c_number"])
                $ turned_cards_values.append (cards_list[result]["c_value"])
                if cards_list[result]["c_value"] in trap_cards:  #<----- check for trap-cards
                    $ memo_timer -= 5 # <---
                    jump turns_done
                $ turns_left -= 1
                jump turns_loop

Max987r
Newbie
Posts: 11
Joined: Fri May 13, 2022 10:28 am
Contact:

Re: Simple minigames (Screen Language only).

#119 Post by Max987r »

Alex wrote: Tue May 17, 2022 11:52 am
Max987r wrote: Tue May 17, 2022 4:30 am ...what i meant is player must match card that are in value_list but if you open card in trap_list time will decreaseand ...
Try to make time penalty like

Code: Select all

        label turns_loop:
            if turns_left > 0:
                $ result = ui.interact()
                $ memo_timer = memo_timer
                $ turned_cards_numbers.append (cards_list[result]["c_number"])
                $ turned_cards_values.append (cards_list[result]["c_value"])
                if cards_list[result]["c_value"] in trap_cards:  #<----- check for trap-cards
                    $ memo_timer -= 5 # <---
                    jump turns_done
                $ turns_left -= 1
                jump turns_loop
I have done that and that's how I was able to decrease the time.
I need your help to figure out how to make even some card ie trap cards remain on screen game ends?

User avatar
Alex
Lemma-Class Veteran
Posts: 3094
Joined: Fri Dec 11, 2009 5:25 pm
Contact:

Re: Simple minigames (Screen Language only).

#120 Post by Alex »

Max987r wrote: Tue May 17, 2022 1:58 pm ...I need your help to figure out how to make even some card ie trap cards remain on screen game ends?
This will end the game if only trap cards are remain onscreen - viewtopic.php?f=51&t=18047&p=552135&sid ... f9#p552110

Post Reply

Who is online

Users browsing this forum: No registered users