/* * =========================================================================== * * Wolf3D Browser Version GPL Source Code * Copyright (C) 2012 id Software LLC, a ZeniMax Media company. * * This file is part of the Wolf3D Browser Version GPL Source Code ("Wolf3D Browser Source Code"). * * Wolf3D Browser Source Code 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. * * Wolf3D Browser Source Code 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 version 2 * along with Wolf3D Browser Source Code. If not, see . * * If you have questions concerning this license, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. * * =========================================================================== */ Wolf.Sprites = (function() { var spriteTextures = []; // // sprite constants // var spriteNames = [ "SPR_DEMO", "SPR_DEATHCAM", // // static sprites // // 002 "SPR_STAT_0", "SPR_STAT_1","SPR_STAT_2", "SPR_STAT_3", "SPR_STAT_4", "SPR_STAT_5","SPR_STAT_6", "SPR_STAT_7", "SPR_STAT_8", "SPR_STAT_9","SPR_STAT_10","SPR_STAT_11", "SPR_STAT_12","SPR_STAT_13","SPR_STAT_14","SPR_STAT_15", "SPR_STAT_16","SPR_STAT_17","SPR_STAT_18","SPR_STAT_19", "SPR_STAT_20","SPR_STAT_21","SPR_STAT_22","SPR_STAT_23", "SPR_STAT_24","SPR_STAT_25","SPR_STAT_26","SPR_STAT_27", "SPR_STAT_28","SPR_STAT_29","SPR_STAT_30","SPR_STAT_31", "SPR_STAT_32","SPR_STAT_33","SPR_STAT_34","SPR_STAT_35", "SPR_STAT_36","SPR_STAT_37","SPR_STAT_38","SPR_STAT_39", "SPR_STAT_40","SPR_STAT_41","SPR_STAT_42","SPR_STAT_43", "SPR_STAT_44","SPR_STAT_45","SPR_STAT_46","SPR_STAT_47", "SPR_STAT_48","SPR_STAT_49","SPR_STAT_50","SPR_STAT_51", // // Guard // // 054 "SPR_GRD_S_1","SPR_GRD_S_2","SPR_GRD_S_3","SPR_GRD_S_4", "SPR_GRD_S_5","SPR_GRD_S_6","SPR_GRD_S_7","SPR_GRD_S_8", "SPR_GRD_W1_1","SPR_GRD_W1_2","SPR_GRD_W1_3","SPR_GRD_W1_4", "SPR_GRD_W1_5","SPR_GRD_W1_6","SPR_GRD_W1_7","SPR_GRD_W1_8", "SPR_GRD_W2_1","SPR_GRD_W2_2","SPR_GRD_W2_3","SPR_GRD_W2_4", "SPR_GRD_W2_5","SPR_GRD_W2_6","SPR_GRD_W2_7","SPR_GRD_W2_8", "SPR_GRD_W3_1","SPR_GRD_W3_2","SPR_GRD_W3_3","SPR_GRD_W3_4", "SPR_GRD_W3_5","SPR_GRD_W3_6","SPR_GRD_W3_7","SPR_GRD_W3_8", "SPR_GRD_W4_1","SPR_GRD_W4_2","SPR_GRD_W4_3","SPR_GRD_W4_4", "SPR_GRD_W4_5","SPR_GRD_W4_6","SPR_GRD_W4_7","SPR_GRD_W4_8", "SPR_GRD_PAIN_1","SPR_GRD_DIE_1","SPR_GRD_DIE_2","SPR_GRD_DIE_3", "SPR_GRD_PAIN_2","SPR_GRD_DEAD", "SPR_GRD_SHOOT1","SPR_GRD_SHOOT2","SPR_GRD_SHOOT3", // // Dog // // 103 "SPR_DOG_W1_1","SPR_DOG_W1_2","SPR_DOG_W1_3","SPR_DOG_W1_4", "SPR_DOG_W1_5","SPR_DOG_W1_6","SPR_DOG_W1_7","SPR_DOG_W1_8", "SPR_DOG_W2_1","SPR_DOG_W2_2","SPR_DOG_W2_3","SPR_DOG_W2_4", "SPR_DOG_W2_5","SPR_DOG_W2_6","SPR_DOG_W2_7","SPR_DOG_W2_8", "SPR_DOG_W3_1","SPR_DOG_W3_2","SPR_DOG_W3_3","SPR_DOG_W3_4", "SPR_DOG_W3_5","SPR_DOG_W3_6","SPR_DOG_W3_7","SPR_DOG_W3_8", "SPR_DOG_W4_1","SPR_DOG_W4_2","SPR_DOG_W4_3","SPR_DOG_W4_4", "SPR_DOG_W4_5","SPR_DOG_W4_6","SPR_DOG_W4_7","SPR_DOG_W4_8", "SPR_DOG_DIE_1","SPR_DOG_DIE_2","SPR_DOG_DIE_3","SPR_DOG_DEAD", "SPR_DOG_JUMP1","SPR_DOG_JUMP2","SPR_DOG_JUMP3", // // SS // // 142 "SPR_SS_S_1","SPR_SS_S_2","SPR_SS_S_3","SPR_SS_S_4", "SPR_SS_S_5","SPR_SS_S_6","SPR_SS_S_7","SPR_SS_S_8", "SPR_SS_W1_1","SPR_SS_W1_2","SPR_SS_W1_3","SPR_SS_W1_4", "SPR_SS_W1_5","SPR_SS_W1_6","SPR_SS_W1_7","SPR_SS_W1_8", "SPR_SS_W2_1","SPR_SS_W2_2","SPR_SS_W2_3","SPR_SS_W2_4", "SPR_SS_W2_5","SPR_SS_W2_6","SPR_SS_W2_7","SPR_SS_W2_8", "SPR_SS_W3_1","SPR_SS_W3_2","SPR_SS_W3_3","SPR_SS_W3_4", "SPR_SS_W3_5","SPR_SS_W3_6","SPR_SS_W3_7","SPR_SS_W3_8", "SPR_SS_W4_1","SPR_SS_W4_2","SPR_SS_W4_3","SPR_SS_W4_4", "SPR_SS_W4_5","SPR_SS_W4_6","SPR_SS_W4_7","SPR_SS_W4_8", "SPR_SS_PAIN_1","SPR_SS_DIE_1","SPR_SS_DIE_2","SPR_SS_DIE_3", "SPR_SS_PAIN_2","SPR_SS_DEAD", "SPR_SS_SHOOT1","SPR_SS_SHOOT2","SPR_SS_SHOOT3", // // Mutant // // 191 "SPR_MUT_S_1","SPR_MUT_S_2","SPR_MUT_S_3","SPR_MUT_S_4", "SPR_MUT_S_5","SPR_MUT_S_6","SPR_MUT_S_7","SPR_MUT_S_8", "SPR_MUT_W1_1","SPR_MUT_W1_2","SPR_MUT_W1_3","SPR_MUT_W1_4", "SPR_MUT_W1_5","SPR_MUT_W1_6","SPR_MUT_W1_7","SPR_MUT_W1_8", "SPR_MUT_W2_1","SPR_MUT_W2_2","SPR_MUT_W2_3","SPR_MUT_W2_4", "SPR_MUT_W2_5","SPR_MUT_W2_6","SPR_MUT_W2_7","SPR_MUT_W2_8", "SPR_MUT_W3_1","SPR_MUT_W3_2","SPR_MUT_W3_3","SPR_MUT_W3_4", "SPR_MUT_W3_5","SPR_MUT_W3_6","SPR_MUT_W3_7","SPR_MUT_W3_8", "SPR_MUT_W4_1","SPR_MUT_W4_2","SPR_MUT_W4_3","SPR_MUT_W4_4", "SPR_MUT_W4_5","SPR_MUT_W4_6","SPR_MUT_W4_7","SPR_MUT_W4_8", "SPR_MUT_PAIN_1","SPR_MUT_DIE_1","SPR_MUT_DIE_2","SPR_MUT_DIE_3", "SPR_MUT_PAIN_2","SPR_MUT_DIE_4","SPR_MUT_DEAD", "SPR_MUT_SHOOT1","SPR_MUT_SHOOT2","SPR_MUT_SHOOT3","SPR_MUT_SHOOT4", // // Officer // // 242 "SPR_OFC_S_1","SPR_OFC_S_2","SPR_OFC_S_3","SPR_OFC_S_4", "SPR_OFC_S_5","SPR_OFC_S_6","SPR_OFC_S_7","SPR_OFC_S_8", "SPR_OFC_W1_1","SPR_OFC_W1_2","SPR_OFC_W1_3","SPR_OFC_W1_4", "SPR_OFC_W1_5","SPR_OFC_W1_6","SPR_OFC_W1_7","SPR_OFC_W1_8", "SPR_OFC_W2_1","SPR_OFC_W2_2","SPR_OFC_W2_3","SPR_OFC_W2_4", "SPR_OFC_W2_5","SPR_OFC_W2_6","SPR_OFC_W2_7","SPR_OFC_W2_8", "SPR_OFC_W3_1","SPR_OFC_W3_2","SPR_OFC_W3_3","SPR_OFC_W3_4", "SPR_OFC_W3_5","SPR_OFC_W3_6","SPR_OFC_W3_7","SPR_OFC_W3_8", "SPR_OFC_W4_1","SPR_OFC_W4_2","SPR_OFC_W4_3","SPR_OFC_W4_4", "SPR_OFC_W4_5","SPR_OFC_W4_6","SPR_OFC_W4_7","SPR_OFC_W4_8", "SPR_OFC_PAIN_1","SPR_OFC_DIE_1","SPR_OFC_DIE_2","SPR_OFC_DIE_3", "SPR_OFC_PAIN_2","SPR_OFC_DIE_4","SPR_OFC_DEAD", "SPR_OFC_SHOOT1","SPR_OFC_SHOOT2","SPR_OFC_SHOOT3", // // Ghosts // // 292 "SPR_BLINKY_W1","SPR_BLINKY_W2","SPR_PINKY_W1","SPR_PINKY_W2", "SPR_CLYDE_W1","SPR_CLYDE_W2","SPR_INKY_W1","SPR_INKY_W2", // // Hans // // 300 "SPR_BOSS_W1","SPR_BOSS_W2","SPR_BOSS_W3","SPR_BOSS_W4", "SPR_BOSS_SHOOT1","SPR_BOSS_SHOOT2","SPR_BOSS_SHOOT3","SPR_BOSS_DEAD", "SPR_BOSS_DIE1","SPR_BOSS_DIE2","SPR_BOSS_DIE3", // // Schabbs // // 311 "SPR_SCHABB_W1","SPR_SCHABB_W2","SPR_SCHABB_W3","SPR_SCHABB_W4", "SPR_SCHABB_SHOOT1","SPR_SCHABB_SHOOT2", "SPR_SCHABB_DIE1","SPR_SCHABB_DIE2","SPR_SCHABB_DIE3","SPR_SCHABB_DEAD", "SPR_HYPO1","SPR_HYPO2","SPR_HYPO3","SPR_HYPO4", // // Fake // // 325 "SPR_FAKE_W1","SPR_FAKE_W2","SPR_FAKE_W3","SPR_FAKE_W4", "SPR_FAKE_SHOOT","SPR_FIRE1","SPR_FIRE2", "SPR_FAKE_DIE1","SPR_FAKE_DIE2","SPR_FAKE_DIE3","SPR_FAKE_DIE4", "SPR_FAKE_DIE5","SPR_FAKE_DEAD", // // Hitler // // 338 "SPR_MECHA_W1","SPR_MECHA_W2","SPR_MECHA_W3","SPR_MECHA_W4", "SPR_MECHA_SHOOT1","SPR_MECHA_SHOOT2","SPR_MECHA_SHOOT3","SPR_MECHA_DEAD", "SPR_MECHA_DIE1","SPR_MECHA_DIE2","SPR_MECHA_DIE3", "SPR_HITLER_W1","SPR_HITLER_W2","SPR_HITLER_W3","SPR_HITLER_W4", "SPR_HITLER_SHOOT1","SPR_HITLER_SHOOT2","SPR_HITLER_SHOOT3","SPR_HITLER_DEAD", "SPR_HITLER_DIE1","SPR_HITLER_DIE2","SPR_HITLER_DIE3","SPR_HITLER_DIE4", "SPR_HITLER_DIE5","SPR_HITLER_DIE6","SPR_HITLER_DIE7", // // Giftmacher // // 364 "SPR_GIFT_W1","SPR_GIFT_W2","SPR_GIFT_W3","SPR_GIFT_W4", "SPR_GIFT_SHOOT1","SPR_GIFT_SHOOT2", "SPR_GIFT_DIE1","SPR_GIFT_DIE2","SPR_GIFT_DIE3","SPR_GIFT_DEAD", // // Rocket, smoke and small explosion // // 374 "SPR_ROCKET_1","SPR_ROCKET_2","SPR_ROCKET_3","SPR_ROCKET_4", "SPR_ROCKET_5","SPR_ROCKET_6","SPR_ROCKET_7","SPR_ROCKET_8", "SPR_SMOKE_1","SPR_SMOKE_2","SPR_SMOKE_3","SPR_SMOKE_4", "SPR_BOOM_1","SPR_BOOM_2","SPR_BOOM_3", // // Angel of Death's DeathSparks(tm) // // 389 "SPR_HROCKET_1","SPR_HROCKET_2","SPR_HROCKET_3","SPR_HROCKET_4", "SPR_HROCKET_5","SPR_HROCKET_6","SPR_HROCKET_7","SPR_HROCKET_8", "SPR_HSMOKE_1","SPR_HSMOKE_2","SPR_HSMOKE_3","SPR_HSMOKE_4", "SPR_HBOOM_1","SPR_HBOOM_2","SPR_HBOOM_3", "SPR_SPARK1","SPR_SPARK2","SPR_SPARK3","SPR_SPARK4", // // Gretel // // 408 "SPR_GRETEL_W1","SPR_GRETEL_W2","SPR_GRETEL_W3","SPR_GRETEL_W4", "SPR_GRETEL_SHOOT1","SPR_GRETEL_SHOOT2","SPR_GRETEL_SHOOT3","SPR_GRETEL_DEAD", "SPR_GRETEL_DIE1","SPR_GRETEL_DIE2","SPR_GRETEL_DIE3", // // Fat Face // // 419 "SPR_FAT_W1","SPR_FAT_W2","SPR_FAT_W3","SPR_FAT_W4", "SPR_FAT_SHOOT1","SPR_FAT_SHOOT2","SPR_FAT_SHOOT3","SPR_FAT_SHOOT4", "SPR_FAT_DIE1","SPR_FAT_DIE2","SPR_FAT_DIE3","SPR_FAT_DEAD", // // bj // // 431 "SPR_BJ_W1","SPR_BJ_W2","SPR_BJ_W3","SPR_BJ_W4", "SPR_BJ_JUMP1","SPR_BJ_JUMP2","SPR_BJ_JUMP3","SPR_BJ_JUMP4", // // SPEAR OF DESTINY // // // Trans Grosse // // 439 "SPR_TRANS_W1","SPR_TRANS_W2","SPR_TRANS_W3","SPR_TRANS_W4", "SPR_TRANS_SHOOT1","SPR_TRANS_SHOOT2","SPR_TRANS_SHOOT3","SPR_TRANS_DEAD", "SPR_TRANS_DIE1","SPR_TRANS_DIE2","SPR_TRANS_DIE3", // // Wilhelm // // 450 "SPR_WILL_W1","SPR_WILL_W2","SPR_WILL_W3","SPR_WILL_W4", "SPR_WILL_SHOOT1","SPR_WILL_SHOOT2","SPR_WILL_SHOOT3","SPR_WILL_SHOOT4", "SPR_WILL_DIE1","SPR_WILL_DIE2","SPR_WILL_DIE3","SPR_WILL_DEAD", // // UberMutant // // 462 "SPR_UBER_W1","SPR_UBER_W2","SPR_UBER_W3","SPR_UBER_W4", "SPR_UBER_SHOOT1","SPR_UBER_SHOOT2","SPR_UBER_SHOOT3","SPR_UBER_SHOOT4", "SPR_UBER_DIE1","SPR_UBER_DIE2","SPR_UBER_DIE3","SPR_UBER_DIE4", "SPR_UBER_DEAD", // // Death Knight // // 475 "SPR_DEATH_W1","SPR_DEATH_W2","SPR_DEATH_W3","SPR_DEATH_W4", "SPR_DEATH_SHOOT1","SPR_DEATH_SHOOT2","SPR_DEATH_SHOOT3","SPR_DEATH_SHOOT4", "SPR_DEATH_DIE1","SPR_DEATH_DIE2","SPR_DEATH_DIE3","SPR_DEATH_DIE4", "SPR_DEATH_DIE5","SPR_DEATH_DIE6","SPR_DEATH_DEAD", // // Ghost // // 490 "SPR_SPECTRE_W1","SPR_SPECTRE_W2","SPR_SPECTRE_W3","SPR_SPECTRE_W4", "SPR_SPECTRE_F1","SPR_SPECTRE_F2","SPR_SPECTRE_F3","SPR_SPECTRE_F4", // // Angel of Death // // 498 "SPR_ANGEL_W1","SPR_ANGEL_W2","SPR_ANGEL_W3","SPR_ANGEL_W4", "SPR_ANGEL_SHOOT1","SPR_ANGEL_SHOOT2","SPR_ANGEL_TIRED1","SPR_ANGEL_TIRED2", "SPR_ANGEL_DIE1","SPR_ANGEL_DIE2","SPR_ANGEL_DIE3","SPR_ANGEL_DIE4", "SPR_ANGEL_DIE5","SPR_ANGEL_DIE6","SPR_ANGEL_DIE7","SPR_ANGEL_DEAD", // // player attack frames // // 514 "SPR_KNIFEREADY","SPR_KNIFEATK1","SPR_KNIFEATK2","SPR_KNIFEATK3", "SPR_KNIFEATK4", "SPR_PISTOLREADY","SPR_PISTOLATK1","SPR_PISTOLATK2","SPR_PISTOLATK3", "SPR_PISTOLATK4", "SPR_MACHINEGUNREADY","SPR_MACHINEGUNATK1","SPR_MACHINEGUNATK2","MACHINEGUNATK3", "SPR_MACHINEGUNATK4", "SPR_CHAINREADY","SPR_CHAINATK1","SPR_CHAINATK2","SPR_CHAINATK3", "SPR_CHAINATK4" ]; var spriteConsts = {}; for (var i=0,n=spriteNames.length;i>TILESHIFT) // but also (x>>TILESHIFT)-1 if (x%TILEWIDTH)= Wolf.MAX_SPRITES) { Wolf.log("Warning n_of_sprt == MAX_SPRITES"); return -1; } */ Wolf.Renderer.loadSprite(newSprite); level.sprites.push(newSprite); return newSprite; //level.numSprites++ //return level.numSprites-1; } function setPos(level, sprite, x, y, angle) { /* if (sprite_id == -1) { return; } */ //var sprite = level.sprites[sprite_id]; sprite.x = x; sprite.y = y; sprite.angle = angle; sprite.tile.x = Wolf.POS2TILE( x ); sprite.tile.y = Wolf.POS2TILE( y ); sprite.flags |= Wolf.SPRT_CHG_POS; if (!(x & Wolf.HALFTILE)) { // (x%TILEGLOBAL>=HALFTILE) sprite.tile.x--; } if (!(y & Wolf.HALFTILE)) { sprite.tile.y--; } } function setTex(level, sprite, index, tex) { /* if (sprite_id == -1) { return; } */ //cacheTextures(tex, tex); if (index == -1) { // one texture for each phase sprite.tex[0] = tex; sprite.flags |= Wolf.SPRT_ONE_TEX; } else { sprite.tex[index] = tex; } sprite.flags |= Wolf.SPRT_CHG_TEX; } function cacheTextures(start, end) { var i, texname; for( i = start ; i <= end ; ++i ) { if (!spriteTextures[i]) { //texname = "sprites/" + () + ".png"; //spriteTextures[i] = TM_FindTexture( texname, TT_Sprite ); } } } function getTexture(id) { return sheets[id]; } function createVisList(viewport, level, visibleTiles) { var tx, ty, n, num, numVisible, vislist, sprt; vislist = []; numVisible = 0; for (n=0, num=level.sprites.length; n < num; ++n) { sprt = level.sprites[n]; if (sprt.flags & Wolf.SPRT_REMOVE) { continue; } tx = sprt.tile.x; ty = sprt.tile.y; if (tx > 63) { tx = 63; } if (ty > 63) { ty = 63; } // can be in any of 4 surrounding tiles; not 9 - see definition of tilex & tiley if (visibleTiles[tx][ty] || visibleTiles[tx + 1][ty] || visibleTiles[tx][ty + 1] || visibleTiles[tx + 1][ty + 1]) { // player spoted it var vis = vislist[vislist.length] = {}; vis.dist = Wolf.Math.lineLen2Point(sprt.x - viewport.x, sprt.y - viewport.y, viewport.angle); vis.x = sprt.x; vis.y = sprt.y; vis.angle = sprt.angle; vis.tex = sprt.tex[0]; //FIXME! vis.sprite = sprt; if(++numVisible > Wolf.MAX_VIS_SPRITES) { break; // vislist full } } } // sorting list if (numVisible) { // do not sort if no entries //vislist.sort(); //qsort( vislist, numVisible, sizeof( visobj_t ), Sprite_cmpVis ); } return vislist; } function remove(level, sprite) { if (!sprite) { return; } sprite.flags |= Wolf.SPRT_REMOVE; Wolf.Renderer.unloadSprite(sprite); } function clean(level) { var i, num, liveSprites = []; for (i=0, num=level.sprites.length; i < num; ++i) { if (level.sprites[i].flags & Wolf.SPRT_REMOVE) { continue; } liveSprites.push(level.sprites[i]); } level.sprites = liveSprites; } return { getNewSprite : getNewSprite, setPos : setPos, setTex : setTex, cacheTextures : cacheTextures, getTexture : getTexture, createVisList : createVisList, remove : remove, clean : clean }; })();