Ignore:
Timestamp:
01/17/12 01:34:00 (12 years ago)
Author:
atzm
Message:
  • multi enemies support
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pycodeshooter/trunk/shooter/system.js

    r106 r108  
    2222    }, 
    2323    "message":          null, 
    24     "boss":             null, 
    25     "player":           null, 
     24    "enemies":          new Array(), 
     25    "players":          new Array(), 
    2626    "backgroundObject": new Array(), 
    2727    "deathPieces":      new Array(), 
    28     "gameOver":         false, 
    2928    "mainIntervalId":   0 
    3029}; 
     
    3231 
    3332/* 
    34  *  Tiun Tiun 
     33 *  Tiun Tiun Utilities 
    3534 */ 
    3635var DeathPiece = function(sizes, colors, x, y, dir, speed) { 
     
    5554}; 
    5655 
     56function addDeathPieces(x, y, sizes, colors, speed, way) { 
     57    if (way % 2) 
     58        way++; 
     59 
     60    var pieces = new Array(); 
     61    var angle  = 0; 
     62    var delta  = 2 / way; 
     63 
     64    for(var i = 0; i < way; i++) { 
     65        pieces.push(new DeathPiece(sizes, colors, x, y, angle * Math.PI, speed)); 
     66        angle += delta; 
     67    } 
     68 
     69    System.deathPieces.push(pieces); 
     70} 
     71 
     72function updateDeathPieces(ctx, width, height) { 
     73    var newObjs = new Array(); 
     74 
     75    for (var i = 0; i < System.deathPieces.length; i++) { 
     76        var pieces    = System.deathPieces[i]; 
     77        var newPieces = new Array(); 
     78 
     79        for (var k = 0; k < pieces.length; k++) { 
     80            pieces[k].next(); 
     81            pieces[k].draw(ctx); 
     82            if (!pieces[k].vanished(width, height)) 
     83                newPieces.push(pieces[k]); 
     84        } 
     85 
     86        if (newPieces.length) 
     87            newObjs.push(newPieces); 
     88    } 
     89 
     90    System.deathPieces = newObjs; 
     91} 
     92 
    5793 
    5894/* 
    5995 *  Utility Functions 
    6096 */ 
     97function setMessage(elem, msg) { 
     98    if (elem) 
     99        elem.innerHTML = msg; 
     100} 
     101 
     102function addMessage(elem, msg) { 
     103    if (elem) 
     104        elem.innerHTML += msg; 
     105} 
     106 
    61107function updateBackground(ctx, width, height, size, color, max) { 
    62108    if (System.backgroundObject.length < max) { 
     
    68114 
    69115    var newObjs = new Array(); 
     116 
    70117    for (var i = 0; i < System.backgroundObject.length; i++) { 
    71118        System.backgroundObject[i].next(); 
     
    74121            newObjs.push(System.backgroundObject[i]); 
    75122    } 
     123 
    76124    System.backgroundObject = newObjs; 
    77 } 
    78  
    79 function updateDeathPieces(ctx, width, height, x, y, sizes, colors, speed, way) { 
    80     if (System.deathPieces.length <= 0) { 
    81         if (way % 2) 
    82             way++; 
    83  
    84         var angle = 0; 
    85         var delta = 2 / way; 
    86  
    87         for(i = 0; i < way; i++) { 
    88             System.deathPieces.push( 
    89                 new DeathPiece(sizes, colors, x, y, angle * Math.PI, speed)); 
    90             angle += delta; 
    91         } 
    92     } 
    93  
    94     var newObjs = new Array(); 
    95     for (var i = 0; i < System.deathPieces.length; i++) { 
    96         System.deathPieces[i].next(); 
    97         System.deathPieces[i].draw(ctx); 
    98         if (!System.deathPieces[i].vanished(width, height)) 
    99             newObjs.push(System.deathPieces[i]); 
    100     } 
    101     System.deathPieces = newObjs; 
    102  
    103     return !System.deathPieces.length; 
    104125} 
    105126 
     
    151172} 
    152173 
    153 function updateTrooper(trooper, enemy) { 
    154     if (System.gameOver) { 
    155         trooper.clearBullet(); 
    156         enemy.clearBullet(); 
    157  
    158         drawString( 
    159             System.screen.ctx, "source-over", 
    160             "GAME OVER", 
    161             System.screen.width / 2, 
    162             System.screen.height / 2, 
    163             "#ACF", "24pt monospace", "center" 
    164         ); 
    165     } 
    166     else if (trooper.isDead()) { 
    167         trooper.clearBullet(); 
    168         enemy.clearBullet(); 
    169  
    170         System.gameOver = updateDeathPieces( 
    171             System.screen.ctx, 
    172             System.screen.width, 
    173             System.screen.height, 
    174             trooper.x, 
    175             trooper.y, 
    176             [6, 8, 10], ["#55F", "#AAF"], 3, 8 
    177         ); 
    178     } 
    179     else if (enemy.isDead()) { 
    180         trooper.draw(System.screen.ctx); 
    181     } 
    182     else { 
    183         trooper.update(enemy); 
    184         trooper.draw(System.screen.ctx); 
    185     } 
    186 } 
    187  
    188 function setMessage(elem, msg) { 
    189     if (elem) 
    190         elem.innerHTML = msg; 
    191 } 
    192  
    193 function addMessage(elem, msg) { 
    194     if (elem) 
    195         elem.innerHTML += msg; 
     174function updateTrooper(trooper, enemyKey) { 
     175    trooper.update(System[enemyKey]); 
     176 
     177    var aliveEnemies = new Array(); 
     178    for (var i = 0; i < System[enemyKey].length; i++) { 
     179        var enemy = System[enemyKey][i]; 
     180 
     181        if (enemy.isDead()) { 
     182            addDeathPieces( 
     183                enemy.x, enemy.y, 
     184                [6, 8, 10], ["#55F", "#AAF"], 3, 8 
     185            ); 
     186        } 
     187        else { 
     188            aliveEnemies.push(enemy); 
     189        } 
     190    } 
     191    System[enemyKey] = aliveEnemies; 
     192 
     193    trooper.draw(System.screen.ctx); 
     194} 
     195 
     196function addEnemy(enemyData) { 
     197    var actList = EnemyActionLists[enemyData.mtime % EnemyActionLists.length]; 
     198    var shot    = EnemyShots[enemyData.hitpoint % EnemyShots.length]; 
     199    var numAct  = enemyData.agility       % (EnemyActions.length  - 1) + 1; 
     200    var numBlt  = enemyData.skills.length % (EnemyBullets.length  - 1) + 1; 
     201    var numBrrg = enemyData.skills.length % (EnemyBarrages.length - 1) + 1; 
     202    var acts    = new Array(); 
     203    var brrgs   = new Array(); 
     204 
     205    var bulletWay         = Math.ceil(enemyData.concentration / 10); 
     206    var bulletInterval    = Math.round(50 * 1 / Math.log(enemyData.skillpoint + 0.1)); 
     207    var bulletSize        = Math.round(Math.log(enemyData.luck + 1)); 
     208    var bulletFrameWidth  = (bulletSize + 5) * 2; 
     209    var bulletFrameHeight = (bulletSize + 5) * 4; 
     210    var bulletSpeed       = enemyData.strength / 15; 
     211 
     212    bulletSpeed = Math.log(bulletSpeed < 1.5 ? 1.5 : bulletSpeed); 
     213 
     214    for (var i = 0; i < numAct; i++) { 
     215        var idx = (enemyData.agility + i) % EnemyActions.length; 
     216        acts.push(new EnemyActions[idx](new shot())); 
     217    } 
     218 
     219    for (var i = 0; i < numBrrg; i++) { 
     220        var idx     = (enemyData.skillpoint + i * (enemyData.skills.length + 1)) % EnemyBarrages.length; 
     221        var brrgCls = EnemyBarrages[idx]; 
     222 
     223        for (var k = 0; k < numBlt; k++) { 
     224            var iidx = (enemyData.skills.length + i + k) % EnemyBullets.length; 
     225            brrgs.push( 
     226                new brrgCls( 
     227                    EnemyBullets[iidx], 
     228                    bulletSize, 
     229                    "#FF3", 
     230                    {"style": "rect", "color": "rgba(128,32,32,0.5)", 
     231                     "width": bulletFrameWidth, "height": bulletFrameHeight}, 
     232                    bulletInterval, 
     233                    bulletSpeed, 
     234                    bulletWay 
     235                ) 
     236            ); 
     237        } 
     238    } 
     239 
     240    var size  = Math.ceil((System.screen.width / 2) * (1 / enemyData.defense)); 
     241    var enemy = new Trooper( 
     242        enemyData.name, 
     243        new actList(acts), 
     244        size, 
     245        size, 
     246        "#F33", 
     247        "#F33", 
     248        System.screen.width / 2, 
     249        System.screen.height / 7, 
     250        System.screen.width, 
     251        System.screen.height, 
     252        enemyData.hitpoint, 
     253        Math.log(enemyData.agility + 0.1) * 3, 
     254        0, 
     255        ["rgba(255,0,0,0.3)", "rgba(0,0,255,0.3)"], 
     256        brrgs 
     257    ); 
     258 
     259    System.enemies.push(enemy); 
    196260} 
    197261 
     
    219283 
    220284    // update/draw troopers 
    221     updateTrooper(System.player, System.boss); 
    222     updateTrooper(System.boss, System.player); 
    223  
    224     // draw player name/life 
    225     drawString( 
    226         System.screen.ctx, 
    227         "source-over", 
    228         System.player.name, 
    229         10, System.screen.height - 25, 
    230         "#ACF", "9pt monospace", "left" 
    231     ); 
    232     drawLifeGauge( 
    233         System.screen.ctx, 
    234         "lighter", 
    235         System.player, 
    236         10, 
    237         System.screen.height - 20, 
    238         System.screen.width 
    239     ); 
    240  
    241     // draw boss name/life 
    242     drawString( 
    243         System.screen.ctx, 
    244         "source-over", 
    245         System.boss.name, 10, 35, 
    246         "#FCA", "9pt monospace", "left" 
    247     ); 
    248     drawLifeGauge( 
    249         System.screen.ctx, 
    250         "lighter", 
    251         System.boss, 
    252         10, 
    253         10, 
    254         System.screen.width 
    255     ); 
     285    for (var i = 0; i < System.players.length; i++) { 
     286        var player = System.players[i]; 
     287 
     288        updateTrooper(player, "enemies"); 
     289 
     290        drawLifeGauge( 
     291            System.screen.ctx, 
     292            "lighter", 
     293            player, 
     294            10, 
     295            (System.screen.height - 20) - (i * 33), 
     296            System.screen.width 
     297        ); 
     298 
     299        drawString( 
     300            System.screen.ctx, 
     301            "source-over", 
     302            player.name, 
     303            10, 
     304            (System.screen.height - 23) - (i * 33), 
     305            "#ACF", "9pt monospace", "left" 
     306        ); 
     307    } 
     308 
     309    // update/draw enemies 
     310    for (var i = 0; i < System.enemies.length; i++) { 
     311        var enemy = System.enemies[i]; 
     312 
     313        updateTrooper(enemy, "players"); 
     314 
     315        drawLifeGauge( 
     316            System.screen.ctx, 
     317            "lighter", 
     318            enemy, 10, i * 33 + 10, 
     319            System.screen.width 
     320        ); 
     321 
     322        drawString( 
     323            System.screen.ctx, 
     324            "source-over", 
     325            enemy.name, 10, i * 33 + 33, 
     326            "#FCA", "9pt monospace", "left" 
     327        ); 
     328    } 
     329 
     330    updateDeathPieces(System.screen.ctx, 
     331                      System.screen.width, 
     332                      System.screen.height); 
     333 
     334    if (!System.players.length) { 
     335        drawString( 
     336            System.screen.ctx, "source-over", 
     337            "GAME OVER", 
     338            System.screen.width / 2, 
     339            System.screen.height / 2, 
     340            "#ACF", "24pt monospace", "center" 
     341        ); 
     342    } 
    256343} 
    257344 
     
    260347 *  Initializer 
    261348 */ 
    262 function initGame(canvas, msg, bossId, bossData, playerData) { 
     349function initGame(canvas, msg, playerData) { 
    263350    System.screen.canvas = canvas; 
    264351    System.message       = msg; 
     
    283370    ); 
    284371 
    285     System.player = new Trooper( 
     372    System.players.push(new Trooper( 
    286373        playerData.name, 
    287374        new ActionList([new ManualAction(new ManualShot())]), 
     
    322409                          playerData.shotlevel + 2, 
    323410                          -0.5)] 
    324     ); 
    325  
    326     var actList = EnemyActionLists[bossData.mtime % EnemyActionLists.length]; 
    327     var shot    = EnemyShots[bossData.hitpoint % EnemyShots.length]; 
    328     var numAct  = bossData.agility       % (EnemyActions.length  - 1) + 1; 
    329     var numBlt  = bossData.skills.length % (EnemyBullets.length  - 1) + 1; 
    330     var numBrrg = bossData.skills.length % (EnemyBarrages.length - 1) + 1; 
    331     var acts    = new Array(); 
    332     var brrgs   = new Array(); 
    333  
    334     var bulletWay         = Math.ceil(bossData.concentration / 10); 
    335     var bulletInterval    = Math.round(50 * 1 / Math.log(bossData.skillpoint + 0.1)); 
    336     var bulletSize        = Math.round(Math.log(bossData.luck + 1)); 
    337     var bulletFrameWidth  = (bulletSize + 5) * 2; 
    338     var bulletFrameHeight = (bulletSize + 5) * 4; 
    339     var bulletSpeed       = bossData.strength / 15; 
    340     bulletSpeed = Math.log(bulletSpeed < 1.5 ? 1.5 : bulletSpeed); 
    341  
    342     setMessage(System.message, ""); 
    343     addMessage(System.message, " bulletWay:" + String(bulletWay) + "<br>"); 
    344     addMessage(System.message, " bulletInterval:" + String(bulletInterval) + "<br>"); 
    345     addMessage(System.message, " bulletSize:" + String(bulletSize) + "<br>"); 
    346     addMessage(System.message, " bulletSpeed:" + String(bulletSpeed) + "<br>"); 
    347  
    348     addMessage(System.message, "ActionsIdx:"); 
    349  
    350     for (var i = 0; i < numAct; i++) { 
    351         var idx = (bossData.agility + i) % EnemyActions.length; 
    352         acts.push(new EnemyActions[idx](new shot())); 
    353  
    354         addMessage(System.message, String(idx) + "(" + 
    355                    String(bossData.hitpoint % EnemyShots.length) + "),"); 
    356     } 
    357  
    358     addMessage(System.message, "<br>"); 
    359  
    360     for (var i = 0; i < numBrrg; i++) { 
    361         var idx     = (bossData.skillpoint + i * (bossData.skills.length + 1)) % EnemyBarrages.length; 
    362         var brrgCls = EnemyBarrages[idx]; 
    363  
    364         addMessage(System.message, 
    365                    "BarragesIdx:" + String(idx) + " / BulletsIdx:"); 
    366  
    367         for (var k = 0; k < numBlt; k++) { 
    368             var iidx = (bossData.skills.length + i + k) % EnemyBullets.length; 
    369             brrgs.push( 
    370                 new brrgCls( 
    371                     EnemyBullets[iidx], 
    372                     bulletSize, 
    373                     "#FF3", 
    374                     {"style": "rect", "color": "rgba(128,32,32,0.5)", 
    375                      "width": bulletFrameWidth, "height": bulletFrameHeight}, 
    376                     bulletInterval, 
    377                     bulletSpeed, 
    378                     bulletWay 
    379                 ) 
    380             ); 
    381  
    382             addMessage(System.message, String(iidx) + ","); 
    383         } 
    384  
    385         addMessage(System.message, "<br>"); 
    386     } 
    387  
    388     var size = Math.ceil((System.screen.width / 2) * (1 / bossData.defense)); 
    389     size = size < playerData.size ? playerData.size : size; 
    390     System.boss = new Trooper( 
    391         bossData.name, 
    392         new actList(acts), 
    393         size, 
    394         size, 
    395         "#F33", 
    396         "#F33", 
    397         System.screen.width / 2, 
    398         System.screen.height / 7, 
    399         System.screen.width, 
    400         System.screen.height, 
    401         bossData.hitpoint, 
    402         Math.log(bossData.agility + 0.1) * 3, 
    403         0, 
    404         ["rgba(255,0,0,0.3)", "rgba(0,0,255,0.3)"], 
    405         brrgs 
    406     ); 
     411    )); 
    407412 
    408413    System.backgroundObject = new Array(); 
Note: See TracChangeset for help on using the changeset viewer.