summaryrefslogblamecommitdiff
path: root/game/script.rpy
blob: 5752f44e22bfb5188db21d4a233da64869968aa1 (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:
    # Begin the initial displays
    # TODO: a fairy :(
    scene black
    show spinner at truecenter

    # Initial configuration
    call prestart

    #"We shall now begin testing a websocket"
    python:
        try:
            # server, sock, address
            #         on_open=None, on_message=None, on_error=None,
            #         on_close=None, on_ping=None, on_pong=None,
            #         on_data=None):
            renpy.invoke_in_thread(supervisor, persistent.ssl_enabled)
        except:
                # Enter in infinite loop, this will never resolve
                stdout("Unrecoverable error, the program is dead.")
                tr_load=False

        while not tr_load:
            sdelay()

    $ stdout("Connection established!")

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

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

    if config.developer:
        menu:
            "tr_load is [tr_load]\ntr_busy is [tr_busy]"
            "Send ping":
                $ send_packet('PING')
            "Send malformatted packet":
                $ send_packet('TOKEN;PACKET;')
            "Send invalid packet":
                $ send_packet('INVALID PACKET')

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

    # Otherwise just login
    jump login

############################################################################
# Login procedures
label login:
    $message=login()
    # TODO=load message
    $ stdout(message)
    python:
        try:
            message=int(message)
            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

    # Load game to memory
    python:
        tr_load=False
        renpy.invoke_in_thread(GAME_LOADER)
        while not tr_load:
            sdelay()

    $ 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 (FIXME)
        if (Player["ap"] < Player["max_ap"]):
            ApTimer=Timer(360.0, ap_restore)
            ApTimer.start()

    # Remove some temporary variables
    $ del password

    # Wait until everything is loaded
    python:
        while not tr_memcheck:
            sdelay()

    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

    jump loop

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 ApTimer
        try:
            ApTimer.cancel()
            del ApTimer
        except:
            pass

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

        # FIXME
        # If needed, close the socket
        try:
            ws.close(reason="Quit")
        except:
            pass

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

        # Terminate IRC connection
        try:
            irc_kill()
        except NameError:
            pass

    # Data cleaned up
    # Destroy the socket
    $ persistent.ws = None
    $ print("Sockets closed and data flushed!")
    return