[pypy-svn] r30638 - in pypy/dist/pypy/translator/js: . demo/jsdemo jssrc tools

fijal at codespeak.net fijal at codespeak.net
Thu Jul 27 16:01:17 CEST 2006


Author: fijal
Date: Thu Jul 27 16:00:49 2006
New Revision: 30638

Modified:
   pypy/dist/pypy/translator/js/database.py
   pypy/dist/pypy/translator/js/demo/jsdemo/bnb.py
   pypy/dist/pypy/translator/js/jssrc/misc.js
   pypy/dist/pypy/translator/js/tools/start_bnb.py
Log:
Fixed constant rendering order (I hope forever). BNB now playable.


Modified: pypy/dist/pypy/translator/js/database.py
==============================================================================
--- pypy/dist/pypy/translator/js/database.py	(original)
+++ pypy/dist/pypy/translator/js/database.py	Thu Jul 27 16:00:49 2006
@@ -37,6 +37,7 @@
         self.function_names = {} # graph --> real_name
         self.methods = {} # graph --> method_name
         self.consts = {}  # value --> const_name
+        self.reverse_consts = {}
         self.const_names = set()
         self.const_var = Variable("__consts")
         self.name_manager = JavascriptNameManager(self)
@@ -116,7 +117,7 @@
                 return self.consts[const]
             else:
                 self.consts[const]
-                return const
+                return self.reverse_consts[self.consts[const]]
         except KeyError:
             log("New const:%r"%value)
             if isinstance(value, ootype._string):
@@ -125,6 +126,7 @@
             if name in self.const_names:
                 name += '__%d' % len(self.consts)
             self.consts[const] = name
+            self.reverse_consts[name] = const
             self.const_names.add(name)
             self.pending_consts.append((const,name))
         if retval == 'name':
@@ -150,13 +152,17 @@
             while len(all_c) > 0:
                 const = all_c.pop()
                 if const not in rendered:
+                    to_render = True
+                    #if consts[const] == 'const_str__63':
+                    #    import pdb;pdb.set_trace()
                     if hasattr(const, 'depends_on') and const.depends_on:
                         for i in const.depends_on:
                             if i not in rendered and i not in dep_ok:
                                 assert i.depends is None or const in i.depends
+                                to_render = False
                                 continue
                     
-                    if (not hasattr(const, 'depends')) or (not const.depends) or const in dep_ok:
+                    if to_render and (not hasattr(const, 'depends')) or (not const.depends) or const in dep_ok:
                         yield const,consts[const]
                         rendered.add(const)
                     else:
@@ -426,15 +432,21 @@
         ilasm.load_str(self.name)
 
 class DictConst(RecordConst):
+    def record_const(self, co):
+        #if isinstance(co, ootype._string) and co._str == 'fire':
+        #    import pdb;pdb.set_trace()
+        name = self.db.record_const(co, None, 'const')
+        if name is not None:
+            self.depends.add(name)
+            name.depends_on.add(self)
+    
     def record_fields(self):
         if not self.const:
             return
         
         for i in self.const._dict:
-            name = self.db.record_const(self.const._dict[i], None, 'const')
-            if name is not None:
-                self.depends.add(name)
-                name.depends_on.add(self)
+            self.record_const(i)
+            self.record_const(self.const._dict[i])
 
     def init_fields(self, ilasm, const_var, name):
         if not self.const:

Modified: pypy/dist/pypy/translator/js/demo/jsdemo/bnb.py
==============================================================================
--- pypy/dist/pypy/translator/js/demo/jsdemo/bnb.py	(original)
+++ pypy/dist/pypy/translator/js/demo/jsdemo/bnb.py	Thu Jul 27 16:00:49 2006
@@ -23,6 +23,7 @@
         self.last_seen = set()
         self.seen = set()
         self.num_frame = 0
+        self.z_index = {}
     
     def def_icon(self, icon_code):
         self.sprite_sets[icon_code] = []
@@ -86,11 +87,11 @@
     _render_xmlhttp = True
     
     _methods = {
-        'get_message'  : MethodDesc( [('callback', (lambda : None))] , {'aa':[{'aa':'bb'}]}),
+        'get_message'  : MethodDesc( [('player_id', -1), ('keys' , "aaa"), ('callback', (lambda : None))] , {'aa':[{'aa':'bb'}]}),
         'add_player'   : MethodDesc( [('player_id', 0), ('callback', (lambda : None))] , {'aa':[{'aa':'bb'}]}),
         'remove_player': MethodDesc( [('player_id', 0), ('callback', (lambda : None))] , {'aa':[{'aa':'bb'}]}),
         'player_name'  : MethodDesc( [('player_id', 0), ('name', 'PyPy player'), ('callback', (lambda : None))] , {'aa':[{'aa':'bb'}]}),
-        'key'          : MethodDesc( [('player_id', 0), ('keynum', '0'), ('callback', (lambda : None))] , {'aa':[{'aa':'bb'}]}),
+#        'key'          : MethodDesc( [('player_id', 0), ('keynum', '0'), ('callback', (lambda : None))] , {'aa':[{'aa':'bb'}]}),
         'initialize_session' : MethodDesc( [('callback', (lambda : None))], {'aa':'bb'}),
     }
     
@@ -146,42 +147,10 @@
         self.sessionSocket().send(message(CMSG_REMOVE_PLAYER, int(player_id)))
         return dict()
 
-    @turbogears.expose(format='json')
-    def key(self, player_id, keynum):
-        self.sessionSocket().send(message(CMSG_KEY, int(player_id), int(keynum)))
-        return dict()
-
-    @turbogears.expose(format='json')
-    def key0(self):
-        return self.key(0, 0)
-
-    @turbogears.expose(format='json')
-    def key1(self):
-        return self.key(0, 1)
-
-    @turbogears.expose(format='json')
-    def key2(self):
-        return self.key(0, 2)
-
-    @turbogears.expose(format='json')
-    def key3(self):
-        return self.key(0, 3)
-
-    @turbogears.expose(format='json')
-    def key4(self):
-        return self.key(0, 4)
-
-    @turbogears.expose(format='json')
-    def key5(self):
-        return self.key(0, 5)
-
-    @turbogears.expose(format='json')
-    def key6(self):
-        return self.key(0, 6)
-
-    @turbogears.expose(format='json')
-    def key7(self):
-        return self.key(0, 7)
+##    @turbogears.expose(format='json')
+##    def key(self, player_id, keynum):
+##        self.sessionSocket().send(message(CMSG_KEY, int(player_id), int(keynum)))
+##        return dict()
 
     @turbogears.expose(format='json')
     def close(self):
@@ -218,7 +187,7 @@
         return dict()
 
     @turbogears.expose(format="json")
-    def get_message(self):
+    def get_message(self, player_id, keys):
         #XXX hangs if not first sending CMSG_PING!
         sm   = self.serverMessage()
         data = sm.data
@@ -272,19 +241,31 @@
 ##            new_sprite, s_num = sprite_manager.get_sprite(*next)
 ##            to_append.append({'type':'show_sprite', 's':s_num, 'icon_code':str(next[0]), 'x':str(next[1]), 'y':str(next[2])})
         
-        def get_partial_frame(next):
+        if player_id != -1:
+            if keys:
+                for i in keys.split(":"):
+                    self.sessionSocket().send(message(CMSG_KEY, int(player_id), int(i)))
+                
+        def get_partial_frame(next, z_num):
             new_sprite, s_num = sprite_manager.get_sprite(*next)
             if new_sprite == 'new':
-                to_append.append({'type':'ns', 's':s_num, 'icon_code':str(next[0]), 'x':str(next[1]), 'y':str(next[2])})
+                to_append.append({'type':'ns', 's':s_num, 'icon_code':str(next[0]), 'x':str(next[1]), 'y':str(next[2]), 'z':z_num})
+                sprite_manager.z_index[s_num] = z_num
             elif new_sprite == 'move':
-                to_append.append({'type':'sm', 's':str(s_num), 'x':str(next[1]), 'y':str(next[2])})
-
+                to_append.append({'type':'sm', 's':str(s_num), 'x':str(next[1]), 'y':str(next[2]), 'z':z_num})
+                sprite_manager.z_index[s_num] = z_num
+            else:
+                if sprite_manager.z_index[s_num] != z_num:
+                    to_append.append({'type':'zindex', 's':s_num, 'z':z_num})
+                    sprite_manager.z_index[s_num] = z_num
+            return s_num
+        
+        z_num = 0
         for i, msg in enumerate(messages):
             if msg['type'] == PMSG_INLINE_FRAME:
                 for next in msg['sprites']:
-                    #to_append.append({'type':'ns', 's':self.num, 'icon_code':str(next[0]), 'x':str(next[1]), 'y':str(next[2])})
-                    #self.num += 1
-                    get_partial_frame(next)
+                    s_num = get_partial_frame(next, z_num)
+                    z_num += 1
                 del messages[i]
 
         empty_frame = False

Modified: pypy/dist/pypy/translator/js/jssrc/misc.js
==============================================================================
--- pypy/dist/pypy/translator/js/jssrc/misc.js	(original)
+++ pypy/dist/pypy/translator/js/jssrc/misc.js	Thu Jul 27 16:00:49 2006
@@ -7,7 +7,9 @@
 function inherits(child, parent) {
     child.parent = parent;
     for (i in parent.prototype) {
-        child.prototype[i] = parent.prototype[i];
+        if (!child.prototype[i]) {
+            child.prototype[i] = parent.prototype[i];
+        }
     }
 }
 

Modified: pypy/dist/pypy/translator/js/tools/start_bnb.py
==============================================================================
--- pypy/dist/pypy/translator/js/tools/start_bnb.py	(original)
+++ pypy/dist/pypy/translator/js/tools/start_bnb.py	Thu Jul 27 16:00:49 2006
@@ -14,7 +14,7 @@
 from pypy.translator.js.test.runtest import compile_function
 from pypy.translator.js.modules._dom import get_document
 from pypy.translator.js.modules.xmlhttp import XMLHttpRequest
-from pypy.translator.js.modules.mochikit import log, logWarning, createLoggingPane
+from pypy.translator.js.modules.mochikit import log, logWarning, createLoggingPane, logDebug
 from pypy.translator.js.modules.bltns import date
 from pypy.translator.js.demo.jsdemo.bnb import BnbRootInstance
 
@@ -113,12 +113,35 @@
             except KeyError:
                 self.hide_sprite(i)
     
+    def set_z_index(self, s_num, z):
+        self.sprites[s_num].style.zIndex = z
+    
     #def show_sprite(self, s):
     #    i = self.sprites[s]
     #    i.style.visibility = "visible"
 
 sm = SpriteManager()
 
+class KeyManager(object):
+    def __init__(self):
+        self.keymappings = {ord('D'):'right', ord('S'):'fire', ord('A'):'left', ord('W'):'up'}
+        self.key_to_bnb_down = {'right':0, 'left':1, 'fire':3, 'up':2}
+        self.key_to_bnb_up = {'right':4, 'left':5, 'fire':7, 'up':6}
+        self.queue = []
+            
+    def add_key_up(self, key):
+        self.queue.append(self.key_to_bnb_up[key])
+    
+    def add_key_down(self, key):
+        self.queue.append(self.key_to_bnb_down[key])
+
+    def get_keys(self):
+        retval = self.queue
+        self.queue = []
+        return retval
+    
+km = KeyManager()
+
 def appendPlayfield(msg):
     bgcolor = '#000000'
     get_document().body.setAttribute('bgcolor', bgcolor)
@@ -146,8 +169,10 @@
         sm.add_icon(msg['icon_code'], msg['filename'])
     elif msg['type'] == 'ns':
         sm.add_sprite(msg['s'], msg['icon_code'], msg['x'], msg['y'])
+        sm.set_z_index(msg['s'], msg['z'])
     elif msg['type'] == 'sm':
         sm.move_sprite(msg['s'], msg['x'], msg['y'])
+        sm.set_z_index(msg['s'], msg['z'])
     elif msg['type'] == 'ds':
         sm.hide_sprite(msg['s'])
     elif msg['type'] == 'begin_clean_sprites':
@@ -156,6 +181,8 @@
         sm.end_clean_sprites()
     elif msg['type'] == 'show_sprite':
         sm.show_sprite(msg['s'], msg['icon_code'], msg['x'], msg['y'])
+    elif msg['type'] == 'zindex':
+        sm.set_z_index(msg['s'], msg['z'])
     #elif msg['type'] == 'ss':
     #    sm.show_sprite(msg['s'])
     elif msg['type'] == 'player_icon' or msg['type'] == 'def_key' or \
@@ -186,69 +213,37 @@
 def keydown(key):
     #c = chr(int(key.keyCode)).lower()
     #c = int(key.keyCode)
-    c = key.keyCode
-    if c == 48: #ord('0'):
-        addPlayer(0)
-    elif c == 49: #ord('1'):  #bwah. should really work on being able to cast to int
-        addPlayer(1)
-    elif c == 50: #ord('2'):
-        addPlayer(2)
-    elif c == 51: #ord('3'):
-        addPlayer(3)
-    elif c == 52: #ord('4'):
-        addPlayer(4)
-    elif c == 53: #ord('5'):
-        addPlayer(5)
-    elif c == 54: #ord('6'):
-        addPlayer(6)
-    elif c == 55: #ord('7'):
-        addPlayer(7)
-    elif c == 56: #ord('8'):
-        addPlayer(8)
-    elif c == 57: #ord('9'):
-        addPlayer(9)
-    elif c == 68: #ord('D'):  #right
-        BnbRootInstance.key(player.id, 0, ignore_dispatcher)
-        logKey('start right')
-    elif c == 83: #ord('S'):  #left
-        BnbRootInstance.key(player.id, 1, ignore_dispatcher)
-        logKey('start left')
-    elif c == 69: #ord('E'):  #up
-        BnbRootInstance.key(player.id, 2, ignore_dispatcher)
-        logKey('start up')
-    elif c == 88: #ord('X'):  #fire
-        BnbRootInstance.key(player.id, 3, ignore_dispatcher)
-        logKey('start fire')
-    else:
+    try:
+        logWarning("Keydown pressed")
+        c = key.keyCode
+        if c > ord('0') and c < ord('9'):
+            addPlayer(int(chr(c)))
+        #for i in km.keymappings:
+        #    log(str(i))
+        if c in km.keymappings:
+            logWarning('adding' + str(c))
+            km.add_key_down(km.keymappings[c])
+        #else:
         logWarning('unknown keydown: ' + str(c))
-
+    except Exception, e:
+        log(str(e))
 
 def keyup(key):
     c = key.keyCode
-    if c == 48 or c == 49 or c == 50 or c == 51 or c == 52 or\
-       c == 53 or c == 54 or c == 55 or c == 56 or c == 57: #XXX c in (...) didn't work
+    if c > ord('0') and c < ord('9'):
         pass    #don't print warning
-    elif c == 68: #ord('D'):  #right
-        BnbRootInstance.key(player.id, 4, ignore_dispatcher)
-        logKey('stop right')
-    elif c == 83: #ord('S'):  #left
-        BnbRootInstance.key(player.id, 5, ignore_dispatcher)
-        logKey('stop left')
-    elif c == 69: #ord('E'):  #up
-        BnbRootInstance.key(player.id, 6, ignore_dispatcher)
-        logKey('stop up')
-    elif c == 88: #ord('X'):  #fire
-        BnbRootInstance.key(player.id, 7, ignore_dispatcher)
-        logKey('stop fire')
+    elif c in km.keymappings:
+        km.add_key_up(km.keymappings[c])
     else:
         logWarning('unknown keyup: ' + str(c))
-
+    
 def ignore_dispatcher(msgs):
     pass
 
 def bnb_dispatcher(msgs):
-    BnbRootInstance.get_message(bnb_dispatcher)
-
+    #a = [str(i) for i in q]
+    #logDebug(str(a))
+    BnbRootInstance.get_message(player.id, ":".join([str(i) for i in km.get_keys()]), bnb_dispatcher)
     #sm_restart = int(msgs['add_data'][0]['sm_restart'])
     #if sm_restart == 123:
     #    log("sm_restart")
@@ -259,12 +254,12 @@
     #    get_document().body.removeChild(playfield)
     #    appendPlayfieldXXX()
 
-    count = int(msgs['add_data'][0]['n'])
-    if count != player.prev_count + 1:
-        logWarning("incorrect response order, expected " + str(player.prev_count+1) + ' got ' + str(count))
-        sm.frames.append(msgs)
-    player.prev_count = count
-    #else:
+##    count = int(msgs['add_data'][0]['n'])
+##    if count != player.prev_count + 1:
+##        logWarning("incorrect response order, expected " + str(player.prev_count+1) + ' got ' + str(count))
+##        sm.frames.append(msgs)
+##    player.prev_count = count
+##        #else:
     #    player.prev_count = count
     #    for i in sm.frames:
     #        render_frame(i)
@@ -277,14 +272,14 @@
     get_document().title = str(stats.n_sprites) + " sprites " + str(stats.fps)
 
 def session_dispatcher(msgs):
-    BnbRootInstance.get_message(bnb_dispatcher)
+    BnbRootInstance.get_message(player.id, "", bnb_dispatcher)
 
 def run_bnb():
     def bnb():
         genjsinfo = get_document().getElementById("genjsinfo")
         get_document().body.removeChild(genjsinfo)
         createLoggingPane(True)
-        log("keys: [0-9] to select player, [esdx] to walk around")
+        log("keys: [0-9] to select player, [wsad] to walk around")
         BnbRootInstance.initialize_session(session_dispatcher)
         get_document().onkeydown = keydown
         get_document().onkeyup   = keyup



More information about the Pypy-commit mailing list