Untitled

 avatar
unknown
python
a year ago
9.2 kB
4
Indexable
# Check if a game is already in progress on this server
if server_var("devinette") == "True":
    set_error(f"❌ {user.mention}, A game is already in progress. Please wait until the current game is finished.")
else:
    # Update the server variable to indicate that a game is starting
    update_server_var("devinette", "True")

# List of riddles for the game
riddles = [
    {
        "question": "I am the most famous Italian plumber in video game history, often seen with a red hat. Who am I?",
        "answers": ["mario"]  # Accepted answer for this riddle
    },
    {
        "question": "I am a life simulation game developed by Maxis, where players can create and control virtual characters. What is my name?",
        "answers": ["the sims", "sims", "les sims"]  # Accepted answers for this riddle
    },
    {
        "question": "I am a video game franchise developed by Mojang, where players can build and explore blocky worlds. What is my name?",
        "answers": ["minecraft"]  # Accepted answers for this riddle
    },
    {
        "question": "I am a kart racing game where players can choose from iconic Nintendo characters. What is my name?",
        "answers": ["mario kart"]  # Accepted answers for this riddle
    },
]

# Constants for managing the game
MAX_PASSES = 3  # Maximum number of passes allowed
MAX_ATTEMPTS = 3  # Maximum number of attempts per riddle
RESPONSE_TIMEOUT = 65  # Time to wait for a response in seconds

# Prefixes and messages for managing responses
CORRECT_ANSWER_PREFIX = "✅ Correct answer! Here is the next one:"
INCORRECT_ANSWER_MSG = "❌ Incorrect answer. Try again! Attempts remaining: `{}`"

PASS_ANSWER_PREFIX = "🔄 You have skipped this riddle. Here is the next one:"
LAST_RIDDLE_PASS_WARNING = "⚠️ You can no longer skip; this is the last riddle. You must answer it."

END_GAME_TIMEOUT_MSG = "⏰ Time is up, {user}. **Game over.**"
END_GAME_MAX_PASSES_MSG = f"❌ You have reached the maximum number of passes (`{MAX_PASSES}`). Game over."
END_GAME_MAX_ATTEMPTS_MSG = f"❌ You have reached the maximum number of attempts (`{MAX_ATTEMPTS}`). **Game over.**"
CONGRATULATIONS_MSG = "## 🎉 Congratulations! You have answered all the riddles correctly!"


###################################################### add this in POST HOOK:###########################################################

# Class to store user data during the game
class UserData:
    def __init__(self, riddles):
        self.riddles = riddles.copy()  # Copy the riddles to avoid accidental modification
        self.passed = []  # List of skipped riddles
        self.current_index = 0  # Index of the current riddle
        self.attempts = 0  # Number of attempts for the current riddle
        self.passes = 0  # Number of passes used

# Function to get remaining information about riddles and passes
def get_remaining_info(user_data):
    remaining_riddles = (len(user_data.riddles) - user_data.current_index - 1) + len(user_data.passed)
    passes_remaining = MAX_PASSES - user_data.passes
    return remaining_riddles, passes_remaining

# Function to start the game
async def start_game(interaction, user, channel):
    pyrandom.shuffle(riddles)  # Shuffle the riddles
    user_data = UserData(riddles)  # Create an instance of UserData with shuffled riddles
    respond_interaction(interaction, embed=load_embed("clyzurbw903hpcza7h4354w0p"))  # Respond to the interaction with a welcome message
    await send_riddle(channel, user_data)  # Send the first riddle
    await handle_user_response(user, channel, user_data)  # Handle the user's response

# Function to send a riddle
async def send_riddle(channel, user_data, prefix=""):
    async def send_riddle_message():
        question = user_data.riddles[user_data.current_index]['question']  # Get the question of the current riddle
        remaining_riddles, passes_remaining = get_remaining_info(user_data)  # Get remaining information
        message = f"{prefix}\n> 👉 **{question}**\nRemaining riddles: `{remaining_riddles}` | Passes remaining: `{passes_remaining}`"
        send_message(channel.id, message)  # Send the riddle message

    if user_data.current_index < len(user_data.riddles):  # If there are still riddles to ask
        await send_riddle_message()  # Send the current riddle
    elif user_data.passed:  # If all riddles have been asked and some riddles have been skipped
        user_data.riddles = user_data.passed  # Reset riddles with the skipped riddles
        user_data.passed = []  # Reset the list of skipped riddles
        user_data.current_index = 0  # Reset the current index
        pyrandom.shuffle(user_data.riddles)  # Shuffle riddles again
        await send_riddle_message()  # Send the riddle for the new series
    else:
        await end_game(channel, CONGRATULATIONS_MSG)  # If no riddles are available, send a congratulations message
        return True

    return False

# Function to handle the user's response
async def handle_user_response(user, channel, user_data):
    if user_data.current_index >= len(user_data.riddles) and not user_data.passed:
        return  # If all riddles have been asked and no more riddles are available, do nothing
    response = await get_answer(user, channel)  # Wait for the user's response
    if not response:
        await end_game(channel, END_GAME_TIMEOUT_MSG.format(user=user.mention))  # If no response is received within the timeout, send a game over message
    else:
        await process_answer(user, channel, response.content.lower(), user_data)  # Process the user's response

# Function to get a response from the user
async def get_answer(user, channel):
    def predicate(event):
        return event.author_id == user.id and event.channel_id == channel.id  # Filter messages from the user in the correct channel
    
    return await wait_for("message", timeout=RESPONSE_TIMEOUT, predicate=predicate)  # Wait for a message matching the criteria

# Function to end the game
async def end_game(channel, message):
    update_server_var("devinette", "False")  # Reset the server variable
    send_message(channel.id, message)  # Send a game over message

# Function to process the user's answer
async def process_answer(user, channel, answer, user_data):
    current_riddle = user_data.riddles[user_data.current_index]  # Get the current riddle
    correct_answers = current_riddle["answers"]  # Get the correct answers for this riddle

    if answer in ["pass", "p"]:  # If the user wants to skip
        await handle_pass(user, channel, user_data)  # Handle the pass
    elif answer in correct_answers:  # If the answer is correct
        await handle_correct_answer(user, channel, user_data)  # Handle the correct answer
    else:  # If the answer is incorrect
        await handle_incorrect_answer(user, channel, user_data)  # Handle the incorrect answer

# Function to handle skipping a riddle
async def handle_pass(user, channel, user_data):
    if user_data.passes >= MAX_PASSES:  # If the maximum number of passes has been reached
        await end_game(channel, END_GAME_MAX_PASSES_MSG)  # Send a game over message
        return
    
    remaining_riddles, _ = get_remaining_info(user_data)  # Get remaining information
    if remaining_riddles == 0:  # If no riddles are left to ask
        send_message(channel.id, LAST_RIDDLE_PASS_WARNING)  # Send a warning message
    else:
        user_data.passes += 1  # Increment the number of passes used
        user_data.passed.append(user_data.riddles[user_data.current_index])  # Add the current riddle to the list of skipped riddles
        user_data.attempts = 0  # Reset the number of attempts
        user_data.current_index += 1  # Move to the next riddle
        await send_riddle(channel, user_data, prefix=PASS_ANSWER_PREFIX)  # Send the next riddle with the skip prefix

    await handle_user_response(user, channel, user_data)  # Handle the next user response

# Function to handle a correct answer
async def handle_correct_answer(user, channel, user_data):
    user_data.current_index += 1  # Move to the next riddle
    user_data.attempts = 0  # Reset the number of attempts
    if await send_riddle(channel, user_data, prefix=CORRECT_ANSWER_PREFIX):  # Send the next riddle with the correct answer prefix
        return
    await handle_user_response(user, channel, user_data)  # Handle the next user response

# Function to handle an incorrect answer
async def handle_incorrect_answer(user, channel, user_data):
    user_data.attempts += 1  # Increment the number of attempts
    if user_data.attempts >= MAX_ATTEMPTS:  # If the maximum number of attempts has been reached
        await end_game(channel, END_GAME_MAX_ATTEMPTS_MSG)  # Send a game over message
    else:
        attempts_remaining = MAX_ATTEMPTS - user_data.attempts  # Calculate remaining attempts
        send_message(channel.id, INCORRECT_ANSWER_MSG.format(attempts_remaining))  # Send a message with the number of attempts remaining
        await handle_user_response(user, channel, user_data)  # Handle the next user response

# Start the game with the given interaction, user, and channel
await start_game(interaction, user, channel)
Editor is loading...
Leave a Comment