# 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