summaryrefslogblamecommitdiff
path: root/game/script.rpy
blob: 7c98304b0c5730d6d0cbdbe94f328d3f96e7fc5f (plain) (tree)






































































































































































































































































































































                                                                                                                                                                                                                                                                                                                                        
# The script of the game goes in this file.
# Declare images
#image bg room = Frame("gfx/bg/port.png", 0, 0)
image dialog rebel = "gfx/dialog/rebel.png"

# Declare characters used by this game. The color argument colorizes the
# name of the character.

define e = Character("Player")

label splashscreen:
    centered "{b}{color=#f00}Disclaimer{/color}\n\nBy running this software, you affirm that you have the right to do so.\nNo license is provided for using this demo software.\n\n\
\
\
{color=#f00}This client may contain assets which {u}does not{/u} belongs to it.\n\
If you are the legal owner of an asset, or their legal representant,\n\
And find an asset of yours illegally used, please, fill a DMCA complaint\n\
by sending an email to {a=mailto:dmca@tmw2.org}dmca@tmw2.org{/a}.{/color}\n\
\n\
\n\
No warranties.{/b}{fast}"
    return


# Inform you are now ingame
label start:
    scene black
    # TODO: a fairy :(
    show spinner at truecenter
    pause 0.1

    # Run updater
    python:
        tr_load=False
        renpy.invoke_in_thread(GAME_UPDATER)
        while not tr_load:
            renpy.pause(0.1)

        tr_load=False
        renpy.invoke_in_thread(GAME_LOADER)
        while not tr_load:
            renpy.pause(0.1)

    # Open game
    scene bg town with Dissolve(0.3)
    pause 0.1
    #show dialog rebel
    $ password=persistent.password
    $ email=""

    # Check if we need to register
    if persistent.password is None:
        call screen welcome
        return

    # Otherwise just login
    jump login

# Registration procedures
# You don't have an account yet
label register_email:
    python:
        import re
        regex = '^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
        email = ""
        # Ask player for their email
        while email == "":
            email=renpy.call_screen("input_box", "Welcome to %s!\nPlease insert your email to register an account: \n{size=12}Your account password will be emailed to you. This is the only way to recover a lost account. You can use an {a=https://www.tempmailaddress.com/}Temporary email{/a} if you wish.{/size}" % (config.name))
            if not re.search(regex, email):
                email=""
                renpy.call_screen("msgbox",
                                  "The email you've entered is not valid.")

        # You've inserted a valid email
        raw=send_packet("register", """{"email": "%s"}""" % email)
        bt=json_decode(raw)

        try:
            password=bt["password"]
            valid=True
        except:
            # Either a SQL error, or a server error, or a connection error...
            # But either way, we can't proceed!
            renpy.call_screen("msgbox", "An error happened, maybe this email is already registered.\nPlease try again later.")
            valid=False

    # An error happened, return to login screen
    if not valid:
        jump start

    # Save data
    $ persistent.password=password
    jump login

# Registration procedures
# You already have an account and want to recover it
label register_password:
    python:
        password=""
        while password == "":
            password=renpy.call_screen("input_box",
                "Welcome to %s!\nPlease insert your password: " % (config.name))
            if not password.isalnum():
                renpy.call_screen("msgbox",
                                  "The password you've entered is not valid.")
                password=""
    jump login

# Login procedures
label login:
    $message=login()
    # TODO=load message
    $ stdout(message)
    python:
        try:
            message=int(message)
            import copy
            dlcode=copy.copy(message)
        except:
            print "AN ERROR HAPPENED AT LOGIN TIME"
            stdout("Invalid: "+str(message))
            message=-1

    if (message < 5000):
        if (message == ERR_LOGIN_DEFAULT):
            e "Error Code: [message]{fast}\n\nCould not estabilish connection to server."
            jump login
        else:
            e "Error Code: [message]{fast}\n\nCannot login to server. Terminating."
        return

    # Successful login? Update client data and begin routines
    $ persistent.password=password
    $ dlcode-=5000
    $ ping_routine()
    $ renpy.invoke_in_thread(irc_loop)

    # We're now logged in, load misc data (TODO: What if ERR_ is returned?)
    $ who = -1
    $ inv=get_inventory()
    python:
        for a in inv:
            Player["inv"].append(a)

        # Run AP Timer if needed
        if (Player["ap"] < Player["max_ap"]):
            ApTimer=Timer(360.0, ap_restore)
            ApTimer.start()

    # Remove some temporary variables
    $ del password

    if (email):
        $ del email
        jump prologue

    # Begin loop
    play music MUSIC_TOWN fadein 0.5

    # Show news (if they exist and you haven't logged in past day)
    if dlcode:
        if (len(allnews) >= 1):
            call screen show_news
        else:
            $stdout("This server doesn't have a MOTD")
        # TODO: Daily login rewards screen

label loop:
    # Delete predictions, if possible
    $ renpy.free_memory()

    # Maybe we're in combat? If we are, you cannot go to town
    if (Player["status"] >= ST_QUEST):
        window hide None
        $ renpy.call_screen("msgbox", "{b}Battle{/b}\n\nYou are in battle. You'll be brought back to combat.")
        #window show None
        $ Battle=reload_battle()
        # TODO: Handle errors
        if (Battle in [ERR_JSONDECODER]):
            e "Unknown Error: [ERR_JSONDECODER]"
            jump loop
        play music MUSIC_BATTLE.id() fadein 0.5
        jump combat


    $ hud_show()
    menu:
        "Development Options" if config.developer:
            $message="Development login OK"
            menu:
                "Send ping packet":
                    $message=send_packet("ping")
                    pass
                "Redeclare Image":
                    $m=renpy.call_screen("input_box", "Image Name: ")
                    $renpy.image("redeclared", m)
                    "We'll now display Redeclared"
                    show redeclared at truecenter with dissolve
                    pause
                    "So?"
                    hide redeclared with None
                    pass
                "Quest Editor":
                    jump quest_editors
                "List party members":
                    $message=get_party(1)
                "Update client":
                    jump updater_editors
                "Do nothing":
                    pass
        "World Map":
            jump quest_select
        "Manage Party":
            jump party_lobby_enter
        "Show inventory":
            jump inventory
        "Visit tavern":
            jump tavern
        "PUB":
            # TODO this needs its own label
            if persistent.nickname is not None:
                python:
                    while True:
                        _return=renpy.call_screen("pub")
                        if _return != "":
                            res=irc_send(persistent.nickname, _return)
                        else:
                            break
            else:
                "ERROR" "You are not authorized to complete this operation.\n\nERR_NICK"

        "Logout":
            #$message=send_packet("logout")
            jump quit
            #"Server replies:" "[message]"
            #return

    if (message == OFFLINEMSG):
        "Server replies:" "[message]\n\nYou are offline?"
        return

    if (message not in [ERR_OK, OKMSG, True]):
        "Server replies:" "[message]"

    jump loop
    # This ends the game.
    return


label restore:
    # Restore town view
    scene bg town
    #show dialog rebel
    play music MUSIC_TOWN fadein 0.5
    $ hud_show()
    jump loop


label prologue:
    $ hud_story()
    call SQ00001_prologue
    # Automatically begin quest
    $ Battle=loadquest(1)
    $ update_ap(-1)
    play music MUSIC_BATTLE.id() fadein 0.5
    $ renpy.free_memory()
    window hide
    jump combat

    #"Go to Capital, where you'll be formally appointed and receive a mission"
    #"Graduating: You (tactician / whatever) - Auto-Presentation"
    #"You decide it is better to travel to the Capital not alone."
    #"Giulio, graduate as knight."
    #"If you complete the mission at Capital, you'll get a job."
    # --> Mission is derailed if favor of more epic adventure
    #"Reaching Capital is a test on itself, to see if you have what it takes."
    #"You can use Crystals to recruit mercenaries and colleagues."
    # We may want to automatically begin fight 01, and keep important info
    # on story.json (in case you close the app)
    jump restore

label quit:
    $ stdout("Received quit signal!")
    python:
        # Delete pinger
        try:
            Pinger.stop()
            del Pinger
        except:
            pass

        # Delete ApTimer
        try:
            ApTimer.cancel()
            del ApTimer
        except:
            pass

        # If needed, logout
        try:
            token=Player["token"]
            send_packet("logout")
            del Player
        except:
            pass

        # Delete variables
        try:
            del allunitsbase
            del allunits
            del header
            del allnews
            del allstory
            del allworld
            del alltaverns
        except:
            pass

        # Terminate IRC connection
        irc_kill()

    # Data cleaned up
    # TODO: There might still be open sockets we need to close
    # But as we've sent LOGOUT protocol, these aren't important
    $ print("Sockets closed and data flushed!")
    return