/* 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 . * */ #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