summaryrefslogtreecommitdiff
path: root/game/renpy.rpy
blob: d9e5e28bfdb86dfd800efeac911ddc4cf8ebcfcb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#################################################################################
#     This file is part of Mana Launcher.
#     Copyright (C) 2021  Jesusalva <jesusalva@tmw2.org>
#
#     Distributed under the MIT license.
#################################################################################
screen loading():
    zorder 100

    fixed:
        frame:
            xfill True
            yfill True
            background Frame("images/default.png", 0, 0)
        bar:
            value progress
            range 100
            xalign 0.5
            yalign 0.45
            xmaximum 0.75
        label "[statusmsg]":
            xalign 0.5
            yalign 0.55

screen serverdata(server):
    zorder 100

    fixed:
        frame:
            xfill True
            yfill True
            background Frame("images/default.png", 0, 0)
        label "{b}%s{/b}" % persistent.serverlist[server]["Name"]:
            xalign 0.5
            yalign 0.2
        # FIXME
        if config.developer:
            fixed:
                xalign 0.5
                yalign 0.5
                viewport:
                    child_size (512, 288) # FIXME
                    draggable True
                    mousewheel True
                    scrollbars "vertical"
                    pagekeys True
                    vbox:
                        textbutton _("Open wiki") action Function(load_wiki, server)
                        label "{color=#fff}[statusmsg]{/color}"
        else:
            label "{color=#fff}[statusmsg]{/color}":
                xalign 0.5
                yalign 0.5
        hbox:
            xalign 0.5
            yalign 0.8
            text _("{a=%s}Website{/a}" % persistent.serverlist[server]["Link"])
            null width 20
            text "|"
            null width 20
            text _("{a=%s}Support{/a}" % persistent.serverlist[server]["Help"])
            null width 20
            text _("{a=%s}News{/a}" % persistent.serverlist[server]["News"])
            null width 20
            text _("{a=%s}Terms of Use{/a}" % persistent.serverlist[server]["Policy"])


# The game starts here.
label start:
    ## Check for steam moduli
    python:
        if persistent.steam:
            stdout("Steam Module verification...")
            try:
                steam.init()
            except:
                import _renpysteam as steam

    ## Begin formally
    $ statusmsg=_("Validating SSL Certificates...")
    scene black

    show screen loading
    call before_main_menu
    $ stdout("Before menu OK")

    # Build the Vault PEM, blocking and fatal
    $ build_vault()
    $ stdout("Vault PEM OK")

    # Run updater
    $ renpy.invoke_in_thread(CONFIGURE_LAUNCHER)
    $ stdout("Thread start OK")

    # Estabilish the connection to server
    python:
        # 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


    $ stdout("Thread finish OK")

    # Kill the program
    if not responsive:
        jump die

    # We're running, keep online lists up-to-date in background
    $ running = True
    $ renpy.invoke_in_thread(ONLINE_LISTING)

    # Do we have a Vault ID?
    if not vaultId:
        call register

    # If we still don't have a Vault ID - something went wrong D:
    if not vaultId:
        $ status_update(_("{color=#F00}Failure! Vault ID could not be set.{/color}"))
        jump die

    $ stdout("Connection established! User ID %d" % vaultId)

    # Open game
    hide screen loading
    scene black
    if persistent.vaultId is None or persistent.vaultId != vaultId:
        $ persistent.vaultId = vaultId
        call intro(newuser=True)
        scene black with None
    show TMW2 at truecenter
    with Dissolve(0.5)
    pause 1.0
    hide TMW2 with dissolve
    #centered "Error"
    #if config.developer:
    #    "User ID: [vaultId]"

    ## Automatic world selection from commandline
    if (AUTOWORLD):
        $ _return = AUTOWORLD
        jump load_world

label start_loop:
    $ 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:
            # Do we get a cutscene?
            if SCR_CUTIN:
                try:
                    renpy.call_in_new_context(SCR_CUTIN)
                except:
                    traceback.print_exc()
                    pass
                SCR_CUTIN=""
            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

    ## Requested a Mirror Lake
    if MLP_DEST is not None:
        $ stdout("MLP Destination is set")
        python:
            try:
                desti=dl_search_idx(persistent.serverlist, "UUID", MLP_DEST)
                desti=int(desti)
            except:
                traceback.print_exc()
                desti=-1
            MLP_DEST=None

        ## We may need to do a cutscene, first
        if not persistent.firstlake:
            call ch1lake
            $ persistent.firstlake = True
        elif mySoul is not None:
            ## Level-based cutscenes, visit the Void first to see (missable)
            if mySoul["level"] >= 1 and not persistent.secondlake:
                call ch2lake
                $ persistent.secondlake = True

        ## Internal Sanitization
        $ stdout("WID Target: %d" % (desti))
        if desti >= 0:
            $ _return = desti
            jump load_world

    # Automatically loop back
    jump start_loop