summaryrefslogtreecommitdiff
path: root/game/editor.rpy
diff options
context:
space:
mode:
Diffstat (limited to 'game/editor.rpy')
-rw-r--r--game/editor.rpy415
1 files changed, 415 insertions, 0 deletions
diff --git a/game/editor.rpy b/game/editor.rpy
new file mode 100644
index 0000000..dd22cdb
--- /dev/null
+++ b/game/editor.rpy
@@ -0,0 +1,415 @@
+########################################################################################
+# 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=EditorInputValue(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=EditorInputValue(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:
+ import json, copy
+ 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("editor.json"), "w")
+ json.dump(allquests, f, indent=4, separators=(',', ': '))
+ f.close()
+ renpy.notify("File saved as 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 EditorInputValue(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")
+ jump restore
+
+label updater_editors:
+ $ url=renpy.input("Please insert update server URL:", default="http://spheres.tmw2.org/updates/")
+ $ updater.update(url) # , public_key="cert/certificate.pem") → Need to be RSA
+
+ jump restore
+
+