From 24969cf8071fcbf8089b09bb75939c3bb0df7c72 Mon Sep 17 00:00:00 2001 From: Allanis <allanis@saracraft.net> Date: Tue, 16 Apr 2013 21:35:08 +0100 Subject: [PATCH] [Add] resedit: More progress on the planet editor. --- utils/resedit/space.glade | 168 +++++++++++++++++++++++++++----------- utils/resedit/space.py | 135 +++++++++++++++++++++++++++++- utils/resedit/space.pyc | Bin 15186 -> 18502 bytes 3 files changed, 253 insertions(+), 50 deletions(-) diff --git a/utils/resedit/space.glade b/utils/resedit/space.glade index e21763d..cfeed96 100644 --- a/utils/resedit/space.glade +++ b/utils/resedit/space.glade @@ -5,7 +5,7 @@ <property name="width_request">750</property> <property name="height_request">450</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="title" translatable="yes">Systems</property> + <property name="title" translatable="yes">System Editor</property> <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> <child> <widget class="GtkVBox" id="vbox1"> @@ -422,8 +422,9 @@ </widget> <widget class="GtkWindow" id="winPlanets"> <property name="width_request">600</property> - <property name="height_request">450</property> + <property name="height_request">500</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="title" translatable="yes">Planet Editor</property> <child> <widget class="GtkHPaned" id="hpaned2"> <property name="visible">True</property> @@ -490,8 +491,8 @@ </child> <child> <widget class="GtkComboBox" id="comFaction"> - <property name="width_request">129</property> - <property name="height_request">29</property> + <property name="width_request">182</property> + <property name="height_request">24</property> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> </widget> @@ -520,22 +521,22 @@ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> </widget> <packing> - <property name="x">11</property> - <property name="y">94</property> + <property name="x">12</property> + <property name="y">173</property> </packing> </child> <child> <widget class="GtkTreeView" id="treCommodities"> <property name="width_request">188</property> - <property name="height_request">166</property> + <property name="height_request">149</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="headers_clickable">True</property> </widget> <packing> - <property name="x">16</property> - <property name="y">116</property> + <property name="x">17</property> + <property name="y">196</property> </packing> </child> <child> @@ -547,7 +548,7 @@ </widget> <packing> <property name="x">15</property> - <property name="y">287</property> + <property name="y">350</property> </packing> </child> <child> @@ -562,8 +563,8 @@ <property name="response_id">0</property> </widget> <packing> - <property name="x">15</property> - <property name="y">318</property> + <property name="x">16</property> + <property name="y">380</property> </packing> </child> <child> @@ -579,19 +580,19 @@ </widget> <packing> <property name="x">115</property> - <property name="y">316</property> + <property name="y">380</property> </packing> </child> <child> <widget class="GtkVSeparator" id="vseparator2"> <property name="width_request">20</property> - <property name="height_request">255</property> + <property name="height_request">171</property> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> </widget> <packing> <property name="x">209</property> - <property name="y">110</property> + <property name="y">194</property> </packing> </child> <child> @@ -602,8 +603,8 @@ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> </widget> <packing> - <property name="x">7</property> - <property name="y">360</property> + <property name="x">6</property> + <property name="y">419</property> </packing> </child> <child> @@ -615,8 +616,8 @@ <property name="label" translatable="yes">Services</property> </widget> <packing> - <property name="x">232</property> - <property name="y">115</property> + <property name="x">254</property> + <property name="y">194</property> </packing> </child> <child> @@ -632,7 +633,7 @@ </widget> <packing> <property name="x">240</property> - <property name="y">145</property> + <property name="y">215</property> </packing> </child> <child> @@ -648,7 +649,7 @@ </widget> <packing> <property name="x">320</property> - <property name="y">145</property> + <property name="y">215</property> </packing> </child> <child> @@ -664,7 +665,7 @@ </widget> <packing> <property name="x">240</property> - <property name="y">170</property> + <property name="y">235</property> </packing> </child> <child> @@ -680,7 +681,7 @@ </widget> <packing> <property name="x">240</property> - <property name="y">195</property> + <property name="y">255</property> </packing> </child> <child> @@ -696,7 +697,7 @@ </widget> <packing> <property name="x">320</property> - <property name="y">195</property> + <property name="y">255</property> </packing> </child> <child> @@ -707,8 +708,8 @@ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> </widget> <packing> - <property name="x">221</property> - <property name="y">217</property> + <property name="x">219</property> + <property name="y">274</property> </packing> </child> <child> @@ -720,8 +721,8 @@ <property name="label" translatable="yes">Tech</property> </widget> <packing> - <property name="x">246</property> - <property name="y">238</property> + <property name="x">260</property> + <property name="y">293</property> </packing> </child> <child> @@ -734,12 +735,12 @@ </widget> <packing> <property name="x">222</property> - <property name="y">260</property> + <property name="y">320</property> </packing> </child> <child> - <widget class="GtkSpinButton" id="spinbutton1"> - <property name="width_request">72</property> + <widget class="GtkSpinButton" id="spiTech0"> + <property name="width_request">58</property> <property name="height_request">20</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -747,8 +748,8 @@ <property name="adjustment">0 0 100000 1 10 10</property> </widget> <packing> - <property name="x">272</property> - <property name="y">260</property> + <property name="x">300</property> + <property name="y">320</property> </packing> </child> <child> @@ -760,8 +761,8 @@ <property name="label" translatable="yes">Special</property> </widget> <packing> - <property name="x">225</property> - <property name="y">290</property> + <property name="x">224</property> + <property name="y">345</property> </packing> </child> <child> @@ -775,7 +776,7 @@ </widget> <packing> <property name="x">235</property> - <property name="y">315</property> + <property name="y">365</property> </packing> </child> <child> @@ -789,7 +790,7 @@ </widget> <packing> <property name="x">300</property> - <property name="y">315</property> + <property name="y">365</property> </packing> </child> <child> @@ -803,7 +804,7 @@ </widget> <packing> <property name="x">235</property> - <property name="y">340</property> + <property name="y">390</property> </packing> </child> <child> @@ -817,19 +818,19 @@ </widget> <packing> <property name="x">300</property> - <property name="y">340</property> + <property name="y">390</property> </packing> </child> <child> <widget class="GtkComboBox" id="comSystem"> <property name="width_request">160</property> - <property name="height_request">25</property> + <property name="height_request">23</property> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> </widget> <packing> <property name="x">12</property> - <property name="y">400</property> + <property name="y">465</property> </packing> </child> <child> @@ -841,7 +842,7 @@ <property name="label" translatable="yes">System</property> </widget> <packing> - <property name="y">378</property> + <property name="y">440</property> </packing> </child> <child> @@ -856,8 +857,8 @@ <property name="response_id">0</property> </widget> <packing> - <property name="x">190</property> - <property name="y">377</property> + <property name="x">189</property> + <property name="y">438</property> </packing> </child> <child> @@ -869,8 +870,82 @@ <property name="label" translatable="yes">Class</property> </widget> <packing> - <property name="x">227</property> - <property name="y">60</property> + <property name="x">289</property> + <property name="y">20</property> + </packing> + </child> + <child> + <widget class="GtkImage" id="imaPlanet"> + <property name="width_request">152</property> + <property name="height_request">122</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="stock">gtk-missing-image</property> + </widget> + <packing> + <property name="x">260</property> + <property name="y">48</property> + </packing> + </child> + <child> + <widget class="GtkComboBox" id="comClass"> + <property name="width_request">79</property> + <property name="height_request">33</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + </widget> + <packing> + <property name="x">341</property> + <property name="y">9</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label13"> + <property name="width_request">101</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">GFX Space</property> + </widget> + <packing> + <property name="y">92</property> + </packing> + </child> + <child> + <widget class="GtkComboBox" id="comSpace"> + <property name="width_request">163</property> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + </widget> + <packing> + <property name="x">96</property> + <property name="y">89</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label14"> + <property name="width_request">98</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">GFX Exterior</property> + </widget> + <packing> + <property name="x">10</property> + <property name="y">123</property> + </packing> + </child> + <child> + <widget class="GtkComboBox" id="comExterior"> + <property name="width_request">154</property> + <property name="height_request">22</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + </widget> + <packing> + <property name="x">106</property> + <property name="y">120</property> </packing> </child> </widget> @@ -883,4 +958,3 @@ </child> </widget> </glade-interface> - diff --git a/utils/resedit/space.py b/utils/resedit/space.py index 13039a2..a382860 100644 --- a/utils/resedit/space.py +++ b/utils/resedit/space.py @@ -17,6 +17,7 @@ class Space: self.glade = "space.glade" self.systemsXML = "../../dat/ssys.xml" self.planetsXML = "../../dat/planet.xml" + self.planet_gfx = "../../gfx/planet/" self.loadSystems(self.systemsXML) self.loadPlanets(self.planetsXML) @@ -66,7 +67,7 @@ class Space: "butReset":["clicked", self.__space_reset], "butAddJump":["clicked", self.__jump_add], "butRmJump":["clicked", self.__jump_rm], - "butNew":["clicked", self.__new] + "butNew":["clicked", self.__snew] } for key, val in hooks.items(): self.__swidget(key).connect(val[0], val[1]) @@ -99,6 +100,29 @@ class Space: self.__pwidget("winPlanets").show_all() self.cur_planet = "" + # Hooks. + hooks = { + "butNew":["clicked", self.__pnew], + "trePlanets":["button-release-event", self.__pupdate] + } + for key, val in hooks.items(): + self.__pwidget(key).connect(val[0], val[1]) + + # Planet tree. + self.__create_trePlanets() + + # Classes. + classes = [ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", + "M", "O", "P", "Q", "R", "S", "T", "X", "Y", "Z", "0", "1"] + wgt = self.__pwidget("comClass") + combo = gtk.ListStore(str) + for a in classes: + node = combo.append(a) + cell = gtk.CellRendererText() + wgt.pack_start(cell, True) + wgt.add_attribute(cell, "text", 0) + wgt.set_model(combo) + # --------------------------------------------- gtk.main() @@ -119,6 +143,22 @@ class Space: col.add_attribute(cell, 'text', 0) wgt.set_model(self.tree_systems) + def __create_trePlanets(self): + # Population. + wgt = self.__pwidget("trePlanets") + self.tree_planets = gtk.TreeStore(str) + for planet in self.planets: + treenode = self.tree_planets.append(None, [planet]) + col = gtk.TreeViewColumn('Planets') + cell = gtk.CellRendererText() + if wgt.get_column(0): + wgt.remove_column(wgt.get_column(0)) + wgt.append_column(col) + col.pack_start(cell, True) + col.add_attribute(cell, 'text', 0) + wgt.set_model(self.tree_planets) + + def __swidget(self,wgtname): """ get a widget from the winSystems @@ -180,6 +220,48 @@ class Space: return planet = self.planets[self.cur_planet] + dic = { + "inpName":self.cur_planet + } + + for key, value in dic.items(): + self.__pwidget(key).set_text(str(value)) + + # Class. + cls = planet["general"]["class"] + i = 0 + wgt = self.__pwidget("comClass") + model = wgt.get_model() + for row in model: + if row[0] == cls: + wgt.set_active_iter(model.get_iter(i)) + i = i + 1 + + # Tech. + try: + self.__pwidget("spiTech0").set_text(str(planet["general"]["tech"]["main"])) + except: + self.__pwidget("spiTech0").set_text(str(0)) + + # Services. + services = int(planet["general"]["services"]) + serv = { + "cheLand":2**0, + "cheBasic":2**1, + "cheCommodity":2**2, + "cheOutfits":2**3, + "cheShipyard":2**4, + } + + for s, m in serv.items(): + if services & m > 0: + self.__pwidget(s).set_active(True) + else: + self.__pwidget(s).set_active(False) + + self.__pwidget("imaPlanet").set_from_file(self.planet_gfx + "space/" + + planet["GFX"]["space"]) + def __sstore(self): sys_name = self.__swidget("inpName").get_text() if sys_name == "": @@ -220,6 +302,43 @@ class Space: self.__sinpStore(system, "spiInterference", "general", "interference") self.__sinpStore(system, "spiAsteroids", "general", "asteroids") + def __pstore(self): + planet_name = self.__swidget("inpName").get_text() + if planet_name == "": + return + + if planet_name != self.cur_planet: + self.planets[planet_name] = self.planets[self.cur_planet] + model = self.__pwidget("trePlanets").get_model() + + for i in model: + if i[0] == self.cur_planet: + i[0] = planet_name + break + + del self.planets[self.cur_planet] + self.cur_planet = planet_name + + try: + planet = self.planets[self.cur_planet] + except: + return + + # Get the service. + services = 0 + serv = { + "cheLand":2**0, + "cheBasic":2**1, + "cheCommodity":2**2, + "cheOutfits":2**3, + "cheShipyard":2**4 + } + + for s, m in serv.items(): + if self.__pwidget(s).get_active(): + services = services + m + planet["general"]["services"] = services + def __sinpStore(self, system, wgt, tag, minortag=None): text = self.__swidget(wgt).get_text() if minortag==None: @@ -427,8 +546,8 @@ class Space: self.__supdate() self.__space_draw() - def __new(self, wgt=None, event=None): - name = "untitled" + def __snew(self, wgt=None, event=None): + name = "new system" gen = { "asteroids":0, "interference":0, "stars":100 } pos = { "x":0, "y":0 } new_ssys = { "general":gen, "pos":pos, "jumps":[], "fleets":{}, "planets":[] } @@ -436,6 +555,16 @@ class Space: self.__create_treSystems() self.__selSys(name) + def __pnew(self, wgt=None, event=None): + name = "new planet" + gfx = { "space":"none.png" } + gen = { "class":"A", "services":0, "GFX":gfx } + pos = { "x":0, "y":0 } + new_planet = { "general":gen, "pos":pos } + self.planets[name] = new_planet + self.__create_trePlanets() + self.__selPlanet(name) + def __selSys(self, system): i = 0 tree = self.__swidget("treSystems") diff --git a/utils/resedit/space.pyc b/utils/resedit/space.pyc index f3fb02217d080e865740546d1ce89d81073836f9..91ca96603df3d08a25c59964aabe9762995a4003 100644 GIT binary patch delta 6492 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 H+thynf&{8M delta 3663 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 HnbQ9O<q)is