summaryrefslogblamecommitdiff
path: root/qeditor.rpy
blob: c0295f61fc9c13029e8fa0da6a3835cda05312d9 (plain) (tree)



































































































































                                                                                                                                                                           
                                                                                          










                                                       
                                                                                          




























































                                                                                                                                                                          
















                                                
                                                   

                                                                 
                                                        








































































































































                                                                                                  
                                        







































                                                                                             




                            

                
########################################################################################
#     This file is part of Spheres.
#     Copyright (C) 2019  Jesusalva

#     This library is free software; you can redistribute it and/or
#     modify it under the terms of the GNU Lesser General Public
#     License as published by the Free Software Foundation; either
#     version 2.1 of the License, or (at your option) any later version.

#     This library is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#     Lesser General Public License for more details.

#     You should have received a copy of the GNU Lesser General Public
#     License along with this library; if not, write to the Free Software
#     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
########################################################################################
# Editor labels for developers
screen quest_editor():
    modal True
    frame:
        background Frame("gui/frame.png", 0, 0)
        xalign 0.5
        yalign 0.5
        ymargin 15
        ypadding 10
        xmargin 10

        hbox:
            spacing 30
            xmaximum 0.85
            ymaximum 0.85

            # Navigation
            viewport:
                #child_size (350, 1000)
                mousewheel True
                draggable True
                pagekeys True
                xfill False
                xmaximum 350
                scrollbars "vertical"

                vbox:
                    spacing 2
                    label _("Quest list")
                    $i=0
                    for entry in allquests:
                        textbutton "{size=18}"+_("%02d (D %d) (C %d)" % (entry["quest_id"], entry["difficulty"], entry["cost"]))+"{/size}" action SetVariable("current", i)
                        $i+=1
                    $del i

            # News screen
            viewport:
                #child_size (0.4, 0.8)
                mousewheel True
                #draggable True
                #arrowkeys True
                xfill False
                scrollbars "vertical"

                vbox:
                    xalign 0.5
                    spacing 20

                    $ qedit=allquests[current]
                    $ qreq=qedit["requeriment"]

                    label _("Quest %d" % (qedit["quest_id"]))
                    hbox:
                        spacing 10
                        textbutton _("-") action Function(qeditor, "quest_id", -1)
                        label ("%d" % qedit["quest_id"])
                        textbutton _("+") action Function(qeditor, "quest_id", 1)
                    null height 25


                    ###########################################
                    label _("Requeriment")
                    hbox:
                        spacing 10
                        textbutton _("-") action Function(qeditor, "requeriment", -1)
                        label ("%d" % qedit["requeriment"])
                        textbutton _("+") action Function(qeditor, "requeriment", 1)
                    null height 15


                    ###########################################
                    label _("Difficulty")
                    hbox:
                        spacing 10
                        textbutton _("-10") action Function(qeditor, "difficulty", -10)
                        textbutton _("-5") action Function(qeditor, "difficulty", -5)
                        textbutton _("-1") action Function(qeditor, "difficulty", -1)
                        label _("%d" % qedit["difficulty"])
                        textbutton _("+1") action Function(qeditor, "difficulty", 1)
                        textbutton _("+5") action Function(qeditor, "difficulty", 5)
                        textbutton _("+10") action Function(qeditor, "difficulty", 10)
                    null height 15


                    ###########################################
                    label _("Cost")
                    hbox:
                        spacing 10
                        textbutton _("-") action Function(qeditor, "cost", -1)
                        label _("%d" % qedit["cost"])
                        textbutton _("+") action Function(qeditor, "cost", 1)
                    null height 15


                    ###########################################
                    label _("Flags")
                    hbox:
                        spacing 10
                        textbutton _("-") action Function(qeditor, "flags", -1)
                        label _("%d" % qedit["flags"])
                        textbutton _("+") action Function(qeditor, "flags", 1)
                    text "None: 0\nClear Gems: 1\nTutorial Gems: 2\nSpecial: 4\nFirst Loot: 8\nDouble XP: 16\nDouble GP: 32" size 12
                    null height 15


                    ###########################################
                    label _("Loot")
                    vbox:
                        spacing 0
                        $i=0
                        for lt, ch in qedit["loot"]:
                            hbox:
                                spacing 1
                                $ input=Input(
                                    value=QEditorInputValue(lt, "loot", i, "str", key3=0),
                                    copypaste=True,
                                    allow="0123456789",
                                    length=9)
                                button:
                                    #key_events True
                                    action input.enable
                                    add input

                                label ": "

                                $ input=Input(
                                    value=QEditorInputValue(ch, "loot", i, "int", key3=1),
                                    copypaste=True,
                                    allow="0123456789",
                                    length=5)
                                button:
                                    #key_events True
                                    action input.enable
                                    add input

                                null width 40
                                textbutton _("X Delete") action None
                            $i+=1
                        textbutton _("Add Loot") action Function(qeditor_addloot)
                    null height 15


                    ###########################################
                    label _("Waves")
                    vbox:
                        spacing 0
                        $ wc=0
                        null height 10
                        for wave in qedit["waves"]:
                            $wc+=1
                            label _("{size=22}Wave %d{/size}" % wc)
                            $ mc=0
                            for mob in wave:
                                $mc+=1
                                label _("{size=20}%s{/size}" % mob["name"])
                                textbutton "{size=20}%d{/size}" % mob["sprite"] action None
                                hbox:
                                    spacing 7
                                    textbutton "{size=20}Ele: %d{/size}" % mob["attribute"] action None
                                    textbutton "{size=20}Boss: %s{/size}" % str(mob["boss"]) action Function(qeditor_input, "waves", wc-1, "bool", key3=mc-1, key4="boss")
                                    null width 20
                                    textbutton _("X Delete") action  Function(qeditor_delete, "waves", wc-1, mc-1)
                            null height 20
                            textbutton "{size=22}"+_("Add Monster")+"{/size}" action Function(qeditor_addmonster, wc)
                            textbutton "{size=22}"+_("Delete Wave")+"{/size}" action Function(qeditor_delete, "waves", wc-1)
                            null height 20
                        null height 20
                        text "Fire: 1    Water: 2\nNature: 3    Light: 4\nDark: 5" size 12
                        textbutton _("Add Wave") action Function(qeditor_addwave)


                    # TODO: Loot, waves
                    ###########################################
                    null height 40
                    hbox:
                        spacing 25

                        textbutton _("Save") action Function(qeditor_save)

                        textbutton _("Close") action Return()
                        textbutton _("New Quest") action Function(qeditor_new)
                        textbutton _("New S.") action Function(qeditor_new, 1)

    ## Right-click and escape refresh screen
    key "game_menu" action Function(RestartInteraction)#Return()
    key "K_RETURN" action Function(RestartInteraction)#Return()

init python:
    def RestartInteraction():
        renpy.restart_interaction()
        return


    def qeditor(key, operation, override=False):
        global qedit
        qedit=allquests[current]
        print str(qedit["quest_id"])
        if override:
            qedit[key]=operation
        else:
            qedit[key]+=operation
        return

    def qeditor_save():
        global allquests
        f=open(get_path("quests.editor.json"), "w")
        json.dump(allquests, f, indent=4, separators=(',', ': '))
        f.close()
        renpy.notify("File saved as quests.editor.json")
        return

    def qeditor_new(special=False):
        global allquests
        if not special:
            qeid=len(allquests)
            qefl=1
            qec=1
        else:
            qeid=90000
            qefl=4
            qec=20

        allquests.append({
        "quest_id": qeid,
        "difficulty": 0,
        "requeriment": 0,
        "cost": qec,
        "flags": qefl,
        "loot": [
                    ["1010", 1000],
                    ["1020", 100],
                    ["1030", 10]
                ],
        "waves": []})
        renpy.notify("New quest added: %d" % qeid)
        return

    def qeditor_addloot():
        global qedit
        qedit=allquests[current]
        qedit["loot"].append(["1000", 0])
        renpy.notify("Added new loot field id 1000 (an invalid ID)")
        return

    def qeditor_addmonster(wave):
        global qedit
        qedit=allquests[current]
        pointer=qedit["waves"][wave-1]
        if len(pointer) < 3:
            pointer.append({
                "name": "New Monster",
                "sprite": 950000,
                "attribute": 1,
                "boss": False
            })
        else:
            renpy.notify("Max monsters per wave reached!")
        return

    def qeditor_addwave():
        global qedit
        qedit=allquests[current]
        qedit["waves"].append([])
        renpy.notify("Blank wave created\nThis is buggy, remember to add monsters")
        return


    def qeditor_delete(key1, key2=None, key3=None, key4=None):
        global qedit
        qedit=allquests[current]
        if key2 is None:
            del qedit[key1]
            #del allquests[current][key1]
        elif key3 is None:
            del qedit[key1][key2]
            #del allquests[current][key1][key2]
        elif key4 is None:
            del qedit[key1][key2][key3]
            #del allquests[current][key1][key2][key3]
        else:
            del qedit[key1][key2][key3][key4]
            #del allquests[current][key1][key2][key3][key4]
        return

    def qeditor_input(key1, key2=None, tp="int", temp="", key3=None, key4=None):
        #temp=renpy.input("Please insert new value for this variable.\nCurrent value: [variable]")
        global qedit
        qedit=allquests[current]
        variable=""

        # Key looping
        if key2 is None:
            target=qedit[key1]
        elif key3 is None:
            target=qedit[key1][key2]
        elif key4 is None:
            target=qedit[key1][key2][key3]
        else:
            target=qedit[key1][key2][key3][key4]

        # Convert input if needed
        # tp int  convert to int
        # tp key  Replace the key
        # tp bool  Toogles the value
        if tp == "int":
            try:
                variable=int(temp)
            except:
                renpy.notify("Invalid numeric input")
                variable=0 # Sorry, but gets bad otherwise
        elif tp == "key":
            try:
                qedit[key1][temp]=copy.copy(target)
                renpy.notify("Key replaced")
                del qedit[key1][key2] # Not sure "del target" would work
                return
            except:
                renpy.notify("ERROR, doing nothing")
                variable=target
        elif tp == "bool":
            try:
                variable=(not target)
                print "New boolean: %s" % str(variable)
            except:
                print "Illegal boolean"
                renpy.notify("Illegal boolean")
                variable=target
        else:
            try:
                variable=str(temp)
            except:
                renpy.notify("Invalid string input")

        # Save input
        # Key looping
        if key2 is None:
            target=qedit[key1]=variable
        elif key3 is None:
            target=qedit[key1][key2]=variable
        elif key4 is None:
            target=qedit[key1][key2][key3]=variable
        else:
            target=qedit[key1][key2][key3][key4]=variable

        return

    class QEditorInputValue(InputValue):
        def __init__(self, variable, key1, key2, inpu="int", key3=None, key4=None):
            try:
                self.variable = variable
            except:
                self.variable = ""
            self.inpu = inpu

            self.default=True
            self.editable=True

            self.key1=key1
            self.key2=key2
            self.key3=key3
            self.key4=key4

        def get_text(self):
            try:
                return str(self.variable)
            except:
                return ""
            #return globals()[self.variable]

        def set_text(self, s):
            #globals()[self.variable] = s
            qeditor_input(self.key1, self.key2, self.inpu, s, key3=self.key3, key4=self.key4)

        def enter(self):
            renpy.restart_interaction()
            #renpy.run(self.Disable())
            #raise renpy.IgnoreEvent()

label quest_editors:
    $ qedit=allquests[0]
    $ current=0
    $print("")
    $print(".:: THE BUILT-IN QUEST EDITOR ::.")
    $print("Use ESC to redraw screen, saving input")
    $print("")
    call screen quest_editor
    $print("Quest Editor closed")
    menu:
        "Save Changes":
            $ qeditor_save()
        "Discard Changes":
            pass
    jump restore