summaryrefslogtreecommitdiff
path: root/game
diff options
context:
space:
mode:
Diffstat (limited to 'game')
-rw-r--r--game/client.rpy41
-rw-r--r--game/core.rpy17
-rw-r--r--game/renpy.rpy106
3 files changed, 108 insertions, 56 deletions
diff --git a/game/client.rpy b/game/client.rpy
index e01d0b3..1d3d680 100644
--- a/game/client.rpy
+++ b/game/client.rpy
@@ -22,7 +22,7 @@ init 2 python:
return f
def launch_game(idx):
- global progress, responsive, statusmsg
+ global progress, responsive, statusmsg, MLP_DEST
########################################################################
## Setup
RPCUpdate(persistent.serverlist[idx]["Name"], persistent.serverlist[idx]["Back"])
@@ -84,11 +84,11 @@ init 2 python:
renpy.iconify()
## Sanitize input to avoid arbitrary code execution
- CMD=CMD.replace(";", "").replace("&", "").replace(">", "").replace("<", "").replace("|", "")
- OPT=OPT.replace(";", "").replace("&", "").replace(">", "").replace("<", "").replace("|", "")
- PWD=PWD.replace(";", "").replace("&", "").replace(">", "").replace("<", "").replace("|", "")
+ CMD=CMD.replace(";", "").replace("&", "").replace(">", "").replace("<", "").replace("|", "").replace("$", "")
+ OPT=OPT.replace(";", "").replace("&", "").replace(">", "").replace("<", "").replace("|", "").replace("$", "")
+ PWD=PWD.replace(";", "").replace("&", "").replace(">", "").replace("<", "").replace("|", "").replace("$", "")
- ## Launch your prefered game client, wait for it to finish
+ ## Launch your preferred game client, wait for it to finish
if renpy.windows:
app=execute("\"%s\" %s%s" % (CMD, OPT, PWD), shell=True)
else:
@@ -96,11 +96,38 @@ init 2 python:
## Determine error messages
if app == 7:
- stdout("[CLIENT] Mirror Lake trigger.")
+ stdout("[CLIENT] Mirror Lake triggered.")
## Give "plenty" time to ensure data will be available
statusmsg=_("Synchronizing data...")
time.sleep(0.5)
-
+ try:
+ r=vault.post(VAULT_HOST+"/getlake", json=auth, timeout=15.0)
+ ## We got the access credentials
+ if r.status_code == 200:
+ goto=r.json()["world"]
+ stdout("MLP Target: %s" % str(goto))
+ if goto == "" or goto.lower() == "vault":
+ stdout("Mirror Lake False Positive")
+ else:
+ MLP_DEST=goto
+ progress=100
+ return
+ ## We were refused by Vault
+ elif r.status_code == 403:
+ stdout("Warning: Connection was refused (Vault logout?)")
+ statusmsg=_("You're not logged in.")
+ time.sleep(1.0)
+ responsive = False
+ return
+ else:
+ stdout("[CLIENT] Sync error code %d." % r.status_code)
+ statusmsg=_("Synchronization error.") # 500 = No Lake
+ time.sleep(1.0)
+ except:
+ traceback.print_exc()
+ stdout("[CLIENT] Sync failed.")
+ statusmsg=_("Synchronization error.")
+ time.sleep(1.0)
elif app:
traceback.print_exc()
stdout("[CLIENT] An error happened: %d" % app)
diff --git a/game/core.rpy b/game/core.rpy
index af165ea..7361a6f 100644
--- a/game/core.rpy
+++ b/game/core.rpy
@@ -104,17 +104,27 @@ init -3 python:
list.__setitem__(self, index, value)
# Search for array[?][key]==search in an array of dicts
- # Returns the dictionary, or returns ERR_INVALID
+ # Returns the dictionary, or returns None
def dl_search(array, key, search):
try:
r=(item for item in array if item[key] == search).next()
except:
- r=ERR_INVALID
+ r=None
if r is None:
- r=ERR_INVALID
stdout("dlsearch: r is None")
return r
+ # Search for array[?][key]==search in an array of dicts
+ # Returns the index, or returns -1
+ def dl_search_idx(array, key, search):
+ try:
+ r=next((i for i, item in enumerate(array) if item[key] == search), None)
+ except:
+ traceback.print_exc()
+ r=-1
+ return ifte(r is None, -1, r)
+
+
#############################################################################
## Some other stuff
if renpy.linux:
@@ -204,6 +214,7 @@ default responsive = True
default has_steam = False
default SCR_PROMPT = None
default SCR_RESULT = None
+default MLP_DEST = None
## Command Line Interface
init -4 python:
diff --git a/game/renpy.rpy b/game/renpy.rpy
index 2e413bf..e26d20a 100644
--- a/game/renpy.rpy
+++ b/game/renpy.rpy
@@ -122,52 +122,66 @@ label start:
#if config.developer:
# "User ID: [vaultId]"
label start_loop:
- while True:
- $ renpy.block_rollback()
- call screen mirrorlake
- ## Quit request
- if _return is None or _return == "QUIT":
- $ stdout("Good bye!")
- $ renpy.quit()
- return
- ## Asked for The Void
- if _return < 0:
- $ stdout("V0id")
- call thevoid
- jump start_loop
- ## Asked for any subworld
+ $ renpy.block_rollback()
+ call screen mirrorlake
+ ## Quit request
+ if _return is None or _return == "QUIT":
+ $ stdout("Good bye!")
+ $ renpy.quit()
+ return
+ ## Asked for The Void
+ if _return < 0:
+ $ stdout("V0id")
+ call thevoid
+ jump start_loop
+label load_world:
+ ## Asked for any subworld
+ scene black
+ # FIXME: Improve this waiting screen
+ # Possibly retrieve messages from the thread
+ $ statusmsg=_("Now loading...")
+ show screen serverdata(_return)
+ with None
+ pause 0.01
+ python:
+ renpy.invoke_in_thread(launch_game, _return)
+ progress = 0
+ # Block the main thread until the socket connection is done
+ while progress < 100:
+ if responsive:
+ sdelay()
+ else:
+ break
+
+ # Maybe we are waiting some prompt
+ if SCR_PROMPT is not None:
+ SCR_RESULT = renpy.call_screen("confirm", SCR_PROMPT,
+ Return(True), Return(False))
+ SCR_PROMPT = None
+
+ hide screen serverdata
+ # Kill the program instead of looping back
+ if not responsive:
scene black
- # FIXME: Improve this waiting screen
- # Possibly retrieve messages from the thread
- $ statusmsg=_("Now loading...")
- show screen serverdata(_return)
- with None
- pause 0.01
+ centered "{color=#FFF}{b}An error happened.{/b}\n\nPlease login again. If this issue persists, relaunch the app or {a=https://discord.gg/BQNTe68}contact us{/a}{/color}"
+ $ stdout("Program died - unsucessful game launch")
+ return
+
+ ## Requested a Mirror Lake
+ if MLP_DEST is not None:
+ $ stdout("MLP Destination is set")
python:
- renpy.invoke_in_thread(launch_game, _return)
- progress = 0
- # Block the main thread until the socket connection is done
- while progress < 100:
- if responsive:
- sdelay()
- else:
- break
-
- # Maybe we are waiting some prompt
- if SCR_PROMPT is not None:
- SCR_RESULT = renpy.call_screen("confirm", SCR_PROMPT,
- Return(True), Return(False))
- SCR_PROMPT = None
-
- hide screen serverdata
- # Kill the program instead of looping back
- if not responsive:
- scene black
- centered "{color=#FFF}{b}An error happened.{/b}\n\nPlease login again. If this issue persists, relaunch the app or {a=https://discord.gg/BQNTe68}contact us{/a}{/color}"
- $ stdout("Program died - unsucessful game launch")
- return
-
- # Automatically loop back
- # Will never reach this line
- return
+ try:
+ _return=dl_search_idx(persistent.serverlist, "UUID", MLP_DEST)
+ except:
+ traceback.print_exc()
+ _return=-1
+ MLP_DEST=None
+ ## Internal Sanitization
+ $ stdout("WID Target: %d" % (_return))
+ if _return > 0:
+ jump load_world
+
+ # Automatically loop back
+ jump start_loop