def __init__(self, cnf, canvas=None, cel_class=Cel): self.objs = {} # Cel names are per set self.cels = {} self.cellist = [[], [], [], [], [], [], [], [], [], []] self.cel_class = cel_class self.canvas = canvas self.width = 448 self.height = 320 self.bordercol = 0 self.handlers = {} self.alarms = {} self.timers = [] self.palgroup = [0] * 10 # The palette group for each set self.palettes = [] # My palettes self.compiler = EventCompiler(self) parser = KissParser(self) parser.parse(os.path.basename(cnf)) # Reverse the cel lists to make sure bottom cels are drawn first for l in self.cellist: l.reverse()
class KiSS: def __init__(self, cnf, canvas=None, cel_class=Cel): self.objs = {} # Cel names are per set self.cels = {} self.cellist = [[], [], [], [], [], [], [], [], [], []] self.cel_class = cel_class self.canvas = canvas self.width = 448 self.height = 320 self.bordercol = 0 self.handlers = {} self.alarms = {} self.timers = [] self.palgroup = [0] * 10 # The palette group for each set self.palettes = [] # My palettes self.compiler = EventCompiler(self) parser = KissParser(self) parser.parse(os.path.basename(cnf)) # Reverse the cel lists to make sure bottom cels are drawn first for l in self.cellist: l.reverse() # methods called by the parser def is_action(self, name): return self.compiler.cmds.has_key(name) def get_obj(self, num): try: return self.objs[num] except KeyError: return None def get_var(self, name): try: var = self.vars[name] except KeyError: var = Variable(name) self.vars[name] = var return var def set_palette(self, set, palnum): self.palgroup[set] = palnum def add_event(self, name, args, actions): handler = self.compiler.compile('%s%r' % (name, args), actions) if handler is None: self.warn("Empty event: %s%r: %r" % (name, args, actions)) return if name == "label": self.compiler.add_label(args[0], handler) elif name == "alarm": self.alarms[args[0]] = handler elif name in ("unfix", "map", "unmap", "catch", "fixcatch", "drop", "fixdrop", "press", "release"): what = args[0] # There should be a list called blah_handlers on objects attr = '%s_handler' % name if isinstance(what, Object): if getattr(what, attr) is not None: self.warn("Multiple handlers for %s%r" % (name, args)) else: setattr(what, attr, handler) else: try: what = self.cels[what] except KeyError: self.warn("Unknown cel: %s" % what) else: if getattr(what.obj, attr) is not None: self.warn("Multiple handlers for %s%r" % (name, args)) else: setattr(what, attr, handler) elif name in ("initialize", "set", "col", "begin", "end", "version"): self.handlers[name, args] = handler elif name in ("apart", "collide"): # Handle a collision event name1, name2 = args name1 = name1.lower() name2 = name2.lower() try: cel1 = self.cels[name1] cel2 = self.cels[name2] except KeyError: return obj1 = cel1.obj obj2 = cel2.obj # See if there is an existing handler for collider in obj1.colliders: if not isinstance(collider, Collider): continue if collider.cel1 == cel1 and collider.cel2 == cel2 or \ collider.cel2 == cel1 and collider.cel1 == cel2: break else: collider = Collider(cel1, cel2) obj1.colliders.append(collider) obj2.colliders.append(collider) if name == "apart": if collider.handler2 is not None: raise ParseError, "Two apart handlers for %s and %s" % \ (cel1.name, cel2.name) collider.handler2 = handler else: if collider.handler1 is not None: raise ParseError, "Two collide handlers for %s and %s" % \ (cel1.name, cel2.name) collider.handler1 = handler print cel1.name, cel2.name elif name in ("in", "out", "stillin", "stillout"): obj1, obj2 = args for inout in obj1.colliders: if not isinstance(inout, Inout): continue if (inout.obj1 == obj1 and inout.obj2 == obj2) or \ (inout.obj2 == obj1 and inout.obj1 == obj2): break else: inout = Inout(obj1, obj2) obj1.colliders.append(inout) obj2.colliders.append(inout) if name == "in": if inout.handler1 is not None: raise ParseError, "Two in handlers for #%d and #%d" % \ (obj1.num, obj2.num) inout.handler1 = handler elif name == "out": if inout.handler2 is not None: raise ParseError, "Two out handlers for #%d and #%d" % \ obj1.num, obj2.num inout.handler2 = handler elif name == "stillin": if inout.handler3 is not None: raise ParseError, "Two stillin handlers for #%d and #%d" % \ obj1.num, obj2.num inout.handler3 = handler else: if inout.handler0 is not None: raise ParseError, "Two stillout handlers for #%d and #%d" % \ obj1.num, obj2.num inout.handler0 = handler elif self.handlers.has_key((name, args)): self.warn("Duplicate handler for %s%r" % (name, args)) else: raise ValueError, "Unknown event: %s%r" % (name, args) def set_size(self, (width, height)): self.width = width self.height = height