Twine or Ren'py?

Caeli Astraeus

Formerly Bad at Writing
Game Developer
Jun 24, 2017
45
32
I have no coding experience except very basic LUA, I think im a decent artist and I already have a story/plot fully written out. I just have no idea what engine I should try to learn for this specific idea, I want it to be a text based with multiple options similar to twine and ren'py but I also want to include minigames for various story parts. I read that both are difficult to incorporate minigames in and special minigames will be the main point of the game.

It's written to be an island survival with resource collection, turn based combat from a top down perspective over markers/character portraits, lockpicking type minigames, minesweeper like game for getting resources, etc. It's an ambitious project but I have time and the patience, just not the coding ability that I need to get.
 

79flavors

Well-Known Member
Respected User
Jun 14, 2018
1,611
2,258
I'm a fan of RenPy... so my answer is RenPy.

Whilst turn based combat and mini-games are possible in RenPy, it's merely "capable" of it, not really designed for it. Lockpicking, specifically strikes me as something I personally wouldn't want to undertake (but I'm a low maintenance dev - there are lots I don't want to do).

You want to tell a story, with lots of pictures, maybe the odd animation and a soundtrack? RenPy is easy.
You want to add on-screen, clickable elements into the mix...? Yeah, RenPy will do that... with a little more effort.

But mini-games... yeah, that's potentially a lot of effort. Particularly if you can't heavily "borrow" from someone else.

"Top down perspective"... well, that depends. To me that sounds like a simple picture background designed to "look" like a perspective view - with some overlaid clickable sprites. RenPy can do that. But if you want "real" top down perspective... you need to look at a whole different type of game engine, like Unity.
 
  • Like
Reactions: Caeli Astraeus

Caeli Astraeus

Formerly Bad at Writing
Game Developer
Jun 24, 2017
45
32
Alright so ren'py it is, thank you very much for that detailed answer and for the idea of the top down sprites.
 

anne O'nymous

I'm not grumpy, I'm just coded that way.
Modder
Donor
Respected User
Jun 10, 2017
10,979
16,236
Lockpicking, specifically strikes me as something I personally wouldn't want to undertake (but I'm a low maintenance dev - there are lots I don't want to do).
From the list it's probably what is the easiest thing to do.

Note: wrote totally on the fly, the code will surely not works directly
Python:
label whatever:

    # Display the image where the lock is shown
    show theBackground
    # The lockpicking interface
    # - A number between 65 and 255 that will represent the lock
    # - X position of the pick
    # - Starting Y position of the pick
    call screen lockpick( renpy.random.randint( 65, 255), 100, 200 )
    if _return == "success":
        "Congratulation."


screen lockpick( lock, pickX, pickY ):

    default step = 0

    # Show the pick at the right position
    add pickImage pos( pickX, pickY )

    # The interface itself
    hbox:
        yalign 0.9

        # Move the pick to the left
        textbutton "Left":
            # There's 8 (0->7) notches by lock, if not at the last one, 
            # move a step to the left, then move the pick on the screen.
            action If( step < 8, [ SetScreenVariable( "step", step + 1 ), SetLocalVariable( "pickY", pickY - 50 ) ], NullAction() )
            # Opposite action.
        textbutton "Right":
            action If( step > 0, [ SetScreenVariable( "step", step - 1 ), SetLocalVariable( "pickY", pickY + 50 ) ], NullAction() )
            # Try to activate the actual notche.
            # If the actual step correspond to a raised bit in the lock
            # you past a notche.
        textbutton "Try":
            action If( lock & ( 1 << step ), [ SetLocalVariable( "lock", lock - ( lock & ( 1 << step ) ) ), PLAY_A_SUCCESS_SOUND_HERE ], PLAY_A_FAILURE_SOUND_HERE )
            # Too hard, abandon.
        textbutton "Give up":
            action Return( "abandon" )

    # If all notches have been passed, return in 1/100th second.
    showif lock == 0:
        timer 0.01 action Return( "success" )
As it, it's a stupid mini-game. Try all notches one after the other and you'll win. But you can add a reset of the lock after two failures by example. Up to the player to remember where the pick was each time he heard the "success sound" to slowly reproduce the right combination.
Complete the "left"/"right" action with a small sound that slightly differ if the pick hit a notch or not, and you give a hint to the player.
Add a binary test of the lock value somewhere in the screen, and you'll have a progress indicator.

And finally, if you add some transforms, or use image manipulators, you can have a more dynamic pick.

The bonus part being that, like the lock is randomized, every player will face a different pattern. But think wisely of your final value to not make it too hard (here the lock will goes from 1 to 8 notches). In the same time, playing with the random range (always from the start) will limit the possible number of bits, and so the difficulty of the lock. Just pass a secondary value to the screen, to tell it how many notches there is.
 

79flavors

Well-Known Member
Respected User
Jun 14, 2018
1,611
2,258
Hmmm. I guess I was thinking something more visually interactive for a lockpick. A picture of an actual keyhole and a pseudo xray slice showing the internals of the lock - with the player using the cursor to move around a small metal bar to set each of the barrel positions. It was that highly graphical nature of it that I was envisioning as hard. I suppose I tend to think of most mini-games that way - since the first mini-game that comes to mind is the game of pong someone put together within the RenPy tutorial project.

I suppose I'm overthinking mini-games.