#!/usr/bin/env python """ made by Alessandro Molina <amol@sig11.org> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ import pygtk pygtk.require('2.0') import gobject import pango import gtk import gtk.glade import diacanvas as dia import pickle roomNumber = 0 selectedRoom = None selectedDirection = None def ChangeRadio(widget): global selectedDirection if(widget.get_active()): selectedDirection = widget.get_label() print selectedDirection def NewRoom(widget): global selectedRoom if(selectedRoom != None): window = widgetTree.get_widget('w_newroom') window.show() def DeleteRoom(widget): global selectedRoom global map if(selectedRoom != None): map.delRoom(selectedRoom) def MakeRoom(widget): global selectedRoom global selectedDirection global map box = MUDRoom() if(selectedRoom != None): dir = selectedDirection if(dir=="Nord"): box.move(selectedRoom.x, selectedRoom.y-45) box.setLevel(selectedRoom.level) elif(dir=="South"): box.move(selectedRoom.x, selectedRoom.y+45) box.setLevel(selectedRoom.level) elif(dir=="East"): box.move(selectedRoom.x+45, selectedRoom.y) box.setLevel(selectedRoom.level) elif(dir=="West"): box.move(selectedRoom.x-45, selectedRoom.y) box.setLevel(selectedRoom.level) elif(dir=="Up"): box.move(selectedRoom.x+15, selectedRoom.y-15) box.setLevel(selectedRoom.level+1) elif(dir=="Down"): box.move(selectedRoom.x-15, selectedRoom.y+15) box.setLevel(selectedRoom.level-1) map.linkRooms(box, selectedRoom) map.addRoom(box) window = widgetTree.get_widget('w_newroom') window.hide() def ChooseRoom(room): nameEntry = widgetTree.get_widget('RoomNameEntry') descText = widgetTree.get_widget('RoomDescText') roomList = widgetTree.get_widget('RoomList') roomNEntry = widgetTree.get_widget('roomnentry') HEntry = widgetTree.get_widget('hentry') global selectedRoom selectedRoom = room nameEntry.set_text(room.Name) roomNEntry.set_text(str(room.num)) descText.get_buffer().set_text(room.Desc) HEntry.set_text(str(room.level)) def UpdateRoomName(widget): if(selectedRoom != None): selectedRoom.Name = widget.get_text() def UpdateRoomDesc(widget, prot, borp): if(selectedRoom != None): selectedRoom.Desc = widget.get_buffer().get_text(widget.get_buffer().get_start_iter(), widget.get_buffer().get_end_iter()) def UpdateRoomDescB(widget, prot): if(selectedRoom != None): selectedRoom.Desc = widget.get_buffer().get_text(widget.get_buffer().get_start_iter(), widget.get_buffer().get_end_iter()) def open_file(widget, dialog): global map map.load(dialog.get_filename()) dialog.destroy() def on_apri_active(widget): print "APRI!" filesel = gtk.FileSelection(title="Open MUD map") filesel.cancel_button.connect("clicked", lambda w: filesel.destroy()) filesel.ok_button.connect("clicked", open_file, filesel) filesel.show() def save_file(widget, dialog): global map map.save(dialog.get_filename()) dialog.destroy() def on_salvan_active(widget): filesel = gtk.FileSelection(title="Save MUD map") filesel.cancel_button.connect("clicked", lambda w: filesel.destroy()) filesel.ok_button.connect("clicked", save_file, filesel) filesel.show() class MUDZone: def __init__(self): global canvas firstroom = MUDRoom() firstroom.Name = "STARTING LOCATION" firstroom.move(400, 400) self.roomList = [ firstroom ] canvas.root.add(firstroom) def addRoom(self, room): global canvas self.roomList.append(room) print room.Name print room.x, room.y canvas.root.add(room) def delRoom(self, room): self.roomList.remove(room) canvas.root.remove(room) def linkRooms(self, roomA, roomB): global canvas roomA.linkes.append(roomB.num) link = dia.CanvasLine() canvas.root.add(link) roomA.connect_handle(link.handles[1]) roomB.connect_handle(link.handles[0]) if(roomA.level>roomB.level): link.set(color=roomA.getColorForLevel(roomA.level)) else: link.set(color=roomB.getColorForLevel(roomB.level)) def findRoomN(self, roomN): for room in self.roomList: if(room.num == roomN): return room return None def save(self, file): print "Saving on file", file f = open(file, 'w+b') p = pickle.Pickler(f, 1) data = [] for room in self.roomList: print 'Saving room: ' + str(room.num) data.append(room.getState()) p.dump(data) f.close() def load(self, file): global roomNumber global selectedRoom global canvas f = open(file, 'r') p = pickle.Unpickler(f) data = p.load() f.close() for room in self.roomList: self.delRoom(room) roomNumber=0 selectedRoom=None for state in data: room = MUDRoom() room.setState(state) if(roomNumber<room.num): roomNumber = room.num self.addRoom(room) for room in self.roomList: print 'Starting to link room ' + str(room.num) for linkN in room.linkes: roomB = self.findRoomN(linkN) if(roomB != None): print 'Linking ' + str(room.num) + ' to ' + str(roomB.num) link = dia.CanvasLine() canvas.root.add(link) room.connect_handle(link.handles[1]) roomB.connect_handle(link.handles[0]) if(room.level<roomB.level): link.set(color=room.getColorForLevel(room.level)) else: link.set(color=roomB.getColorForLevel(roomB.level)) class MUDRoom(dia.CanvasBox, dia.CanvasAbstractGroup): def __init__(self): global roomNumber self.__gobject_init__() self.x=0 self.y=0 self.num = roomNumber = roomNumber+1 self.text = dia.CanvasText() self.changable=1 self.Name = "UNKNOWN ROOM" self.Desc = "Empty Description..." self.level = 25 self.linkes = [] self.set(height=25, width=25) self.add_construction(self.text) font = pango.FontDescription('sans 20') def text_changed(text_item, text, me): if(me.changable): me.changable=0 print 'rechanging text' text_item.set(text=self.num) me.changable=1 else: pass self.text.set(text=self.num, font=font, width=25, height=25) self.text.connect('text_changed', text_changed, self) self.text.move(0, 0) def getColorForLevel(self, level): if(level>0 and level<50): if(level==25): return dia.color(0, 0, 0, 255) elif(level<25): return dia.color(255, 0, 0, level*10) elif(level>25): return dia.color(0, 255, 0, (50-level)*10) else: print 'ERROR level too low' def setLevel(self, level): if(level>0 and level<50): self.level=level self.set(color=self.getColorForLevel(level)) else: print 'ERROR level too low' def getState(self): return (self.x, self.y, self.num, self.Name, self.Desc, self.level, self.linkes) def setState(self, state): self.x,self.y,self.num,self.Name,self.Desc,self.level,self.linkes = state x = self.x y = self.y self.x = 0 self.y = 0 self.move(x, y) self.setLevel(self.level) self.text.set(text=self.num) def on_event(self, event): if(event.type == dia.EVENT_BUTTON_PRESS): ChooseRoom(self) return dia.CanvasBox.on_event(self, event) def on_update(self, affine): dia.CanvasBox.on_update (self, affine) self.update_child(self.text, affine) def on_move(self, x, y, interactive): self.x=self.x+x self.y=self.y+y return dia.CanvasBox.on_move(self, x, y, interactive); def on_groupable_get_iter(self): return self.text def on_groupable_remove (self, item): pass def on_groupable_next (self, iter): return None def on_groupable_value (self, iter): return iter def on_groupable_length (self): return 1 def on_groupable_pos (self, item): if item == self.text: return 0 else: return -1 gobject.type_register (MUDRoom) dia.set_callbacks (MUDRoom) dia.set_groupable (MUDRoom) def quit_handler(widget): gtk.main_quit() def ShowAboutWin(widget): window = widgetTree.get_widget('aboutwin') window.show() def HideAboutWin(widget): window = widgetTree.get_widget('aboutwin') window.hide() def LinkRooms(widget): global widgetTree global map RoomAID = widgetTree.get_widget('roomLinkEntryA').get_text() RoomBID = widgetTree.get_widget('roomLinkEntryB').get_text() roomA = map.findRoomN(int(RoomAID)) roomB = map.findRoomN(int(RoomBID)) map.linkRooms(roomA, roomB) widgetTree = gtk.glade.XML("clexmap.glade") MainWindow = widgetTree.get_widget('mainwin') canvas = dia.Canvas() map = MUDZone() view = dia.CanvasView(canvas) mainbox = widgetTree.get_widget('canvaswindow') view.show() mainbox.add(view) widgetTree.signal_connect('gtk_main_quit', quit_handler) widgetTree.signal_connect('update_room_name', UpdateRoomName) widgetTree.signal_connect('update_room_desc', UpdateRoomDesc) widgetTree.signal_connect('update_room_descB', UpdateRoomDescB) widgetTree.signal_connect('make_new_room', NewRoom) widgetTree.signal_connect('create_new_room', MakeRoom) widgetTree.signal_connect('radio_button_click', ChangeRadio) widgetTree.signal_connect('del_room', DeleteRoom) widgetTree.signal_connect('on_apri1_activate', on_apri_active) widgetTree.signal_connect('on_salva_come1_activate', on_salvan_active) widgetTree.signal_connect('on_about1_activate', ShowAboutWin) widgetTree.signal_connect('hide_about_win', HideAboutWin) widgetTree.signal_connect('on_link_ok', LinkRooms) gtk.main()