Initial commit
This commit is contained in:
@@ -0,0 +1,250 @@
|
||||
/* 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
|
||||
Reference in New Issue
Block a user