Files
scummvm-cursorfix/engines/scumm/he/basketball/collision/bball_collision_shields.cpp
2026-02-02 04:50:13 +01:00

251 lines
8.6 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program 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 3 of the License, or
* (at your option) any later version.
*
* This program 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "scumm/he/intern_he.h"
#include "scumm/he/basketball/geo_translations.h"
#include "scumm/he/basketball/court.h"
#include "scumm/he/basketball/collision/bball_collision_support_obj.h"
#include "scumm/he/basketball/collision/bball_collision_object.h"
#include "scumm/he/basketball/collision/bball_collision_sphere.h"
#include "scumm/he/basketball/collision/bball_collision_box.h"
#include "scumm/he/basketball/collision/bball_collision_cylinder.h"
#include "scumm/he/basketball/collision/bball_collision_stack.h"
#include "scumm/he/basketball/collision/bball_collision_node.h"
#include "scumm/he/basketball/collision/bball_collision_tree.h"
#include "scumm/he/basketball/collision/bball_collision_shields.h"
namespace Scumm {
CCollisionShieldVector::CCollisionShieldVector() : _shieldUpCount(0) {
CCollisionBox westShield;
CCollisionBox northShield;
CCollisionBox eastShield;
CCollisionBox southShield;
CCollisionBox topShield;
CCollisionBox westShield2;
CCollisionBox northShield2;
CCollisionBox eastShield2;
CCollisionBox southShield2;
westShield.minPoint.x = 0 - SHIELD_DEPTH;
westShield.maxPoint.x = 0;
westShield.minPoint.y = 0 - SHIELD_EXTENSION;
westShield.maxPoint.y = MAX_WORLD_Y + SHIELD_EXTENSION;
westShield.minPoint.z = 0;
westShield.maxPoint.z = SHIELD_HEIGHT;
westShield._description = "West Shield";
westShield._collisionEfficiency = 0.5F;
westShield._friction = 0.3F;
westShield._objectID = WEST_SHIELD_ID;
westShield._ignore = true;
westShield2.minPoint.x = 0 - SHIELD_DEPTH - BUFFER_WIDTH;
westShield2.maxPoint.x = 0 - BUFFER_WIDTH;
westShield2.minPoint.y = 0 - SHIELD_EXTENSION;
westShield2.maxPoint.y = MAX_WORLD_Y + SHIELD_EXTENSION;
westShield2.minPoint.z = 0;
westShield2.maxPoint.z = SHIELD_HEIGHT;
westShield2._description = "West Shield 2";
westShield2._collisionEfficiency = 0.5F;
westShield2._friction = 0.3F;
westShield2._objectID = BACKUP_WEST_SHIELD_ID;
westShield2._ignore = true;
northShield.minPoint.x = 0 - SHIELD_EXTENSION;
northShield.maxPoint.x = MAX_WORLD_X + SHIELD_EXTENSION;
northShield.minPoint.y = MAX_WORLD_Y;
northShield.maxPoint.y = MAX_WORLD_Y + SHIELD_DEPTH;
northShield.minPoint.z = 0;
northShield.maxPoint.z = SHIELD_HEIGHT;
northShield._description = "North Shield";
northShield._collisionEfficiency = 0.5F;
northShield._friction = 0.3F;
northShield._objectID = NORTH_SHIELD_ID;
northShield._ignore = true;
northShield2.minPoint.x = 0 - SHIELD_EXTENSION;
northShield2.maxPoint.x = MAX_WORLD_X + SHIELD_EXTENSION;
northShield2.minPoint.y = MAX_WORLD_Y + BUFFER_WIDTH;
northShield2.maxPoint.y = MAX_WORLD_Y + SHIELD_DEPTH + BUFFER_WIDTH;
northShield2.minPoint.z = 0;
northShield2.maxPoint.z = SHIELD_HEIGHT;
northShield2._description = "North Shield 2";
northShield2._collisionEfficiency = 0.5F;
northShield2._friction = 0.3F;
northShield2._objectID = BACKUP_NORTH_SHIELD_ID;
northShield2._ignore = true;
eastShield.minPoint.x = MAX_WORLD_X;
eastShield.maxPoint.x = MAX_WORLD_X + SHIELD_DEPTH;
eastShield.minPoint.y = 0 - SHIELD_EXTENSION;
eastShield.maxPoint.y = MAX_WORLD_Y + SHIELD_EXTENSION;
eastShield.minPoint.z = 0;
eastShield.maxPoint.z = SHIELD_HEIGHT;
eastShield._description = "East Shield";
eastShield._collisionEfficiency = 0.5F;
eastShield._friction = 0.3F;
eastShield._objectID = EAST_SHIELD_ID;
eastShield._ignore = true;
eastShield2.minPoint.x = MAX_WORLD_X + BUFFER_WIDTH;
eastShield2.maxPoint.x = MAX_WORLD_X + SHIELD_DEPTH + BUFFER_WIDTH;
eastShield2.minPoint.y = 0 - SHIELD_EXTENSION;
eastShield2.maxPoint.y = MAX_WORLD_Y + SHIELD_EXTENSION;
eastShield2.minPoint.z = 0;
eastShield2.maxPoint.z = SHIELD_HEIGHT;
eastShield2._description = "East Shield 2";
eastShield2._collisionEfficiency = 0.5F;
eastShield2._friction = 0.3F;
eastShield2._objectID = BACKUP_EAST_SHIELD_ID;
eastShield2._ignore = true;
southShield.minPoint.x = 0 - SHIELD_EXTENSION;
southShield.maxPoint.x = MAX_WORLD_X + SHIELD_EXTENSION;
southShield.minPoint.y = 0 - SHIELD_DEPTH;
southShield.maxPoint.y = 0;
southShield.minPoint.z = 0;
southShield.maxPoint.z = SHIELD_HEIGHT;
southShield._description = "South Shield";
southShield._collisionEfficiency = 0.5F;
southShield._friction = 0.3F;
southShield._objectID = SOUTH_SHIELD_ID;
southShield._ignore = true;
southShield2.minPoint.x = 0 - SHIELD_EXTENSION;
southShield2.maxPoint.x = MAX_WORLD_X + SHIELD_EXTENSION;
southShield2.minPoint.y = 0 - SHIELD_DEPTH - BUFFER_WIDTH;
southShield2.maxPoint.y = 0 - BUFFER_WIDTH;
southShield2.minPoint.z = 0;
southShield2.maxPoint.z = SHIELD_HEIGHT;
southShield2._description = "South Shield 2";
southShield2._collisionEfficiency = 0.5F;
southShield2._friction = 0.3F;
southShield2._objectID = BACKUP_SOUTH_SHIELD_ID;
southShield2._ignore = true;
topShield.minPoint.x = 0 - SHIELD_EXTENSION;
topShield.maxPoint.x = MAX_WORLD_X + SHIELD_EXTENSION;
topShield.minPoint.y = 0 - SHIELD_EXTENSION;
topShield.maxPoint.y = MAX_WORLD_Y + SHIELD_EXTENSION;
topShield.minPoint.z = SHIELD_HEIGHT;
topShield.maxPoint.z = SHIELD_HEIGHT + SHIELD_DEPTH;
topShield._description = "Top Shield";
topShield._collisionEfficiency = 0.5F;
topShield._friction = 0.3F;
topShield._objectID = TOP_SHIELD_ID;
topShield._ignore = true;
push_back(westShield);
push_back(northShield);
push_back(eastShield);
push_back(southShield);
push_back(topShield);
push_back(westShield2);
push_back(northShield2);
push_back(eastShield2);
push_back(southShield2);
}
CCollisionShieldVector::~CCollisionShieldVector() {
CCollisionShieldVector::iterator shieldIt;
for (shieldIt = begin(); shieldIt != end(); ++shieldIt) {
shieldIt->_ignore = true;
}
}
int LogicHEBasketball::u32_userRaiseShields(int shieldID) {
assert(shieldID < MAX_SHIELD_COUNT || shieldID == ALL_SHIELD_ID);
CCollisionShieldVector::iterator shieldIt;
for (shieldIt = _vm->_basketball->_shields->begin(); shieldIt != _vm->_basketball->_shields->end(); ++shieldIt) {
// Make sure we don't mess with the backup shields...
if (shieldIt->_objectID < MAX_SHIELD_COUNT) {
if (((shieldIt->_objectID == shieldID) || (shieldID == ALL_SHIELD_ID)) &&
(shieldIt->_ignore == true)) {
shieldIt->_ignore = false;
++_vm->_basketball->_shields->_shieldUpCount;
}
}
}
if (shieldID == ALL_SHIELD_ID) {
assert(_vm->_basketball->_shields->_shieldUpCount == MAX_SHIELD_COUNT);
}
return 1;
}
int LogicHEBasketball::u32_userLowerShields(int shieldID) {
assert(shieldID < MAX_SHIELD_COUNT || shieldID == ALL_SHIELD_ID);
CCollisionShieldVector::iterator shieldIt;
for (shieldIt = _vm->_basketball->_shields->begin(); shieldIt != _vm->_basketball->_shields->end(); ++shieldIt) {
// Make sure we don't mess with the backup shields...
if (shieldIt->_objectID < MAX_SHIELD_COUNT) {
if (((shieldIt->_objectID == shieldID) || (shieldID == ALL_SHIELD_ID)) &&
(shieldIt->_ignore == false)) {
shieldIt->_ignore = true;
--_vm->_basketball->_shields->_shieldUpCount;
}
}
}
if (shieldID == ALL_SHIELD_ID) {
assert(_vm->_basketball->_shields->_shieldUpCount == 0);
}
return 1;
}
int LogicHEBasketball::u32_userAreShieldsClear() {
int shieldsAreClear = (_vm->_basketball->_shields->_shieldUpCount != MAX_SHIELD_COUNT);
writeScummVar(_vm1->VAR_U32_USER_VAR_A, shieldsAreClear);
return 1;
}
int LogicHEBasketball::u32_userShieldPlayer(int playerID, int shieldRadius) {
CCollisionPlayer *player = _vm->_basketball->_court->getPlayerPtr(playerID);
if (player->_shieldRadius < shieldRadius) {
player->_shieldRadius += PLAYER_SHIELD_INCREMENT_VALUE;
player->radius += PLAYER_SHIELD_INCREMENT_VALUE;
}
return 1;
}
int LogicHEBasketball::u32_userClearPlayerShield(int playerID) {
CCollisionPlayer *player = _vm->_basketball->_court->getPlayerPtr(playerID);
player->radius -= player->_shieldRadius;
player->_shieldRadius = 0.0F;
return 1;
}
} // End of namespace Scumm