summaryrefslogblamecommitdiff
path: root/ueditor.rpy
blob: 4e56e3fb9fb63f37b0b75193126d311a4c04e2e6 (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 units_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 _("Unit list")
                    $i=0
                    for entry in allunitsbase:
                        textbutton "{size=18}"+_("%d - %s" % (entry["unit_id"], entry["name"]))+"{/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

                    $ uedit=allunitsbase[current]

                    hbox:
                        label _("%s %s" % (star_write(uedit["rare"]), uedit["name"]))
                        null width 30
                        textbutton "%s" % ifte(uedit["sex"], "(F)", "(M)"):
                            action Function(ueditor, "sex", ifte(uedit["sex"],
                                            0, 1), True)
                    hbox:
                        spacing 10
                        label _("ID: ")
                        $ input=Input(
                            value=UEditorInputValue(uedit, "unit_id", None, "int", dp=True),
                            copypaste=True,
                            allow="0123456789",
                            length=8)
                        button:
                            #key_events True
                            action input.enable
                            add input
                        null width 180
                        label _("(%d)" % uedit["unit_base_id"]):
                            text_size 24
                        null width 24
                        label _("MaxLv. %d" % uedit["max_level"]):
                            text_size 24
                    hbox:
                        spacing 10
                        label _("Name: ")
                        $ input=Input(
                            value=UEditorInputValue(uedit, "name", None, "str", dp=True),
                            copypaste=True,
                            allow="qwertyuiopasdfghjklçzxcvbnm QWERTYUIOPASDFGHJKLÇZXCVBNM1234567890-+=!(),.:;",
                            length=32)
                        button:
                            #key_events True
                            action input.enable
                            add input
                    hbox:
                        textbutton _("-") action Function(ueditor, "rare", -1)
                        label ("Rarity: %s" % star_write(uedit["rare"])):
                            text_size 24
                        textbutton _("+") action Function(ueditor, "rare", 1)

                    null height 25
                    label _("Flavor text:")
                    #label _(uedit["flavor"])
                    $ input=Input(
                        value=UEditorInputValue(uedit, "flavor", None, "str", dp=True),
                        copypaste=True,
                            #allow="qwertyuiopasdfghjklçzxcvbnm QWERTYUIOPASDFGHJKLÇZXCVBNM1234567890-+=!()",
                        length=512)
                    button:
                        #key_events True
                        action input.enable
                        add input
                    null height 25

                    hbox:
                        spacing 24
                        label _("HP %d" % uedit["hp"])
                        label _("ATK %d" % uedit["strength"])
                    null height 25

                    hbox:
                        textbutton _("-") action Function(ueditor, "attribute", -1)
                        label ("Element: %s" % ParseEle(uedit["attribute"]))
                        textbutton _("+") action Function(ueditor, "attribute", 1)
                    hbox:
                        textbutton _("-") action Function(ueditor, "job", -1)
                        label ("Job: %s" % ParseJob(uedit["job"]))
                        textbutton _("+") action Function(ueditor, "job", 1)
                    null height 25
                    hbox:
                        textbutton _("-") action Function(ueditor, "flags", -1)
                        label _("Flags %d" % uedit["flags"])
                        textbutton _("+") action Function(ueditor, "flags", 1)
                    text "None: 0\nCannot levelup: 1\nCannot party: 2\nEXP+: 4\nEvoMat: 8\nDouble GP: 16\nUnsellable: 32\nSuper EvoMat: 64" size 12
                    null height 25

                    # TODO: Open skills.json and parse the IDs
                    label _(".:: Skills ::.")
                    hbox:
                        label _("Active ID: "):
                            text_size 20
                        $ input=Input(
                            value=UEditorInputValue(uedit, "skill_id", None, "int", dp=True),
                            copypaste=False,
                            allow="0123456789",
                            length=6,
                            size=20)
                        button:
                            #key_events True
                            action input.enable
                            add input

                    hbox:
                        label _("Passive ID: "):
                            text_size 20
                        $ input=Input(
                            value=UEditorInputValue(uedit, "ability_id", None, "int", dp=True),
                            copypaste=False,
                            allow="0123456789",
                            length=6,
                            size=20)
                        button:
                            #key_events True
                            action input.enable
                            add input

                    # TODO: Skills, portraits
                    ###########################################
                    null height 40
                    hbox:
                        spacing 22

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

                        textbutton _("Close") action Return()
                        null width 10
                        textbutton _("Recalc") action Function(ueditor_recalc)
                        null width 10
                        textbutton _("New Sub") action Function(ueditor_new, True)
                        textbutton _("New Unit") action Function(ueditor_new)
                        textbutton _("Auto") action Jump("ueditor_supernew")

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

init python:
    def ParseJob(job):
        if job == 1:
            return "Swordsman"
        elif job == 2:
            return "Unused"
        elif job == 3:
            return "Mage"
        elif job == 4:
            return "Archer"
        elif job == 5:
            return "Gunner"
        elif job == 6:
            return "Special"
        else:
            return "ERROR (%d)" % job

    def RestartInteraction():
        renpy.restart_interaction()
        return


    def ueditor(key, operation, override=False):
        global uedit
        uedit=allunitsbase[current]
        print str(uedit["unit_id"])
        if override:
            uedit[key]=operation
        else:
            uedit[key]+=operation
        return

    def ueditor_save():
        global allunitsbase
        allunitsbase.sort(key=lambda x: x["unit_id"])
        f=open(get_path("units.editor.json"), "w")
        json.dump(allunitsbase, f, indent=4, separators=(',', ': '))
        f.close()
        renpy.notify("File saved as units.editor.json")
        return

    def ueditor_new(sub=False):
        global allunitsbase
        if not sub:
            ueid=(100000+len(allunitsbase))*100
            rar=1
            nam="New unit"
            flav="A standard unit in the game."
            attr=1
            sex=0
            job=1
        else:
            ueid=allunitsbase[current]["unit_id"]//100*100+1 # Truncate
            rar=allunitsbase[current]["rare"]+1
            nam=allunitsbase[current]["name"]+" +"+str(rar)
            attr=allunitsbase[current]["attribute"]
            sex=allunitsbase[current]["sex"]
            job=allunitsbase[current]["job"]
            flav=allunitsbase[current]["flavor"]

        allunitsbase.append({"skill_id": 0,
  "strength": 500,
  "rare": rar,
  "name": nam,
  "ability_id": 0,
  "attribute": attr,
  "hp": 500,
  "unit_id": ueid,
  "sex": sex,
  "max_level": 10+(rar*10),
  "job": job,
  "cost": rar**2,
  "flags": 0,
  "unit_base_id": ueid//100,
  "flavor": flav})
        renpy.notify("New unit added: %d" % ueid)
        return

    def ueditor_recalc(notf=True, shp=0, ssr=0):
        global uedit
        uedit=allunitsbase[current]
        job=uedit["job"]
        rar=uedit["rare"]
        STR=0
        HP=0
        # Sum must be 800
        if job == 1:
            STR=300;HP=500; # Swordsman (DEF+)
        elif job == 2:
            STR=400;HP=400; # Assassin (TODO)
        elif job == 3:
            STR=500;HP=300; # Mage (ATK+)
        elif job == 4:
            STR=400;HP=400; # Archer (balanced)
        elif job == 5:
            STR=600;HP=200; # Gunner (unused)
        elif job == 6:
            STR = 0;HP = 0; # Special
        # Apply the seed modifiers
        STR += ssr
        HP += shp
        # Apply rarity modified
        STR*=(rar+1)/2.0
        HP*=(rar+1)/2.0
        STR=max(int(STR), 1)
        HP=max(int(HP), 1)
        # Save data
        if notf:
            renpy.notify("%s\nHP %d->%d \n ATK %d->%d" % (uedit["name"],
                         uedit["hp"], HP,
                         uedit["strength"], STR))
        uedit["strength"]=copy.copy(STR)
        uedit["hp"]=copy.copy(HP)
        allunitsbase[current]["strength"]=copy.copy(STR)
        allunitsbase[current]["hp"]=copy.copy(HP)
        # Correct unit family and max level if needed
        allunitsbase[current]["unit_base_id"]=allunitsbase[current]["unit_id"]//100
        allunitsbase[current]["max_level"]=10+(rar*10)
        return


    def ueditor_delete(key1, key2=None, key3=None, key4=None):
        global uedit
        uedit=allunitsbase[current]
        if key2 is None:
            del uedit[key1]
            #del allunitsbase[current][key1]
        elif key3 is None:
            del uedit[key1][key2]
            #del allunitsbase[current][key1][key2]
        elif key4 is None:
            del uedit[key1][key2][key3]
            #del allunitsbase[current][key1][key2][key3]
        else:
            del uedit[key1][key2][key3][key4]
            #del allunitsbase[current][key1][key2][key3][key4]
        return

    def ueditor_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 uedit
        uedit=allunitsbase[current]
        variable=""

        # Key looping
        if key2 is None:
            target=uedit[key1]
        elif key3 is None:
            target=uedit[key1][key2]
        elif key4 is None:
            target=uedit[key1][key2][key3]
        else:
            target=uedit[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:
                uedit[key1][temp]=copy.copy(target)
                renpy.notify("Key replaced")
                del uedit[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=uedit[key1]=variable
        elif key3 is None:
            target=uedit[key1][key2]=variable
        elif key4 is None:
            target=uedit[key1][key2][key3]=variable
        else:
            target=uedit[key1][key2][key3][key4]=variable

        return


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

            self.default=True
            self.editable=True

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

        def get_text(self):
            try:
                if not self.short_display:
                    return str(self.variable)
                else:
                    return str(self.variable[self.key1])
            except:
                traceback.print_exc()
                return ""
            #return globals()[self.variable]

        def set_text(self, s):
            #globals()[self.variable] = s
            ueditor_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 units_editors:
    $ uedit=allunitsbase[0]
    $ current=0
    $print("")
    $print(".:: THE BUILT-IN UNIT EDITOR ::.")
    $print("Use ESC to redraw screen, saving input")
    $print("")
    call screen units_editor
    $print("Unit Editor closed")
    # FIXME: A button to revert instead
    menu:
        "Do you want to save the buffer?"
        "Save Changes":
            $ ueditor_save()
        "Discard Changes":
            pass
    jump restore