# 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
# If needed, close the socket
try:
ws.close()
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