Example #1
0
    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()
Example #2
0
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