mirror of
https://github.com/id-Software/wolf3d-browser.git
synced 2024-11-10 07:22:05 +00:00
146 lines
4.7 KiB
JavaScript
146 lines
4.7 KiB
JavaScript
|
/*
|
||
|
* ===========================================================================
|
||
|
*
|
||
|
* 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 <http://www.gnu.org/licenses/>.
|
||
|
*
|
||
|
* 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.
|
||
|
*
|
||
|
* ===========================================================================
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @namespace
|
||
|
* @description Push wall management
|
||
|
*/
|
||
|
Wolf.PushWall = (function() {
|
||
|
|
||
|
var PWall = {};
|
||
|
reset();
|
||
|
|
||
|
function reset() {
|
||
|
PWall.active = false;
|
||
|
PWall.tilesMoved = 0;
|
||
|
PWall.pointsMoved = 0;
|
||
|
PWall.dir = 0;
|
||
|
PWall.x = 0;
|
||
|
PWall.y = 0;
|
||
|
PWall.dx = 0;
|
||
|
PWall.dy = 0;
|
||
|
PWall.texX = 0;
|
||
|
PWall.texY = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
function push(level, x, y, dir) {
|
||
|
var dx, dy;
|
||
|
|
||
|
if (PWall.active) {
|
||
|
return false; // another PWall is moving [only one at a time!]
|
||
|
}
|
||
|
|
||
|
dx = Wolf.Math.dx4dir[dir];
|
||
|
dy = Wolf.Math.dy4dir[dir];
|
||
|
|
||
|
if (level.tileMap[x + dx][y + dy] & (Wolf.SOLID_TILE | Wolf.DOOR_TILE)) {
|
||
|
// noway (smth is blocking)
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// remove secret flag & make everything needed when pushwall used!
|
||
|
level.tileMap[x][y] &= (~Wolf.SECRET_TILE);
|
||
|
level.tileMap[x][y] &= (~Wolf.WALL_TILE);
|
||
|
level.tileMap[x][y] |= Wolf.PUSHWALL_TILE;
|
||
|
|
||
|
if (++level.state.foundSecrets == level.state.totalSecrets) {
|
||
|
Wolf.Game.notify("You found the last secret!");
|
||
|
} else {
|
||
|
Wolf.Game.notify("You found a secret!");
|
||
|
}
|
||
|
|
||
|
Wolf.Sound.startSound(null, null, 1, Wolf.CHAN_AUTO, "sfx/034.wav", 1, Wolf.ATTN_STATIC, 0);
|
||
|
|
||
|
// good way to avoid stuckness; [un]comment one more down!
|
||
|
// it makes a tile behind pushwall unpassable
|
||
|
level.tileMap[x + dx][y + dy] |= Wolf.PUSHWALL_TILE;
|
||
|
level.wallTexX[x + dx][y + dy] = level.wallTexX[x][y];
|
||
|
level.wallTexY[x + dx][y + dy] = level.wallTexY[x][y];
|
||
|
|
||
|
// write down PWall info
|
||
|
PWall.active = true;
|
||
|
PWall.tilesMoved = PWall.pointsMoved = 0;
|
||
|
PWall.dir = dir;
|
||
|
PWall.x = x;
|
||
|
PWall.y = y;
|
||
|
PWall.dx = dx;
|
||
|
PWall.dy = dy;
|
||
|
PWall.texX = level.wallTexX[x][y];
|
||
|
PWall.texY = level.wallTexY[x][y];
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
function process(level, tics) {
|
||
|
if (!PWall.active) {
|
||
|
return; // no active PWall to work with
|
||
|
}
|
||
|
|
||
|
PWall.pointsMoved += tics;
|
||
|
|
||
|
if (PWall.pointsMoved < 128) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
PWall.pointsMoved -= 128;
|
||
|
PWall.tilesMoved++;
|
||
|
// Free tile
|
||
|
level.tileMap[PWall.x][PWall.y] &= (~Wolf.PUSHWALL_TILE);
|
||
|
// Occupy new tile
|
||
|
PWall.x += PWall.dx;
|
||
|
PWall.y += PWall.dy;
|
||
|
|
||
|
// Shall we move further?
|
||
|
if (level.tileMap[PWall.x + PWall.dx][PWall.y + PWall.dy] & (Wolf.SOLID_TILE | Wolf.DOOR_TILE | Wolf.ACTOR_TILE | Wolf.POWERUP_TILE) || PWall.tilesMoved == 3) {
|
||
|
level.tileMap[PWall.x][PWall.y] &= (~Wolf.PUSHWALL_TILE); // wall now
|
||
|
level.tileMap[PWall.x][PWall.y] |= Wolf.WALL_TILE; // wall now
|
||
|
level.wallTexX[PWall.x][PWall.y] = PWall.texX;
|
||
|
level.wallTexY[PWall.x][PWall.y] = PWall.texY;
|
||
|
PWall.active = false; // Free Push Wall
|
||
|
} else {
|
||
|
level.tileMap[PWall.x + PWall.dx][PWall.y + PWall.dy] |= Wolf.PUSHWALL_TILE;
|
||
|
|
||
|
// Not sure if this is right but it fixed an issue with the pushwall texture changing mid-slide.
|
||
|
level.wallTexX[PWall.x + PWall.dx][PWall.y + PWall.dy] = PWall.texX;
|
||
|
level.wallTexY[PWall.x + PWall.dx][PWall.y + PWall.dy] = PWall.texY;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function get() {
|
||
|
return PWall;
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
reset : reset,
|
||
|
process : process,
|
||
|
push : push,
|
||
|
get : get
|
||
|
};
|
||
|
|
||
|
})();
|