This commit is contained in:
Daveo 2001-05-25 18:43:47 +00:00
parent 5b785068c2
commit fa5105d783
96 changed files with 550 additions and 406 deletions

View file

@ -215,7 +215,6 @@ void CNpcAnemone1Enemy::processClose( int _frames )
CProjectile *projectile; CProjectile *projectile;
projectile = new( "test projectile" ) CProjectile; projectile = new( "test projectile" ) CProjectile;
projectile->init( Pos, m_heading ); projectile->init( Pos, m_heading );
projectile->setLayerCollision( m_layerCollision );
m_controlFunc = NPC_CONTROL_MOVEMENT; m_controlFunc = NPC_CONTROL_MOVEMENT;
m_timerTimer = GameState::getOneSecondInFrames(); m_timerTimer = GameState::getOneSecondInFrames();
@ -240,9 +239,6 @@ void CNpcAnemone2Enemy::postInit()
m_scaleY = ONE; m_scaleY = ONE;
m_radius = 0; m_radius = 0;
m_spriteBank=new ("projectile sprites") SpriteBank();
m_spriteBank->load(SPRITES_SPRITES_SPR);
} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -435,7 +431,6 @@ void CNpcAnemone2Enemy::processClose( int _frames )
projectile = new( "anemone lev2 projectile" ) CProjectile; projectile = new( "anemone lev2 projectile" ) CProjectile;
projectile->init( spikePos, heading, CProjectile::PROJECTILE_DUMBFIRE, CProjectile::PROJECTILE_FINITE_LIFE ); projectile->init( spikePos, heading, CProjectile::PROJECTILE_DUMBFIRE, CProjectile::PROJECTILE_FINITE_LIFE );
projectile->setLayerCollision( m_layerCollision );
projectile->setState( CProjectile::PROJECTILE_ATTACK ); projectile->setState( CProjectile::PROJECTILE_ATTACK );
projectile->setSpeed( 5 ); projectile->setSpeed( 5 );
} }
@ -527,16 +522,16 @@ void CNpcAnemone2Enemy::render()
int x,y; int x,y;
int scrnWidth = VidGetScrW(); int scrnWidth = VidGetScrW();
int scrnHeight = VidGetScrH(); int scrnHeight = VidGetScrH();
int spriteWidth = m_spriteBank->getFrameWidth(FRM__SPIKE); int spriteWidth = CGameScene::getSpriteBank()->getFrameWidth(FRM__SPIKE);
int spriteHeight = m_spriteBank->getFrameHeight(FRM__SPIKE); int spriteHeight = CGameScene::getSpriteBank()->getFrameHeight(FRM__SPIKE);
offset = CLevel::getCameraPos(); offset = CLevel::getCameraPos();
x = spikePos.vx - offset.vx; x = spikePos.vx - offset.vx;
y = spikePos.vy - offset.vy; y = spikePos.vy - offset.vy;
frameHdr = m_spriteBank->getFrameHeader( FRM__SPIKE ); frameHdr = CGameScene::getSpriteBank()->getFrameHeader( FRM__SPIKE );
m_spriteBank->printRotatedScaledSprite( frameHdr, x, y, 4096, 4096, heading, 10 ); CGameScene::getSpriteBank()->printRotatedScaledSprite( frameHdr, x, y, 4096, 4096, heading, 10 );
} }
DVECTOR &renderPos=getRenderPos(); DVECTOR &renderPos=getRenderPos();
@ -576,7 +571,6 @@ void CNpcAnemone3Enemy::processClose( int _frames )
CProjectile::PROJECTILE_GAS_CLOUD, CProjectile::PROJECTILE_GAS_CLOUD,
CProjectile::PROJECTILE_FINITE_LIFE, CProjectile::PROJECTILE_FINITE_LIFE,
lifetime * GameState::getOneSecondInFrames() ); lifetime * GameState::getOneSecondInFrames() );
projectile->setLayerCollision( m_layerCollision );
m_controlFunc = NPC_CONTROL_MOVEMENT; m_controlFunc = NPC_CONTROL_MOVEMENT;
m_timerFunc = NPC_TIMER_ATTACK_DONE; m_timerFunc = NPC_TIMER_ATTACK_DONE;

View file

@ -69,7 +69,7 @@ void CNpcBallBlobEnemy::processMovement( int _frames )
moveY = ( m_velocity.vy >> 8 ) * _frames; moveY = ( m_velocity.vy >> 8 ) * _frames;
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx + moveX, Pos.vy + moveY, 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx + moveX, Pos.vy + moveY, 16 );
if ( groundHeight < 0 ) if ( groundHeight < 0 )
{ {

View file

@ -51,7 +51,7 @@ void CNpcButterflyBackgroundEnemy::render()
{ {
DVECTOR &renderPos=getRenderPos(); DVECTOR &renderPos=getRenderPos();
SprFrame = m_spriteBank->printFT4(FRM_BUTTERFLY_FLAP01 + ( m_frame >> 8 ),renderPos.vx,renderPos.vy,!m_reversed,0,15); SprFrame = CGameScene::getSpriteBank()->printFT4(FRM_BUTTERFLY_FLAP01 + ( m_frame >> 8 ),renderPos.vx,renderPos.vy,!m_reversed,0,15);
setRGB0( SprFrame, 255, 128, 255 ); // Let me know if these change! ALso ket me know when the different coloured ones go in pls! (pkg) setRGB0( SprFrame, 255, 128, 255 ); // Let me know if these change! ALso ket me know when the different coloured ones go in pls! (pkg)
// get xmax, xmin, ymax, ymin // get xmax, xmin, ymax, ymin

View file

@ -133,7 +133,7 @@ void CNpcIronDogfishEnemy::processWalkToUser( int _frames, int speed )
s32 fallSpeed = 3; s32 fallSpeed = 3;
s8 yMovement = fallSpeed * _frames; s8 yMovement = fallSpeed * _frames;
s32 groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); s32 groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {
@ -208,7 +208,6 @@ void CNpcIronDogfishEnemy::processStandardIronDogfishAttack( int _frames )
DVECTOR startPos = Pos; DVECTOR startPos = Pos;
startPos.vy -= 20; startPos.vy -= 20;
projectile->init( startPos, headingToPlayer ); projectile->init( startPos, headingToPlayer );
projectile->setLayerCollision( m_layerCollision );
m_state++; m_state++;

View file

@ -69,7 +69,7 @@ void CNpcDustDevilEnemy::processMovement( int _frames )
{ {
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {
@ -91,7 +91,7 @@ void CNpcDustDevilEnemy::processMovement( int _frames )
distX = distX / abs( distX ); distX = distX / abs( distX );
if ( m_layerCollision->getHeightFromGround( Pos.vx + ( distX * m_speed * _frames ), Pos.vy ) < -maxHeight ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( distX * m_speed * _frames ), Pos.vy ) < -maxHeight )
{ {
// there is an obstacle in the way, increment the path point (hopefully this will resolve the problem) // there is an obstacle in the way, increment the path point (hopefully this will resolve the problem)
@ -101,7 +101,7 @@ void CNpcDustDevilEnemy::processMovement( int _frames )
{ {
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {
@ -135,8 +135,8 @@ void CNpcDustDevilEnemy::processMovementModifier( int _frames, s32 distX, s32 di
testPos1.vx -= 10; testPos1.vx -= 10;
testPos2.vx += 10; testPos2.vx += 10;
testPos1.vy += m_layerCollision->getHeightFromGround( testPos1.vx, testPos1.vy, 16 ); testPos1.vy += CGameScene::getCollision()->getHeightFromGround( testPos1.vx, testPos1.vy, 16 );
testPos2.vy += m_layerCollision->getHeightFromGround( testPos2.vx, testPos2.vy, 16 ); testPos2.vy += CGameScene::getCollision()->getHeightFromGround( testPos2.vx, testPos2.vy, 16 );
s32 xDist = testPos2.vx - testPos1.vx; s32 xDist = testPos2.vx - testPos1.vx;
s32 yDist = testPos2.vy - testPos1.vy; s32 yDist = testPos2.vy - testPos1.vy;

View file

@ -62,7 +62,6 @@ void CNpcEyeballEnemy::postInit()
CProjectile *projectile; CProjectile *projectile;
projectile = new ( "eyeball projectile" ) CProjectile; projectile = new ( "eyeball projectile" ) CProjectile;
projectile->init( eyeballPos, m_fireHeading, CProjectile::PROJECTILE_FIXED, CProjectile::PROJECTILE_INFINITE_LIFE ); projectile->init( eyeballPos, m_fireHeading, CProjectile::PROJECTILE_FIXED, CProjectile::PROJECTILE_INFINITE_LIFE );
projectile->setLayerCollision( m_layerCollision );
projectile->setGraphic( FRM_EYEBALL_STATIC ); projectile->setGraphic( FRM_EYEBALL_STATIC );
addChild( projectile ); addChild( projectile );
@ -133,7 +132,6 @@ CThing *Next=getNext();
CProjectile *projectile; CProjectile *projectile;
projectile = new ( "eyeball projectile" ) CProjectile; projectile = new ( "eyeball projectile" ) CProjectile;
projectile->init( eyeballPos, m_fireHeading, CProjectile::PROJECTILE_USER_SEEK, CProjectile::PROJECTILE_INFINITE_LIFE ); projectile->init( eyeballPos, m_fireHeading, CProjectile::PROJECTILE_USER_SEEK, CProjectile::PROJECTILE_INFINITE_LIFE );
projectile->setLayerCollision( m_layerCollision );
projectile->setGraphic( FRM_EYEBALL_STATIC ); projectile->setGraphic( FRM_EYEBALL_STATIC );
projectile->setState( CProjectile::PROJECTILE_ATTACK ); projectile->setState( CProjectile::PROJECTILE_ATTACK );
@ -159,7 +157,7 @@ void CNpcEyeballEnemy::render()
{ {
DVECTOR &renderPos=getRenderPos(); DVECTOR &renderPos=getRenderPos();
SprFrame = m_spriteBank->printRotatedScaledSprite( FRM_EYEBALL_STALK, renderPos.vx, renderPos.vy, 4096, 4096, m_drawRotation, 10); SprFrame = CGameScene::getSpriteBank()->printRotatedScaledSprite( FRM_EYEBALL_STALK, renderPos.vx, renderPos.vy, 4096, 4096, m_drawRotation, 10);
// get xmax, xmin, ymax, ymin // get xmax, xmin, ymax, ymin

View file

@ -167,7 +167,6 @@ void CNpcFlyingDutchmanEnemy::processClose( int _frames )
CProjectile *projectile; CProjectile *projectile;
projectile = new( "test projectile" ) CProjectile; projectile = new( "test projectile" ) CProjectile;
projectile->init( Pos, heading ); projectile->init( Pos, heading );
projectile->setLayerCollision( m_layerCollision );
m_controlFunc = NPC_CONTROL_MOVEMENT; m_controlFunc = NPC_CONTROL_MOVEMENT;
m_movementTimer = GameState::getOneSecondInFrames() * 3; m_movementTimer = GameState::getOneSecondInFrames() * 3;

View file

@ -30,7 +30,7 @@ void CNpcFriend::processGaryMovement( int _frames )
// check vertical collision // check vertical collision
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= 0 ) if ( groundHeight <= 0 )
{ {
@ -38,7 +38,7 @@ void CNpcFriend::processGaryMovement( int _frames )
// check horizontal collision // check horizontal collision
if ( m_layerCollision->getHeightFromGround( Pos.vx + ( multiplier * _frames ), Pos.vy ) < -maxHeight ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( multiplier * _frames ), Pos.vy ) < -maxHeight )
{ {
// reverse direction // reverse direction
@ -63,7 +63,7 @@ void CNpcFriend::processGaryMovement( int _frames )
Pos.vy += groundHeight; Pos.vy += groundHeight;
if ( m_layerCollision->getHeightFromGround( Pos.vx + ( multiplier * _frames ), Pos.vy ) < -maxHeight ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( multiplier * _frames ), Pos.vy ) < -maxHeight )
{ {
// reverse direction // reverse direction

View file

@ -52,7 +52,6 @@ void CNpcEnemyGenerator::think(int _frames)
ASSERT(enemy); ASSERT(enemy);
enemy->setType( CNpcEnemy::NPC_SPIDER_CRAB ); enemy->setType( CNpcEnemy::NPC_SPIDER_CRAB );
enemy->init(); enemy->init();
enemy->setLayerCollision( m_layerCollision );
enemy->setStartPos( Pos.vx >> 4, Pos.vy >> 4 ); enemy->setStartPos( Pos.vx >> 4, Pos.vy >> 4 );
CNpcWaypoint *sourceWaypoint = m_npcPath.getWaypointList(); CNpcWaypoint *sourceWaypoint = m_npcPath.getWaypointList();

View file

@ -144,18 +144,18 @@ bool CNpcEnemy::processGroundCollisionReverse( s32 *moveX, s32 *moveY )
// check for collision with ground // check for collision with ground
if ( m_layerCollision->Get( ( Pos.vx + *moveX ) >> 4, ( Pos.vy + *moveY ) >> 4 ) ) if ( CGameScene::getCollision()->Get( ( Pos.vx + *moveX ) >> 4, ( Pos.vy + *moveY ) >> 4 ) )
{ {
// destination point is below ground, check in individual directions // destination point is below ground, check in individual directions
if ( m_layerCollision->Get( ( Pos.vx + *moveX ) >> 4, Pos.vy >> 4 ) ) if ( CGameScene::getCollision()->Get( ( Pos.vx + *moveX ) >> 4, Pos.vy >> 4 ) )
{ {
// X direction is blocked // X direction is blocked
xBlocked = true; xBlocked = true;
} }
if ( m_layerCollision->Get( Pos.vx >> 4, ( Pos.vy + *moveY ) >> 4 ) ) if ( CGameScene::getCollision()->Get( Pos.vx >> 4, ( Pos.vy + *moveY ) >> 4 ) )
{ {
yBlocked = true; yBlocked = true;
} }
@ -325,7 +325,7 @@ void CNpcEnemy::processGenericFixedPathWalk( int _frames, s32 *moveX, s32 *moveY
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {
@ -346,7 +346,7 @@ void CNpcEnemy::processGenericFixedPathWalk( int _frames, s32 *moveX, s32 *moveY
distX = distX / abs( distX ); distX = distX / abs( distX );
if ( m_layerCollision->getHeightFromGround( Pos.vx + ( distX * m_speed * _frames ), Pos.vy ) < -maxHeight ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( distX * m_speed * _frames ), Pos.vy ) < -maxHeight )
{ {
// there is an obstacle in the way, increment the path point (hopefully this will resolve the problem) // there is an obstacle in the way, increment the path point (hopefully this will resolve the problem)
@ -356,7 +356,7 @@ void CNpcEnemy::processGenericFixedPathWalk( int _frames, s32 *moveX, s32 *moveY
{ {
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {
@ -377,6 +377,5 @@ void CNpcEnemy::processGenericFixedPathWalk( int _frames, s32 *moveX, s32 *moveY
bool CNpcEnemy::isCollisionWithGround() bool CNpcEnemy::isCollisionWithGround()
{ {
ASSERT(m_layerCollision); return CGameScene::getCollision()->Get( Pos.vx >> 4, ( Pos.vy + 1 ) >> 4 ) ? 16:0;
return m_layerCollision->Get( Pos.vx >> 4, ( Pos.vy + 1 ) >> 4 ) ? 16:0;
} }

View file

@ -104,7 +104,6 @@ void CNpcGhostPirateEnemy::processClose( int _frames )
projectile = new( "test projectile" ) CProjectile; projectile = new( "test projectile" ) CProjectile;
projectile->init( Pos, heading ); projectile->init( Pos, heading );
projectile->setLayerCollision( m_layerCollision );
} }
} }
else if ( m_extendDir == EXTEND_DOWN ) else if ( m_extendDir == EXTEND_DOWN )

View file

@ -204,7 +204,7 @@ void CNpcHermitCrabEnemy::processClose( int _frames )
} }
else else
{ {
groundHeight = m_layerCollision->getHeightFromGround( newX, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( newX, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {
@ -247,8 +247,8 @@ void CNpcHermitCrabEnemy::processMovementModifier( int _frames, s32 distX, s32 d
testPos1.vx -= 10; testPos1.vx -= 10;
testPos2.vx += 10; testPos2.vx += 10;
testPos1.vy += m_layerCollision->getHeightFromGround( testPos1.vx, testPos1.vy, 16 ); testPos1.vy += CGameScene::getCollision()->getHeightFromGround( testPos1.vx, testPos1.vy, 16 );
testPos2.vy += m_layerCollision->getHeightFromGround( testPos2.vx, testPos2.vy, 16 ); testPos2.vy += CGameScene::getCollision()->getHeightFromGround( testPos2.vx, testPos2.vy, 16 );
s32 xDist = testPos2.vx - testPos1.vx; s32 xDist = testPos2.vx - testPos1.vx;
s32 yDist = testPos2.vy - testPos1.vy; s32 yDist = testPos2.vy - testPos1.vy;

View file

@ -335,7 +335,6 @@ void CNpcMotherJellyfishEnemy::spawnJellyfish( int _frames )
ASSERT(enemy); ASSERT(enemy);
enemy->setType( CNpcEnemy::NPC_PROJECTILE_JELLYFISH ); enemy->setType( CNpcEnemy::NPC_PROJECTILE_JELLYFISH );
enemy->init(); enemy->init();
enemy->setLayerCollision( m_layerCollision );
enemy->setStartPos( Pos.vx >> 4, ( Pos.vy + 20 ) >> 4 ); enemy->setStartPos( Pos.vx >> 4, ( Pos.vy + 20 ) >> 4 );
CNpcWaypoint *sourceWaypoint = m_npcPath.getWaypointList(); CNpcWaypoint *sourceWaypoint = m_npcPath.getWaypointList();

View file

@ -19,6 +19,8 @@
#include "level\layercollision.h" #include "level\layercollision.h"
#endif #endif
#include "game/game.h"
void CNpcPricklyBugEnemy::processMovementModifier( int _frames, s32 distX, s32 distY, s32 dist, s16 headingChange ) void CNpcPricklyBugEnemy::processMovementModifier( int _frames, s32 distX, s32 distY, s32 dist, s16 headingChange )
{ {
Pos.vx += distX; Pos.vx += distX;
@ -32,8 +34,8 @@ void CNpcPricklyBugEnemy::processMovementModifier( int _frames, s32 distX, s32 d
testPos1.vx -= 10; testPos1.vx -= 10;
testPos2.vx += 10; testPos2.vx += 10;
testPos1.vy += m_layerCollision->getHeightFromGround( testPos1.vx, testPos1.vy, 16 ); testPos1.vy += CGameScene::getCollision()->getHeightFromGround( testPos1.vx, testPos1.vy, 16 );
testPos2.vy += m_layerCollision->getHeightFromGround( testPos2.vx, testPos2.vy, 16 ); testPos2.vy += CGameScene::getCollision()->getHeightFromGround( testPos2.vx, testPos2.vy, 16 );
s32 xDist = testPos2.vx - testPos1.vx; s32 xDist = testPos2.vx - testPos1.vx;
s32 yDist = testPos2.vy - testPos1.vy; s32 yDist = testPos2.vy - testPos1.vy;

View file

@ -214,75 +214,67 @@ CNpcEnemy *CNpcEnemy::Create(sThingActor *ThisActor)
NPC_UNIT_TYPE enemyType = CNpcEnemy::getTypeFromMapEdit( ThisActor->Type ); NPC_UNIT_TYPE enemyType = CNpcEnemy::getTypeFromMapEdit( ThisActor->Type );
enemy = (CNpcEnemy*)CThingManager::GetThing(TYPE_ENEMY,enemyType);
if (!enemy)
switch( enemyType ) switch( enemyType )
{ {
case CNpcEnemy::NPC_SMALL_JELLYFISH_1: case CNpcEnemy::NPC_SMALL_JELLYFISH_1:
case CNpcEnemy::NPC_SMALL_JELLYFISH_2: case CNpcEnemy::NPC_SMALL_JELLYFISH_2:
{ {
printf("JFish\n");
enemy = new ("small jellyfish") CNpcSmallJellyfishEnemy; enemy = new ("small jellyfish") CNpcSmallJellyfishEnemy;
break; break;
} }
case CNpcEnemy::NPC_HERMIT_CRAB: case CNpcEnemy::NPC_HERMIT_CRAB:
{ {
printf("NPC_HERMIT_CRAB\n");
enemy = new ("hermit crab") CNpcHermitCrabEnemy; enemy = new ("hermit crab") CNpcHermitCrabEnemy;
break; break;
} }
case CNpcEnemy::NPC_SPIDER_CRAB: case CNpcEnemy::NPC_SPIDER_CRAB:
{ {
printf("NPC_SPIDER_CRAB\n");
enemy = new ("spider crab") CNpcSpiderCrabEnemy; enemy = new ("spider crab") CNpcSpiderCrabEnemy;
break; break;
} }
case CNpcEnemy::NPC_SPIDER_CRAB_SPAWNER: case CNpcEnemy::NPC_SPIDER_CRAB_SPAWNER:
{ {
printf("NPC_SPIDER_CRAB_SPAWNER\n");
enemy = new ("spider crab spawner") CNpcEnemyGenerator; enemy = new ("spider crab spawner") CNpcEnemyGenerator;
break; break;
} }
case CNpcEnemy::NPC_ANEMONE_1: case CNpcEnemy::NPC_ANEMONE_1:
{ {
printf("NPC_ANEMONE_1\n");
enemy = new ("anemone 1") CNpcAnemone1Enemy; enemy = new ("anemone 1") CNpcAnemone1Enemy;
break; break;
} }
case CNpcEnemy::NPC_ANEMONE_2: case CNpcEnemy::NPC_ANEMONE_2:
{ {
printf("NPC_ANEMONE_2\n");
enemy = new ("anemone 2") CNpcAnemone2Enemy; enemy = new ("anemone 2") CNpcAnemone2Enemy;
break; break;
} }
case CNpcEnemy::NPC_ANEMONE_3: case CNpcEnemy::NPC_ANEMONE_3:
{ {
printf("NPC_ANEMONE_3\n");
enemy = new ("anemone 3") CNpcAnemone3Enemy; enemy = new ("anemone 3") CNpcAnemone3Enemy;
break; break;
} }
case CNpcEnemy::NPC_CLAM_JUMP: case CNpcEnemy::NPC_CLAM_JUMP:
{ {
printf("NPC_CLAM_JUMP\n");
enemy = new ("jumping clam") CNpcJumpingClamEnemy; enemy = new ("jumping clam") CNpcJumpingClamEnemy;
break; break;
} }
case CNpcEnemy::NPC_CLAM_STATIC: case CNpcEnemy::NPC_CLAM_STATIC:
{ {
printf("NPC_CLAM_STATIC\n");
enemy = new ("static clam") CNpcStaticClamEnemy; enemy = new ("static clam") CNpcStaticClamEnemy;
break; break;
} }
case CNpcEnemy::NPC_BABY_OCTOPUS: case CNpcEnemy::NPC_BABY_OCTOPUS:
{ {
printf("NPC_BABY_OCTOPUS\n");
enemy = new ("baby octopus") CNpcBabyOctopusEnemy; enemy = new ("baby octopus") CNpcBabyOctopusEnemy;
break; break;
} }
@ -290,157 +282,126 @@ CNpcEnemy *CNpcEnemy::Create(sThingActor *ThisActor)
case CNpcEnemy::NPC_FISH_FOLK: case CNpcEnemy::NPC_FISH_FOLK:
case CNpcEnemy::NPC_ZOMBIE_FISH_FOLK: case CNpcEnemy::NPC_ZOMBIE_FISH_FOLK:
{ {
printf("NPC_FISH_FOLK\n");
enemy = new ("fish folk") CNpcFishFolk; enemy = new ("fish folk") CNpcFishFolk;
break; break;
} }
case CNpcEnemy::NPC_BALL_BLOB: case CNpcEnemy::NPC_BALL_BLOB:
{ {
printf("NPC_BALL_BLOB\n");
enemy = new ("ball blob") CNpcBallBlobEnemy; enemy = new ("ball blob") CNpcBallBlobEnemy;
break; break;
} }
case CNpcEnemy::NPC_GHOST_PIRATE: case CNpcEnemy::NPC_GHOST_PIRATE:
{ {
printf("NPC_GHOST_PIRATE\n");
enemy = new ("ghost pirate") CNpcGhostPirateEnemy; enemy = new ("ghost pirate") CNpcGhostPirateEnemy;
break; break;
} }
case CNpcEnemy::NPC_PUFFA_FISH: case CNpcEnemy::NPC_PUFFA_FISH:
{ {
printf("NPC_PUFFA_FISH\n");
enemy = new ("puffa fish") CNpcPuffaFishEnemy; enemy = new ("puffa fish") CNpcPuffaFishEnemy;
break; break;
} }
case CNpcEnemy::NPC_SHARK_MAN: case CNpcEnemy::NPC_SHARK_MAN:
{ {
printf("NPC_SHARK_MAN\n");
enemy = new ("shark man") CNpcSharkManEnemy; enemy = new ("shark man") CNpcSharkManEnemy;
break; break;
} }
case CNpcEnemy::NPC_SKELETAL_FISH: case CNpcEnemy::NPC_SKELETAL_FISH:
{ {
printf("NPC_SKELETAL_FISH\n");
enemy = new ("skeletal fish") CNpcSkeletalFishEnemy; enemy = new ("skeletal fish") CNpcSkeletalFishEnemy;
break; break;
} }
case CNpcEnemy::NPC_EYEBALL: case CNpcEnemy::NPC_EYEBALL:
{ {
printf("NPC_EYEBALL\n");
enemy = new ("eyeball") CNpcEyeballEnemy; enemy = new ("eyeball") CNpcEyeballEnemy;
break; break;
} }
case CNpcEnemy::NPC_FLAMING_SKULL: case CNpcEnemy::NPC_FLAMING_SKULL:
{ {
printf("NPC_FLAMING_SKULL\n");
enemy = new ("flaming skull") CNpcFlamingSkullEnemy; enemy = new ("flaming skull") CNpcFlamingSkullEnemy;
break; break;
} }
case CNpcEnemy::NPC_SKULL_STOMPER: case CNpcEnemy::NPC_SKULL_STOMPER:
{ {
printf("NPC_SKULL_STOMPER\n");
enemy = new ("skull stomper") CNpcSkullStomperEnemy; enemy = new ("skull stomper") CNpcSkullStomperEnemy;
break; break;
} }
case CNpcEnemy::NPC_BOOGER_MONSTER: case CNpcEnemy::NPC_BOOGER_MONSTER:
{ {
printf("NPC_BOOGER_MONSTER\n");
enemy = new ("booger monster") CNpcBoogerMonsterEnemy; enemy = new ("booger monster") CNpcBoogerMonsterEnemy;
break; break;
} }
case CNpcEnemy::NPC_MOTHER_JELLYFISH: case CNpcEnemy::NPC_MOTHER_JELLYFISH:
{ {
printf("NPC_MOTHER_JELLYFISH\n"); enemy = new ("mother jellyfish") CNpcMotherJellyfishEnemy;
/*if ( CLevel::getCurrentChapterLevel() == 4 )
{
enemy = new ("mother jellyfish background") CNpcMotherJellyfishBackground;
enemyType = NPC_MOTHER_JELLYFISH_BACKGROUND;
}
else*/
{
enemy = new ("mother jellyfish") CNpcMotherJellyfishEnemy;
}
break; break;
} }
case CNpcEnemy::NPC_SUB_SHARK: case CNpcEnemy::NPC_SUB_SHARK:
{ {
printf("NPC_SUB_SHARK\n");
enemy = new ("sub shark") CNpcSubSharkEnemy; enemy = new ("sub shark") CNpcSubSharkEnemy;
break; break;
} }
case CNpcEnemy::NPC_PARASITIC_WORM: case CNpcEnemy::NPC_PARASITIC_WORM:
{ {
printf("NPC_PARASITIC_WORM\n");
enemy = new ("parasitic worm") CNpcParasiticWormEnemy; enemy = new ("parasitic worm") CNpcParasiticWormEnemy;
break; break;
} }
case CNpcEnemy::NPC_FLYING_DUTCHMAN: case CNpcEnemy::NPC_FLYING_DUTCHMAN:
{ {
printf("NPC_FLYING_DUTCHMAN\n");
enemy = new ("flying dutchman") CNpcFlyingDutchmanEnemy; enemy = new ("flying dutchman") CNpcFlyingDutchmanEnemy;
break; break;
} }
case CNpcEnemy::NPC_IRON_DOGFISH: case CNpcEnemy::NPC_IRON_DOGFISH:
{ {
printf("NPC_IRON_DOGFISH\n");
enemy = new ("iron dogfish") CNpcIronDogfishEnemy; enemy = new ("iron dogfish") CNpcIronDogfishEnemy;
break; break;
} }
/*case CNpcEnemy::NPC_FALLING_ITEM: /*case CNpcEnemy::NPC_FALLING_ITEM:
{ {
printf("NPC_FALLING_ITEM\n");
enemy = new ("falling item") CNpcFallingItemHazard; enemy = new ("falling item") CNpcFallingItemHazard;
break; break;
}*/ }*/
/*case CNpcEnemy::NPC_FISH_HOOK: /*case CNpcEnemy::NPC_FISH_HOOK:
{ {
printf("NPC_FISH_HOOK\n");
enemy = new ("fish hook") CNpcFishHookHazard; enemy = new ("fish hook") CNpcFishHookHazard;
break; break;
}*/ }*/
/*case CNpcEnemy::NPC_PENDULUM: /*case CNpcEnemy::NPC_PENDULUM:
{ {
printf("NPC_PENDULUM\n");
enemy = new ("pendulum") CNpcPendulumHazard; enemy = new ("pendulum") CNpcPendulumHazard;
break; break;
}*/ }*/
/*case CNpcEnemy::NPC_FIREBALL: /*case CNpcEnemy::NPC_FIREBALL:
{ {
printf("NPC_FIREBALL\n");
enemy = new ("fireball") CNpcFireballHazard; enemy = new ("fireball") CNpcFireballHazard;
break; break;
}*/ }*/
/*case CNpcEnemy::NPC_SAW_BLADE: /*case CNpcEnemy::NPC_SAW_BLADE:
{ {
printf("NPC_SAW_BLADE\n");
enemy = new ("saw blade") CNpcReturningHazard; enemy = new ("saw blade") CNpcReturningHazard;
break; break;
}*/ }*/
case CNpcEnemy::NPC_DUST_DEVIL: case CNpcEnemy::NPC_DUST_DEVIL:
{ {
printf("NPC_DUST_DEVIL\n");
enemy = new ("dust devil") CNpcDustDevilEnemy; enemy = new ("dust devil") CNpcDustDevilEnemy;
break; break;
} }
@ -501,7 +462,7 @@ CNpcEnemy *CNpcEnemy::Create(sThingActor *ThisActor)
default: default:
{ {
printf("UNKNOWN %i\n",enemyType); SYSTEM_DBGMSG("UNKNOWN %i\n",enemyType);
enemy = new ("npc enemy") CNpcEnemy; enemy = new ("npc enemy") CNpcEnemy;
ASSERT(0); ASSERT(0);
break; break;
@ -511,6 +472,8 @@ CNpcEnemy *CNpcEnemy::Create(sThingActor *ThisActor)
ASSERT(enemy); ASSERT(enemy);
enemy->setType( enemyType ); enemy->setType( enemyType );
enemy->setThingSubType(enemyType);
enemy->init(); enemy->init();
return(enemy); return(enemy);
@ -589,13 +552,10 @@ void CNpcEnemy::init()
if (m_data[m_type].skelType) if (m_data[m_type].skelType)
{ {
m_actorGfx=CActorPool::GetActor((FileEquate)m_data[m_type].skelType); m_actorGfx=CActorPool::GetActor((FileEquate)m_data[m_type].skelType);
m_spriteBank=0;
} }
else else
{ {
m_actorGfx=0; m_actorGfx=0;
m_spriteBank=new ("enemy sprites") SpriteBank();
m_spriteBank->load(SPRITES_SPRITES_SPR);
} }
m_animPlaying = true; m_animPlaying = true;
@ -674,9 +634,6 @@ void CNpcEnemy::reinit()
void CNpcEnemy::shutdown() void CNpcEnemy::shutdown()
{ {
if (m_spriteBank) m_spriteBank->dump(); delete m_spriteBank;
// remove waypoints
m_npcPath.removeAllWaypoints(); m_npcPath.removeAllWaypoints();
if (m_actorGfx) delete m_actorGfx; if (m_actorGfx) delete m_actorGfx;
@ -1444,7 +1401,7 @@ void CNpcEnemy::processEnemyCollision( CThing *thisThing )
} }
} }
s32 groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, 16 ); s32 groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, 16 );
if ( groundHeight < 8 ) if ( groundHeight < 8 )
{ {
@ -1494,7 +1451,7 @@ void CNpcEnemy::processUserCollision( CThing *thisThing )
Pos.vx += otherDelta.vx; Pos.vx += otherDelta.vx;
s32 groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, 16 ); s32 groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, 16 );
if ( groundHeight < 8 ) if ( groundHeight < 8 )
{ {

View file

@ -87,6 +87,10 @@ public:
NPC_BUTTERFLY_BACKGROUND, NPC_BUTTERFLY_BACKGROUND,
NPC_UNIT_TYPE_MAX, NPC_UNIT_TYPE_MAX,
}; };
enum
{ // For Dynamic ThingCache
MAX_SUBTYPE =NPC_UNIT_TYPE_MAX,
};
void init(); void init();
virtual void postInit(); virtual void postInit();
@ -95,8 +99,7 @@ public:
virtual void think(int _frames); virtual void think(int _frames);
virtual void render(); virtual void render();
virtual void processEvent( GAME_EVENT evt, CThing *sourceThing ); virtual void processEvent( GAME_EVENT evt, CThing *sourceThing );
void setLayerCollision( class CLayerCollision *_layer ) {m_layerCollision=_layer;} void setType( NPC_UNIT_TYPE newType ) {m_type = newType; setThingSubType(newType);}
void setType( NPC_UNIT_TYPE newType ) {m_type = newType;}
NPC_UNIT_TYPE getType() {return( m_type );} NPC_UNIT_TYPE getType() {return( m_type );}
static NPC_UNIT_TYPE getTypeFromMapEdit( u16 newType ); static NPC_UNIT_TYPE getTypeFromMapEdit( u16 newType );
void setHeading( s32 newHeading ) {m_heading = newHeading;} void setHeading( s32 newHeading ) {m_heading = newHeading;}
@ -120,9 +123,6 @@ public:
bool canBeSuckedUp(); bool canBeSuckedUp();
bool suckUp( DVECTOR *suckPos, int _frames ); bool suckUp( DVECTOR *suckPos, int _frames );
protected:
class CLayerCollision *m_layerCollision;
protected: protected:
// NPC data structure definitions // // NPC data structure definitions //
@ -306,7 +306,7 @@ protected:
s32 m_frame; s32 m_frame;
int m_animNo; int m_animNo;
CActorGfx *m_actorGfx; CActorGfx *m_actorGfx;
SpriteBank *m_spriteBank;
POLY_FT4 *SprFrame; POLY_FT4 *SprFrame;
virtual void collidedWith(CThing *_thisThing); virtual void collidedWith(CThing *_thisThing);

View file

@ -38,7 +38,7 @@ void CNpcSpiderCrabEnemy::postInit()
{ {
m_npcPath.setPathType( CNpcPath::PONG_PATH ); m_npcPath.setPathType( CNpcPath::PONG_PATH );
if ( m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy - 8, 16 ) <= 0 ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy - 8, 16 ) <= 0 )
{ {
// starting off below ground, jump initially // starting off below ground, jump initially
@ -169,7 +169,7 @@ void CNpcSpiderCrabEnemy::processClose( int _frames )
// check for collision with ground // check for collision with ground
if ( m_layerCollision->getHeightFromGround( newPos.vx, newPos.vy ) < 0 ) if ( CGameScene::getCollision()->getHeightFromGround( newPos.vx, newPos.vy ) < 0 )
{ {
// abort jump // abort jump
@ -266,7 +266,7 @@ void CNpcSpiderCrabEnemy::processSpiderCrabInitJumpMovement( int _frames )
{ {
// check for collision on the way back down // check for collision on the way back down
if ( m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy ) < 0 ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy ) < 0 )
{ {
collision = true; collision = true;
} }
@ -325,8 +325,8 @@ void CNpcSpiderCrabEnemy::processMovementModifier( int _frames, s32 distX, s32 d
testPos1.vx -= 10; testPos1.vx -= 10;
testPos2.vx += 10; testPos2.vx += 10;
testPos1.vy += m_layerCollision->getHeightFromGround( testPos1.vx, testPos1.vy, 16 ); testPos1.vy += CGameScene::getCollision()->getHeightFromGround( testPos1.vx, testPos1.vy, 16 );
testPos2.vy += m_layerCollision->getHeightFromGround( testPos2.vx, testPos2.vy, 16 ); testPos2.vy += CGameScene::getCollision()->getHeightFromGround( testPos2.vx, testPos2.vy, 16 );
s32 xDist = testPos2.vx - testPos1.vx; s32 xDist = testPos2.vx - testPos1.vx;
s32 yDist = testPos2.vy - testPos1.vy; s32 yDist = testPos2.vy - testPos1.vy;

View file

@ -65,7 +65,7 @@ void CNpcSquidDartEnemy::render()
int frame = FRM_SQUIDDART_SWIM0001 + ( m_frame >> 8 ); int frame = FRM_SQUIDDART_SWIM0001 + ( m_frame >> 8 );
SprFrame = m_spriteBank->printFT4(frame,renderPos.vx,renderPos.vy,m_reversed,0,10); SprFrame = CGameScene::getSpriteBank()->printFT4(frame,renderPos.vx,renderPos.vy,m_reversed,0,10);
//setRGB0( SprFrame, 255, 128, 255 ); //setRGB0( SprFrame, 255, 128, 255 );
@ -106,7 +106,7 @@ void CNpcSquidDartEnemy::fireAsProjectile( s16 heading )
CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE,
CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE,
5*60); 5*60);
projectile->setLayerCollision( m_layerCollision );
projectile->setGraphic( FRM_SQUIDDART_SWIM0001 ); projectile->setGraphic( FRM_SQUIDDART_SWIM0001 );
projectile->setHasRGB( true ); projectile->setHasRGB( true );
projectile->setRGB( 255, 128, 255 ); projectile->setRGB( 255, 128, 255 );

View file

@ -23,6 +23,7 @@
#include "utils\utils.h" #include "utils\utils.h"
#endif #endif
#include "game/game.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -47,7 +48,7 @@ void CNpcShellEnemy::render()
{ {
DVECTOR &renderPos=getRenderPos(); DVECTOR &renderPos=getRenderPos();
SprFrame = m_spriteBank->printRotatedScaledSprite( m_shellType,renderPos.vx,renderPos.vy,4096,4096,m_drawRotation,10); SprFrame = CGameScene::getSpriteBank()->printRotatedScaledSprite( m_shellType,renderPos.vx,renderPos.vy,4096,4096,m_drawRotation,10);
// get xmax, xmin, ymax, ymin // get xmax, xmin, ymax, ymin

View file

@ -183,7 +183,7 @@ void CNpcSharkManEnemy::processClose( int _frames )
direction = 1; direction = 1;
} }
if ( m_layerCollision->getHeightFromGround( Pos.vx + ( _frames * m_velocity * direction ), Pos.vy ) < -maxHeight ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( _frames * m_velocity * direction ), Pos.vy ) < -maxHeight )
{ {
// there is an obstacle in the way, abort // there is an obstacle in the way, abort
@ -197,7 +197,7 @@ void CNpcSharkManEnemy::processClose( int _frames )
{ {
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {

View file

@ -55,7 +55,7 @@ void CNpcSmallJellyfish2BackgroundEnemy::render()
{ {
DVECTOR &renderPos=getRenderPos(); DVECTOR &renderPos=getRenderPos();
SprFrame = m_spriteBank->printRotatedScaledSprite( FRM_JELLYFISH1_SWIM1 + ( m_frame >> 8 ),renderPos.vx,renderPos.vy,4096,4096,m_drawRotation,15); SprFrame = CGameScene::getSpriteBank()->printRotatedScaledSprite( FRM_JELLYFISH1_SWIM1 + ( m_frame >> 8 ),renderPos.vx,renderPos.vy,4096,4096,m_drawRotation,15);
setRGB0( SprFrame, 128, 128, 255 ); // Let me know if these change! ALso ket me know when the different coloured ones go in pls! (pkg) setRGB0( SprFrame, 128, 128, 255 ); // Let me know if these change! ALso ket me know when the different coloured ones go in pls! (pkg)
// get xmax, xmin, ymax, ymin // get xmax, xmin, ymax, ymin

View file

@ -229,7 +229,7 @@ void CNpcSmallJellyfishBackgroundEnemy::render()
{ {
DVECTOR &renderPos=getRenderPos(); DVECTOR &renderPos=getRenderPos();
SprFrame = m_spriteBank->printRotatedScaledSprite( FRM_JELLYFISH1_SWIM1 + ( m_frame >> 8 ),renderPos.vx,renderPos.vy,4096,4096,m_drawRotation,15); SprFrame = CGameScene::getSpriteBank()->printRotatedScaledSprite( FRM_JELLYFISH1_SWIM1 + ( m_frame >> 8 ),renderPos.vx,renderPos.vy,4096,4096,m_drawRotation,15);
setRGB0( SprFrame, 255, 128, 255 ); // Let me know if these change! ALso ket me know when the different coloured ones go in pls! (pkg) setRGB0( SprFrame, 255, 128, 255 ); // Let me know if these change! ALso ket me know when the different coloured ones go in pls! (pkg)
// get xmax, xmin, ymax, ymin // get xmax, xmin, ymax, ymin

View file

@ -63,7 +63,7 @@ void CNpcSmallJellyfishEnemy::render()
{ {
DVECTOR &renderPos=getRenderPos(); DVECTOR &renderPos=getRenderPos();
SprFrame = m_spriteBank->printRotatedScaledSprite( FRM_JELLYFISH1_SWIM1 + ( m_frame >> 8 ),renderPos.vx,renderPos.vy,4096,4096,m_drawRotation,10); SprFrame = CGameScene::getSpriteBank()->printRotatedScaledSprite( FRM_JELLYFISH1_SWIM1 + ( m_frame >> 8 ),renderPos.vx,renderPos.vy,4096,4096,m_drawRotation,10);
setRGB0( SprFrame, 255, 128, 255 ); // Let me know if these change! ALso ket me know when the different coloured ones go in pls! (pkg) setRGB0( SprFrame, 255, 128, 255 ); // Let me know if these change! ALso ket me know when the different coloured ones go in pls! (pkg)
// get xmax, xmin, ymax, ymin // get xmax, xmin, ymax, ymin
@ -380,7 +380,6 @@ void CNpcSmallJellyfishEnemy::fireAsProjectile( s16 heading )
CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE,
CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE,
5*60); 5*60);
projectile->setLayerCollision( m_layerCollision );
projectile->setGraphic( FRM_JELLYFISH1_SWIM1 ); projectile->setGraphic( FRM_JELLYFISH1_SWIM1 );
projectile->setHasRGB( true ); projectile->setHasRGB( true );
projectile->setRGB( 255, 128, 255 ); projectile->setRGB( 255, 128, 255 );

View file

@ -71,7 +71,6 @@ void CNpcSubSharkEnemy::processMovement( int _frames )
CProjectile *projectile; CProjectile *projectile;
projectile = new( "test projectile" ) CProjectile; projectile = new( "test projectile" ) CProjectile;
projectile->init( Pos, 1024 ); projectile->init( Pos, 1024 );
projectile->setLayerCollision( m_layerCollision );
m_salvoCount--; m_salvoCount--;

View file

@ -88,7 +88,7 @@ void CNpcSkullStomperEnemy::processClose( int _frames )
{ {
yMovement = m_data[m_type].speed * _frames; yMovement = m_data[m_type].speed * _frames;
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight < yMovement ) if ( groundHeight < yMovement )
{ {

View file

@ -126,7 +126,6 @@ void CNpcParasiticWormEnemy::postInit()
CNpcParasiticWormSegment *wormSegment; CNpcParasiticWormSegment *wormSegment;
wormSegment = new ("segment") CNpcParasiticWormSegment; wormSegment = new ("segment") CNpcParasiticWormSegment;
wormSegment->init(); wormSegment->init();
//wormSegment->setLayerCollision( m_layerCollision );
if ( segCount < initLength ) if ( segCount < initLength )
{ {

View file

@ -32,7 +32,7 @@ void CNpcGaryFriend::think( int _frames )
// check vertical collision // check vertical collision
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= 0 ) if ( groundHeight <= 0 )
{ {
@ -40,7 +40,7 @@ void CNpcGaryFriend::think( int _frames )
// check horizontal collision // check horizontal collision
if ( m_layerCollision->getHeightFromGround( Pos.vx + ( multiplier * _frames ), Pos.vy ) < -maxHeight ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( multiplier * _frames ), Pos.vy ) < -maxHeight )
{ {
// reverse direction // reverse direction
@ -65,7 +65,7 @@ void CNpcGaryFriend::think( int _frames )
Pos.vy += groundHeight; Pos.vy += groundHeight;
if ( m_layerCollision->getHeightFromGround( Pos.vx + ( multiplier * _frames ), Pos.vy ) < -maxHeight ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( multiplier * _frames ), Pos.vy ) < -maxHeight )
{ {
// reverse direction // reverse direction

View file

@ -36,6 +36,8 @@
#endif #endif
#include "game/game.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CNpcPlanktonFriend::init() void CNpcPlanktonFriend::init()
@ -43,17 +45,12 @@ void CNpcPlanktonFriend::init()
CNpcThing::init(); CNpcThing::init();
m_extension = EXTEND_RIGHT; m_extension = EXTEND_RIGHT;
m_spriteBank=new ("enemy sprites") SpriteBank();
m_spriteBank->load(SPRITES_SPRITES_SPR);
} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CNpcPlanktonFriend::shutdown() void CNpcPlanktonFriend::shutdown()
{ {
m_spriteBank->dump(); delete m_spriteBank;
CNpcThing::shutdown(); CNpcThing::shutdown();
} }
@ -68,8 +65,8 @@ void CNpcPlanktonFriend::render()
DVECTOR origRenderPos; DVECTOR origRenderPos;
DVECTOR offset = CLevel::getCameraPos(); DVECTOR offset = CLevel::getCameraPos();
int frame = FRM_PLANKTON_STATIC00; int frame = FRM_PLANKTON_STATIC00;
int spriteWidth = m_spriteBank->getFrameWidth( frame ); int spriteWidth = CGameScene::getSpriteBank()->getFrameWidth( frame );
int spriteHeight = m_spriteBank->getFrameHeight( frame ); int spriteHeight = CGameScene::getSpriteBank()->getFrameHeight( frame );
renderPos.vx = Pos.vx - offset.vx - ( spriteWidth >> 1 ); renderPos.vx = Pos.vx - offset.vx - ( spriteWidth >> 1 );
renderPos.vy = Pos.vy - offset.vy - ( spriteHeight >> 1 ); renderPos.vy = Pos.vy - offset.vy - ( spriteHeight >> 1 );
@ -84,7 +81,7 @@ void CNpcPlanktonFriend::render()
{ {
if ( renderPos.vy + collisionRect.y2 >= 0 && renderPos.vy + collisionRect.y1 <= VidGetScrH() ) if ( renderPos.vy + collisionRect.y2 >= 0 && renderPos.vy + collisionRect.y1 <= VidGetScrH() )
{ {
m_spriteBank->printFT4(frame,renderPos.vx,renderPos.vy,0,0,10); CGameScene::getSpriteBank()->printFT4(frame,renderPos.vx,renderPos.vy,0,0,10);
} }
} }
} }

View file

@ -27,7 +27,6 @@ public:
virtual void shutdown(); virtual void shutdown();
protected: protected:
virtual void startConderversation(); virtual void startConderversation();
SpriteBank *m_spriteBank;
}; };
#endif #endif

View file

@ -67,9 +67,11 @@ CNpcFriend *CNpcFriend::Create(sThingActor *ThisActor)
{ {
CNpcFriend *friendNpc; CNpcFriend *friendNpc;
NPC_FRIEND_UNIT_TYPE friendType = CNpcFriend::getTypeFromMapEdit( ThisActor->Type ); NPC_FRIEND_UNIT_TYPE Type = CNpcFriend::getTypeFromMapEdit( ThisActor->Type );
switch( friendType ) friendNpc = (CNpcFriend*)CThingManager::GetThing(CThing::TYPE_NPC,Type);
if (!friendNpc)
switch( Type )
{ {
case CNpcFriend::NPC_FRIEND_BARNACLE_BOY: case CNpcFriend::NPC_FRIEND_BARNACLE_BOY:
{ {
@ -121,7 +123,7 @@ CNpcFriend *CNpcFriend::Create(sThingActor *ThisActor)
default: default:
{ {
printf("UNKNOWN %i\n",friendType); SYSTEM_DBGMSG("UNKNOWN %i\n",Type);
friendNpc = NULL; friendNpc = NULL;
ASSERT(0); ASSERT(0);
break; break;
@ -130,7 +132,8 @@ CNpcFriend *CNpcFriend::Create(sThingActor *ThisActor)
ASSERT( friendNpc ); ASSERT( friendNpc );
friendNpc->setType( friendType ); friendNpc->setType( Type );
friendNpc->setThingSubType(Type);
u16 *PntList=(u16*)MakePtr(ThisActor,sizeof(sThingActor)); u16 *PntList=(u16*)MakePtr(ThisActor,sizeof(sThingActor));
@ -191,8 +194,6 @@ void CNpcFriend::postInit()
void CNpcFriend::shutdown() void CNpcFriend::shutdown()
{ {
//m_spriteBank->dump(); delete m_spriteBank;
delete m_actorGfx; delete m_actorGfx;
CNpcThing::shutdown(); CNpcThing::shutdown();
} }

View file

@ -37,6 +37,10 @@ public:
NPC_FRIEND_PLANKTON, NPC_FRIEND_PLANKTON,
NPC_FRIEND_UNIT_TYPE_MAX, NPC_FRIEND_UNIT_TYPE_MAX,
}; };
enum
{ // For Dynamic ThingCache
MAX_SUBTYPE =NPC_FRIEND_UNIT_TYPE_MAX,
};
virtual void init(); virtual void init();
void init( DVECTOR initPos ); void init( DVECTOR initPos );
@ -44,15 +48,13 @@ public:
virtual void shutdown(); virtual void shutdown();
virtual void think(int _frames); virtual void think(int _frames);
virtual void render(); virtual void render();
void setLayerCollision( class CLayerCollision *_layer ) {m_layerCollision=_layer;}
void setType( NPC_FRIEND_UNIT_TYPE newType ) {m_type = newType;} void setType( NPC_FRIEND_UNIT_TYPE newType ) {m_type = newType;}
static CNpcFriend *Create(sThingActor *ThisActor); static CNpcFriend *Create(sThingActor *ThisActor);
static NPC_FRIEND_UNIT_TYPE getTypeFromMapEdit( u16 newType ); static NPC_FRIEND_UNIT_TYPE getTypeFromMapEdit( u16 newType );
protected:
class CLayerCollision *m_layerCollision;
protected: protected:
typedef struct NPC_FRIEND_DATA_TYPE typedef struct NPC_FRIEND_DATA_TYPE
{ {

View file

@ -101,6 +101,8 @@ CFX *CFX::Create(const FX_TYPE Type)
{ {
CFX *NewFX; CFX *NewFX;
NewFX = (CFX*)CThingManager::GetThing(CThing::TYPE_FX,Type);
if (!NewFX)
switch(Type) switch(Type)
{ {
case FX_TYPE_FALLINGTILE: case FX_TYPE_FALLINGTILE:
@ -161,7 +163,7 @@ CFX *NewFX;
ASSERT(!"UNKNOWN FX TYPE"); ASSERT(!"UNKNOWN FX TYPE");
return NULL; return NULL;
} }
NewFX->setThingSubType(Type);
return NewFX; return NewFX;
} }
@ -194,9 +196,6 @@ CFX *NewFX=CFX::Create(Type);
void CFX::init() void CFX::init()
{ {
CFXThing::init(); CFXThing::init();
m_spriteBank=new ("FX Sprite") SpriteBank();
m_spriteBank->load(SPRITES_SPRITES_SPR);
OtPos=OTPOS__ACTOR_POS; OtPos=OTPOS__ACTOR_POS;
Life=-1; Life=-1;
@ -205,7 +204,6 @@ void CFX::init()
/*****************************************************************************/ /*****************************************************************************/
void CFX::shutdown() void CFX::shutdown()
{ {
m_spriteBank->dump(); delete m_spriteBank;
CFXThing::shutdown(); CFXThing::shutdown();
} }

View file

@ -8,7 +8,6 @@
#include "thing/thing.h" #include "thing/thing.h"
/*****************************************************************************/ /*****************************************************************************/
class SpriteBank;
class CFX : public CFXThing class CFX : public CFXThing
{ {
public: public:
@ -47,6 +46,11 @@ public:
FX_TYPE_FLAMES, FX_TYPE_FLAMES,
FX_TYPE_EXPLODE, FX_TYPE_EXPLODE,
FX_TYPE_DEBRIS, FX_TYPE_DEBRIS,
FX_TYPE_MAX
};
enum
{ // For Dynamic ThingCache
MAX_SUBTYPE =FX_TYPE_MAX,
}; };
static CFX *Create(const FX_TYPE Type); static CFX *Create(const FX_TYPE Type);
@ -65,7 +69,6 @@ virtual void setDie() {DieOut=true;}
virtual void setLife(int L) {Life=L;} virtual void setLife(int L) {Life=L;}
protected: protected:
SpriteBank *m_spriteBank;
s32 OtPos; s32 OtPos;
u8 DieOut; u8 DieOut;

View file

@ -9,7 +9,7 @@
#include "gfx\sprbank.h" #include "gfx\sprbank.h"
#include <sprites.h> #include <sprites.h>
#include "level\level.h" #include "level\level.h"
#include "game\game.h"
#include "FX\FXBaseAnim.h" #include "FX\FXBaseAnim.h"
@ -58,11 +58,11 @@ void CFXBaseAnim::render()
CFX::render(); CFX::render();
if (!canRender() || isSetToShutdown()) return; if (!canRender() || isSetToShutdown()) return;
SpriteBank *SprBank=CGameScene::getSpriteBank();
DVECTOR &RenderPos=getRenderPos(); DVECTOR &RenderPos=getRenderPos();
int ThisFrame=Frame>>FrameShift; int ThisFrame=Frame>>FrameShift;
POLY_FT4 *Ft4=m_spriteBank->printFT4Scaled(BaseFrame+ThisFrame,RenderPos.vx,RenderPos.vy,0,0,OtPos*0,Scale>>4); POLY_FT4 *Ft4=SprBank->printFT4Scaled(BaseFrame+ThisFrame,RenderPos.vx,RenderPos.vy,0,0,OtPos*0,Scale>>4);
Ft4->u1--; Ft4->u3--; Ft4->u1--; Ft4->u3--;
Ft4->v2--; Ft4->v3--; Ft4->v2--; Ft4->v3--;
setRGB0(Ft4,R,G,B); setRGB0(Ft4,R,G,B);

View file

@ -9,6 +9,7 @@
#include "gfx\sprbank.h" #include "gfx\sprbank.h"
#include <sprites.h> #include <sprites.h>
#include "level\level.h" #include "level\level.h"
#include "game\game.h"
#include "FX\FXBaseTrail.h" #include "FX\FXBaseTrail.h"
@ -65,7 +66,7 @@ void CFXBaseTrail::render()
if (canRender()) if (canRender())
{ {
DVECTOR RenderPos=getRenderPos(); DVECTOR RenderPos=getRenderPos();
SpriteBank *SprBank=CGameScene::getSpriteBank();
int ThisIdx=HeadIdx; int ThisIdx=HeadIdx;
int StartY=RenderPos.vy; int StartY=RenderPos.vy;
@ -78,7 +79,7 @@ void CFXBaseTrail::render()
RenderPos.vy+=ThisElem.Ofs.vy>>2; RenderPos.vy+=ThisElem.Ofs.vy>>2;
if (ThisElem.Shade) if (ThisElem.Shade)
{ {
Ft4=m_spriteBank->printRotatedScaledSprite(ThisElem.Frame,RenderPos.vx,RenderPos.vy,ThisElem.Scale,ThisElem.Scale,ThisElem.Angle,OtPos*0); Ft4=SprBank->printRotatedScaledSprite(ThisElem.Frame,RenderPos.vx,RenderPos.vy,ThisElem.Scale,ThisElem.Scale,ThisElem.Angle,OtPos*0);
setShadeTex(Ft4,0); setShadeTex(Ft4,0);
setRGB0(Ft4,ThisElem.Shade,ThisElem.Shade,ThisElem.Shade); setRGB0(Ft4,ThisElem.Shade,ThisElem.Shade,ThisElem.Shade);
setSemiTrans(Ft4,1); setSemiTrans(Ft4,1);

View file

@ -72,7 +72,6 @@ int AInc=1024/Width;
if (dH>8) dH=8; if (dH>8) dH=8;
if (dH<2) dH=2; if (dH<2) dH=2;
HeightTable[H]=(s16)dH; HeightTable[H]=(s16)dH;
// printf("%i %i =%i\n",H,Ofs,HeightTable[H]);
} }
*/ */
} }
@ -144,7 +143,7 @@ s16 *dH=HeightTable;
for (int i=0; i<Count-1; i++) for (int i=0; i<Count-1; i++)
{ {
if (Idx>=Count) Idx=0; if (Idx>=Count) Idx=0;
POLY_FT4 *Ft4=m_spriteBank->printFT4(FRM__TENTACLE,LastPos.vx,LastPos.vy,0,0,OtPos); POLY_FT4 *Ft4=CGameScene::getSpriteBank()->printFT4(FRM__TENTACLE,LastPos.vx,LastPos.vy,0,0,OtPos);
Ft4->x0=LastPos.vx+0+LastdW; Ft4->y0=LastPos.vy; Ft4->x0=LastPos.vx+0+LastdW; Ft4->y0=LastPos.vy;
Ft4->x1=LastPos.vx+8-LastdW; Ft4->y1=LastPos.vy; Ft4->x1=LastPos.vx+8-LastdW; Ft4->y1=LastPos.vy;

View file

@ -81,8 +81,10 @@ int RenderZ=256;
/*****************************************************************************/ /*****************************************************************************/
FontBank *CGameScene::s_genericFont; FontBank *CGameScene::s_genericFont;
MATRIX CGameScene::CamMtx; SpriteBank *CGameScene::s_GlobalSpritebank;
CLayerCollision *CGameScene::s_GlobalCollision;
MATRIX CGameScene::CamMtx;
/*****************************************************************************/ /*****************************************************************************/
CGameScene::ACTOR_TYPE CGameScene::actorType[40] = CGameScene::ACTOR_TYPE CGameScene::actorType[40] =
@ -330,7 +332,7 @@ void CGameScene::sendEvent( GAME_EVENT evt, CThing *sourceThing )
/*****************************************************************************/ /*****************************************************************************/
void CGameScene::initLevel() void CGameScene::initLevel()
{ {
printf("InitLevel\n"); SYSTEM_DBGMSG("InitLevel\n");
CThingManager::init(); CThingManager::init();
CConversation::init(); CConversation::init();
@ -342,7 +344,6 @@ void CGameScene::initLevel()
createPlayer(); createPlayer();
m_player->setRespawnPos(Level.getPlayerSpawnPos()); m_player->setRespawnPos(Level.getPlayerSpawnPos());
m_player->init(); m_player->init();
m_player->setLayerCollision(Level.getCollisionLayer());
DVECTOR mapSize=Level.getMapSize(); DVECTOR mapSize=Level.getMapSize();
CPlayer::CameraBox camBox={0,0,mapSize.vx<<4,mapSize.vy<<4}; CPlayer::CameraBox camBox={0,0,mapSize.vx<<4,mapSize.vy<<4};
m_player->setCameraBox(camBox); m_player->setCameraBox(camBox);
@ -351,7 +352,7 @@ void CGameScene::initLevel()
// better timing over when it starts (pkg) // better timing over when it starts (pkg)
CSoundMediator::playSong(); CSoundMediator::playSong();
CActorPool::SetUpCache(); CActorPool::SetUpCache();
printf("InitLevelDone\n"); SYSTEM_DBGMSG("InitLevelDone\n");
} }

View file

@ -16,6 +16,7 @@
class FontBank; class FontBank;
class SpriteBank; class SpriteBank;
class CPlayer; class CPlayer;
class CLayerCollision;
class CGameScene : public CScene class CGameScene : public CScene
{ {
public: public:
@ -74,6 +75,17 @@ static int s_levelFinished;
static ACTOR_TYPE actorType[]; static ACTOR_TYPE actorType[];
// global vars
public:
static void setSpriteBank(SpriteBank *SprBank) {s_GlobalSpritebank=SprBank;}
static SpriteBank *getSpriteBank() {return(s_GlobalSpritebank);}
static void setCollision(CLayerCollision *Col) {s_GlobalCollision=Col;}
static CLayerCollision *getCollision() {return(s_GlobalCollision);}
static SpriteBank *s_GlobalSpritebank;
static CLayerCollision *s_GlobalCollision;
}; };

View file

@ -61,12 +61,12 @@ int SlotW=+32000,SlotH=+32000;
if (SlotList[Slot].Width<W) if (SlotList[Slot].Width<W)
{ {
// printf("Adjusted Slot Width from %i to %i\n",SlotList[Slot].Width,W); // DAVE_DBGMSG("Adjusted Slot Width from %i to %i\n",SlotList[Slot].Width,W);
SlotList[Slot].Width=W; SlotList[Slot].Width=W;
} }
if (SlotList[Slot].Height<H) if (SlotList[Slot].Height<H)
{ {
// printf("Adjusted Slot Height from %i to %i\n",SlotList[Slot].Height,H); // DAVE_DBGMSG("Adjusted Slot Height from %i to %i\n",SlotList[Slot].Height,H);
SlotList[Slot].Height=H; SlotList[Slot].Height=H;
} }
@ -511,7 +511,7 @@ sActorPool *Actor=ActorList;
sPoolSlot &Slot=CActorPool::Cache.GetSlot(i); sPoolSlot &Slot=CActorPool::Cache.GetSlot(i);
int Count=CountSlots(Slot.NodeList.Head); int Count=CountSlots(Slot.NodeList.Head);
printf("SC %i: %i %i\n",i,Slot.SlotCount,Count); DAVE_DBGMSG("SC %i: %i %i\n",i,Slot.SlotCount,Count);
ASSERT(Slot.SlotCount==Count); ASSERT(Slot.SlotCount==Count);
} }
*/ */

View file

@ -38,7 +38,7 @@
#include "system\gstate.h" #include "system\gstate.h"
#endif #endif
#include "game\game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -70,8 +70,6 @@ int CBubicleFactory::s_initialised=false;
CBubicleEmitter *CBubicleFactory::s_emitters; CBubicleEmitter *CBubicleFactory::s_emitters;
CBubicle *CBubicleFactory::s_bubicles; CBubicle *CBubicleFactory::s_bubicles;
SpriteBank *CBubicleFactory::s_sprites;
int CBubicleFactory::s_frameTypeCounter=0; int CBubicleFactory::s_frameTypeCounter=0;
const int CBubicleFactory::s_frameTabSize=8; const int CBubicleFactory::s_frameTabSize=8;
const int CBubicleFactory::s_frameTabSizeMask=0x07; const int CBubicleFactory::s_frameTabSizeMask=0x07;
@ -365,7 +363,7 @@ void CBubicle::render()
x+=(msin(m_data.m_theta)*(m_data.m_wobbleWidth>>ACCURACY_SHIFT))>>12; x+=(msin(m_data.m_theta)*(m_data.m_wobbleWidth>>ACCURACY_SHIFT))>>12;
ft4=CBubicleFactory::getSprites()->printFT4(m_fhBub,0,0,0,0,m_data.m_ot); ft4=CGameScene::getSpriteBank()->printFT4(m_fhBub,0,0,0,0,m_data.m_ot);
setXYWH(ft4,x,y,w,h); setXYWH(ft4,x,y,w,h);
setSemiTrans(ft4,1); setSemiTrans(ft4,1);
setRGB0(ft4,m_data.m_colour.m_r,m_data.m_colour.m_g,m_data.m_colour.m_b); setRGB0(ft4,m_data.m_colour.m_r,m_data.m_colour.m_g,m_data.m_colour.m_b);
@ -386,13 +384,10 @@ void CBubicleFactory::init()
int i; int i;
CBubicleEmitter *emt; CBubicleEmitter *emt;
CBubicle *bub; CBubicle *bub;
SpriteBank *SprBank=CGameScene::getSpriteBank();
s_sprites=new ("Bubble Sprites") SpriteBank();
s_sprites->load(SPRITES_SPRITES_SPR);
for(i=0;i<s_frameTabSize;i++) for(i=0;i<s_frameTabSize;i++)
{ {
s_frameTab[i]=s_sprites->getFrameHeader(s_frameTabSrc[i]); s_frameTab[i]=SprBank->getFrameHeader(s_frameTabSrc[i]);
} }
emt=s_emitters=(CBubicleEmitter*)MemAlloc(sizeof(CBubicleEmitter)*NUM_EMITTERS,"BubicleEmitters"); emt=s_emitters=(CBubicleEmitter*)MemAlloc(sizeof(CBubicleEmitter)*NUM_EMITTERS,"BubicleEmitters");
@ -421,7 +416,6 @@ void CBubicleFactory::shutdown()
MemFree(s_emitters); MemFree(s_emitters);
MemFree(s_bubicles); MemFree(s_bubicles);
s_sprites->dump(); delete s_sprites;
s_initialised=false; s_initialised=false;
} }

View file

@ -162,7 +162,6 @@ public:
static CBubicleEmitter *spawnEmitter(BubicleEmitterData *_init); static CBubicleEmitter *spawnEmitter(BubicleEmitterData *_init);
static CBubicle *spawnParticle(BubicleEmitterData *_init); static CBubicle *spawnParticle(BubicleEmitterData *_init);
static sFrameHdr *getBubbleFrameHeader(); static sFrameHdr *getBubbleFrameHeader();
static SpriteBank *getSprites() {return s_sprites;}
static void setMapOffset(DVECTOR *_offset); static void setMapOffset(DVECTOR *_offset);
static const DVECTOR *getMapOffset(); static const DVECTOR *getMapOffset();
@ -180,7 +179,6 @@ private:
static int s_initialised; static int s_initialised;
static CBubicleEmitter *s_emitters; static CBubicleEmitter *s_emitters;
static CBubicle *s_bubicles; static CBubicle *s_bubicles;
static SpriteBank *s_sprites;
static int s_frameTypeCounter; static int s_frameTypeCounter;
static const int s_frameTabSize; static const int s_frameTabSize;

View file

@ -70,7 +70,6 @@ void PrimDisplay()
/*****************************************************************************/ /*****************************************************************************/
void FlushPrimPool() void FlushPrimPool()
{ {
printf("%x %x\n",(int)CurrPrim,(int)PrimBuffer[PrimFlipFlag]);
BaseOtPtr=(sOT*)OtList[PrimFlipFlag]; BaseOtPtr=(sOT*)OtList[PrimFlipFlag];
GUIOtPtr=BaseOtPtr; GUIOtPtr=BaseOtPtr;
OtPtr=GUIOtPtr+MAX_OT_GUI; OtPtr=GUIOtPtr+MAX_OT_GUI;

View file

@ -181,6 +181,7 @@ void SpriteBank::load( FileEquate _file )
} }
else else
{ {
// ASSERT(!"Sprite Bank Already Loaded");
SpriteBankInstance *sbiPtr=s_bankList; SpriteBankInstance *sbiPtr=s_bankList;
do do
{ {

View file

@ -30,6 +30,7 @@
#include "gfx\prim.h" #include "gfx\prim.h"
#endif #endif
#include "game\game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -369,7 +370,7 @@ void CGUIObjectWithSpriteBank::shutdown()
CGUIObject::shutdown(); CGUIObject::shutdown();
m_spriteBank->dump(); m_spriteBank->dump();
delete m_spriteBank; // delete m_spriteBank;
m_spriteBank=0; m_spriteBank=0;
} }
@ -382,8 +383,9 @@ void CGUIObjectWithSpriteBank::shutdown()
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
void CGUIObjectWithSpriteBank::setSpriteBank(FileEquate _fe) void CGUIObjectWithSpriteBank::setSpriteBank(FileEquate _fe)
{ {
m_spriteBank=new ("spritebank") SpriteBank(); // m_spriteBank=new ("spritebank") SpriteBank();
m_spriteBank->load(_fe); // m_spriteBank->load(_fe);
m_spriteBank=CGameScene::getSpriteBank();
} }
@ -402,8 +404,10 @@ void initGUIStuff()
{ {
ASSERT(!s_uiSpriteBank); ASSERT(!s_uiSpriteBank);
s_uiSpriteBank=new ("UI Sprites") SpriteBank(); // s_uiSpriteBank=new ("UI Sprites") SpriteBank();
s_uiSpriteBank->load(SPRITES_SPRITES_SPR); // s_uiSpriteBank->load(SPRITES_SPRITES_SPR);
s_uiSpriteBank=CGameScene::getSpriteBank();
} }

View file

@ -144,9 +144,11 @@ CNpcHazard *CNpcHazard::Create(sThingHazard *ThisHazard)
{ {
CNpcHazard *hazard; CNpcHazard *hazard;
NPC_HAZARD_UNIT_TYPE hazardType = getTypeFromMapEdit( ThisHazard->Type ); NPC_HAZARD_UNIT_TYPE Type = getTypeFromMapEdit( ThisHazard->Type );
switch( hazardType ) hazard = (CNpcHazard*)CThingManager::GetThing(CThing::TYPE_HAZARD,Type);
if (!hazard)
switch( Type )
{ {
case NPC_FALLING_HAZARD: case NPC_FALLING_HAZARD:
{ {
@ -277,7 +279,8 @@ CNpcHazard *CNpcHazard::Create(sThingHazard *ThisHazard)
ASSERT( hazard ); ASSERT( hazard );
hazard->setType( hazardType ); hazard->setType( Type );
hazard->setThingSubType(Type);
hazard->init(); hazard->init();
hazard->setWaypoints( ThisHazard ); hazard->setWaypoints( ThisHazard );
hazard->setGraphic( ThisHazard ); hazard->setGraphic( ThisHazard );
@ -348,9 +351,6 @@ void CNpcHazard::init()
{ {
CHazardThing::init(); CHazardThing::init();
//m_actorGfx=CActorPool::GetActor( (FileEquate) ACTORS_CLAM_SBK );
//m_spriteBank=0;
m_npcPath.initPath(); m_npcPath.initPath();
m_timer = 0; m_timer = 0;
@ -381,7 +381,6 @@ void CNpcHazard::setGraphic( sThingHazard *ThisHazard )
void CNpcHazard::shutdown() void CNpcHazard::shutdown()
{ {
delete m_modelGfx; delete m_modelGfx;
//if (m_spriteBank) m_spriteBank->dump(); delete m_spriteBank;
// remove waypoints // remove waypoints
m_npcPath.removeAllWaypoints(); m_npcPath.removeAllWaypoints();

View file

@ -59,13 +59,16 @@ public:
NPC_HAZARD_TYPE_MAX, NPC_HAZARD_TYPE_MAX,
}; };
enum
{ // For Dynamic ThingCache
MAX_SUBTYPE =NPC_HAZARD_TYPE_MAX,
};
virtual void init(); virtual void init();
void setGraphic( sThingHazard *ThisHazard ); void setGraphic( sThingHazard *ThisHazard );
void shutdown(); void shutdown();
void think(int _frames); void think(int _frames);
virtual void render(); virtual void render();
void setLayerCollision( class CLayerCollision *_layer ) {m_layerCollision=_layer;}
virtual void setWaypoints( sThingHazard *ThisHazard ); virtual void setWaypoints( sThingHazard *ThisHazard );
void addWaypoint( s32 xPos, s32 yPos ); void addWaypoint( s32 xPos, s32 yPos );
virtual void setRespawnRate( s16 newRespawnRate ) {m_respawnRate=newRespawnRate;} virtual void setRespawnRate( s16 newRespawnRate ) {m_respawnRate=newRespawnRate;}
@ -97,12 +100,10 @@ protected:
NPC_HAZARD_UNIT_TYPE m_type; NPC_HAZARD_UNIT_TYPE m_type;
CNpcPath m_npcPath; CNpcPath m_npcPath;
//CActorGfx *m_actorGfx; //CActorGfx *m_actorGfx;
//SpriteBank *m_spriteBank;
DVECTOR m_base; DVECTOR m_base;
s32 m_timer; s32 m_timer;
bool m_timerActive; bool m_timerActive;
bool m_isActive; bool m_isActive;
class CLayerCollision *m_layerCollision;
s32 m_extension; s32 m_extension;
bool m_extendDir; bool m_extendDir;
s32 m_heading; s32 m_heading;

View file

@ -19,6 +19,8 @@
#include "level\layercollision.h" #include "level\layercollision.h"
#endif #endif
#include "game\game.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CNpcBarrelHazard::init() void CNpcBarrelHazard::init()
@ -61,7 +63,7 @@ void CNpcBarrelHazard::processMovement( int _frames )
{ {
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {
@ -83,7 +85,7 @@ void CNpcBarrelHazard::processMovement( int _frames )
distX = distX / abs( distX ); distX = distX / abs( distX );
if ( m_layerCollision->getHeightFromGround( Pos.vx + ( distX * 3 * _frames ), Pos.vy ) < -maxHeight ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( distX * 3 * _frames ), Pos.vy ) < -maxHeight )
{ {
// there is an obstacle in the way, increment the path point (hopefully this will resolve the problem) // there is an obstacle in the way, increment the path point (hopefully this will resolve the problem)
@ -93,7 +95,7 @@ void CNpcBarrelHazard::processMovement( int _frames )
{ {
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
moveX = distX * 3 * _frames; moveX = distX * 3 * _frames;

View file

@ -64,7 +64,7 @@ void CNpcBoatHazard::processMovement( int _frames )
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {
@ -94,7 +94,7 @@ void CNpcBoatHazard::processMovement( int _frames )
m_reversed = true; m_reversed = true;
} }
if ( m_layerCollision->getHeightFromGround( Pos.vx + ( distX * 3 * _frames ), Pos.vy ) < -maxHeight ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( distX * 3 * _frames ), Pos.vy ) < -maxHeight )
{ {
// there is an obstacle in the way, increment the path point (hopefully this will resolve the problem) // there is an obstacle in the way, increment the path point (hopefully this will resolve the problem)
@ -104,7 +104,7 @@ void CNpcBoatHazard::processMovement( int _frames )
{ {
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {

View file

@ -31,6 +31,9 @@
#include "level\level.h" #include "level\level.h"
#endif #endif
#include "game\game.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CNpcDualPlatformBarrelHazard::init() void CNpcDualPlatformBarrelHazard::init()
@ -80,7 +83,7 @@ void CNpcDualPlatformBarrelHazard::processMovement( int _frames )
distX = distX / abs( distX ); distX = distX / abs( distX );
} }
if ( m_layerCollision->getHeightFromGround( Pos.vx + ( distX * 3 * _frames ), Pos.vy ) < -maxHeight ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( distX * 3 * _frames ), Pos.vy ) < -maxHeight )
{ {
// there is an obstacle in the way, increment the path point (hopefully this will resolve the problem) // there is an obstacle in the way, increment the path point (hopefully this will resolve the problem)
@ -90,7 +93,7 @@ void CNpcDualPlatformBarrelHazard::processMovement( int _frames )
{ {
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {

View file

@ -92,7 +92,7 @@ void CNpcFallingHazard::processMovement( int _frames )
{ {
yMovement = 3 * _frames; yMovement = 3 * _frames;
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight < yMovement ) if ( groundHeight < yMovement )
{ {

View file

@ -19,6 +19,8 @@
#include "level\layercollision.h" #include "level\layercollision.h"
#endif #endif
#include "game\game.h"
void CNpcMasherHazard::init() void CNpcMasherHazard::init()
{ {
CNpcHazard::init(); CNpcHazard::init();
@ -36,7 +38,7 @@ void CNpcMasherHazard::processMovement( int _frames )
s8 groundHeight; s8 groundHeight;
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight < yMovement ) if ( groundHeight < yMovement )
{ {

View file

@ -64,7 +64,7 @@ void CNpcRockShardHazard::processMovement( int _frames )
{ {
yMovement = 6 * _frames; yMovement = 6 * _frames;
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight < yMovement ) if ( groundHeight < yMovement )
{ {

View file

@ -19,6 +19,8 @@
#include "level\layercollision.h" #include "level\layercollision.h"
#endif #endif
#include "game\game.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CNpcRollingRockHazard::init() void CNpcRollingRockHazard::init()
@ -90,7 +92,7 @@ void CNpcRollingRockHazard::processMovement( int _frames )
moveY += m_jumpVel >> 8; moveY += m_jumpVel >> 8;
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx + moveX, Pos.vy + moveY, 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx + moveX, Pos.vy + moveY, 16 );
if ( groundHeight < 16 ) if ( groundHeight < 16 )
{ {
@ -104,7 +106,7 @@ void CNpcRollingRockHazard::processMovement( int _frames )
{ {
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx + moveX, Pos.vy, 64 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx + moveX, Pos.vy, 64 );
if ( groundHeight < 64 ) if ( groundHeight < 64 )
{ {
@ -129,7 +131,7 @@ void CNpcRollingRockHazard::processMovement( int _frames )
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {

View file

@ -43,6 +43,7 @@
#include "system\vid.h" #include "system\vid.h"
#endif #endif
#include "game\game.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -109,10 +110,14 @@ void CJellyfishGenerator::think( int _frames, CLevel *level )
{ {
case 1: case 1:
{ {
enemy = new( "jellyfish" ) CNpcSmallJellyfishBackgroundEnemy; enemy = (CNpcEnemy*)CThingManager::GetThing(CThing::TYPE_ENEMY,CNpcEnemy::NPC_SMALL_JELLYFISH_BACKGROUND);
ASSERT(enemy); if (!enemy)
{
enemy = new( "jellyfish" ) CNpcSmallJellyfishBackgroundEnemy;
ASSERT(enemy);
}
enemy->setType( CNpcEnemy::NPC_SMALL_JELLYFISH_BACKGROUND ); enemy->setType( CNpcEnemy::NPC_SMALL_JELLYFISH_BACKGROUND );
enemy->setThingSubType(CNpcEnemy::NPC_SMALL_JELLYFISH_BACKGROUND);
break; break;
} }
@ -120,15 +125,25 @@ void CJellyfishGenerator::think( int _frames, CLevel *level )
{ {
if ( getRnd() % 4 == 0 ) if ( getRnd() % 4 == 0 )
{ {
enemy = new( "jellyfish" ) CNpcSmallJellyfish2BackgroundEnemy; enemy = (CNpcEnemy*)CThingManager::GetThing(CThing::TYPE_ENEMY,CNpcEnemy::NPC_SMALL_JELLYFISH_2_BACKGROUND);
ASSERT(enemy); if (!enemy)
{
enemy = new( "jellyfish" ) CNpcSmallJellyfish2BackgroundEnemy;
ASSERT(enemy);
}
enemy->setType( CNpcEnemy::NPC_SMALL_JELLYFISH_2_BACKGROUND ); enemy->setType( CNpcEnemy::NPC_SMALL_JELLYFISH_2_BACKGROUND );
enemy->setThingSubType(CNpcEnemy::NPC_SMALL_JELLYFISH_2_BACKGROUND);
} }
else else
{ {
enemy = new( "jellyfish" ) CNpcSmallJellyfishBackgroundEnemy; enemy = (CNpcEnemy*)CThingManager::GetThing(CThing::TYPE_ENEMY,CNpcEnemy::NPC_SMALL_JELLYFISH_BACKGROUND);
ASSERT(enemy); if (!enemy)
{
enemy = new( "jellyfish" ) CNpcSmallJellyfishBackgroundEnemy;
ASSERT(enemy);
}
enemy->setType( CNpcEnemy::NPC_SMALL_JELLYFISH_BACKGROUND ); enemy->setType( CNpcEnemy::NPC_SMALL_JELLYFISH_BACKGROUND );
enemy->setThingSubType(CNpcEnemy::NPC_SMALL_JELLYFISH_BACKGROUND);
} }
break; break;
@ -136,16 +151,19 @@ void CJellyfishGenerator::think( int _frames, CLevel *level )
case 3: case 3:
{ {
enemy = new( "butterfly" ) CNpcButterflyBackgroundEnemy; enemy = (CNpcEnemy*)CThingManager::GetThing(CThing::TYPE_ENEMY,CNpcEnemy::NPC_BUTTERFLY_BACKGROUND);
ASSERT(enemy); if (!enemy)
{
enemy = new( "butterfly" ) CNpcButterflyBackgroundEnemy;
ASSERT(enemy);
}
enemy->setType( CNpcEnemy::NPC_BUTTERFLY_BACKGROUND ); enemy->setType( CNpcEnemy::NPC_BUTTERFLY_BACKGROUND );
enemy->setThingSubType(CNpcEnemy::NPC_BUTTERFLY_BACKGROUND);
break; break;
} }
} }
enemy->init(); enemy->init();
enemy->setLayerCollision( level->getCollisionLayer() );
DVECTOR offset = CLevel::getCameraPos(); DVECTOR offset = CLevel::getCameraPos();

View file

@ -119,7 +119,6 @@ sLayerShadeBackGfx *GfxList=Data->GfxList;
// Render Back Shade // Render Back Shade
// printf("%i %i\n",ThisY,BandHeight);
if (BandHeight>256) BandHeight=256; if (BandHeight>256) BandHeight=256;
// if (ThisY<0) BandHeight=256; // if (ThisY<0) BandHeight=256;
for (i=0; i<BandCount; i++) for (i=0; i<BandCount; i++)

View file

@ -49,7 +49,7 @@ CLayerCollision::CLayerCollision(sLayerHdr *Hdr)
Map=(u8*)MakePtr(Hdr,sizeof(sLayerHdr)); Map=(u8*)MakePtr(Hdr,sizeof(sLayerHdr));
MapWidth=LayerHdr->Width; MapWidth=LayerHdr->Width;
MapHeight=LayerHdr->Height; MapHeight=LayerHdr->Height;
printf("COLLISION LAYER = %i %i\n",MapWidth,MapHeight); // printf("COLLISION LAYER = %i %i\n",MapWidth,MapHeight);
} }
/*****************************************************************************/ /*****************************************************************************/

View file

@ -25,7 +25,7 @@ CLayerTile::CLayerTile(sLevelHdr *LevelHdr,sLayerHdr *Hdr)
MapWidth=LayerHdr->Width; MapWidth=LayerHdr->Width;
MapHeight=LayerHdr->Height; MapHeight=LayerHdr->Height;
printf("%i %i\n",MapWidth,MapHeight); // printf("%i %i\n",MapWidth,MapHeight);
TileBank2d=LevelHdr->TileBank2d; TileBank2d=LevelHdr->TileBank2d;
Map=(sTileMapElem*)MakePtr(Hdr,sizeof(sLayerHdr)); Map=(sTileMapElem*)MakePtr(Hdr,sizeof(sLayerHdr));
} }

View file

@ -140,10 +140,6 @@ void CMapScene::init()
m_font->setOt(10); m_font->setOt(10);
m_font->setJustification(FontBank::JUST_LEFT); m_font->setJustification(FontBank::JUST_LEFT);
m_spriteBank=new ("map screen sprite") SpriteBank();
m_spriteBank->load(SPRITES_SPRITES_SPR);
m_currentChapterSelection=0; m_currentChapterSelection=0;
m_currentLevelSelection=0; m_currentLevelSelection=0;
m_screenImage=MemAlloc(512*256*2,"MapScreen"); m_screenImage=MemAlloc(512*256*2,"MapScreen");
@ -165,7 +161,6 @@ void CMapScene::shutdown()
{ {
ClearScreenImage(); ClearScreenImage();
MemFree(m_screenImage); MemFree(m_screenImage);
m_spriteBank->dump(); delete m_spriteBank;
m_font->dump(); delete m_font; m_font->dump(); delete m_font;
} }
@ -196,8 +191,8 @@ void CMapScene::render()
{ {
sprintf(spatCount,"%d/%d",getSpatulaCollectedCount(m_currentChapterSelection,i),getSpatulaAvailableCount(m_currentChapterSelection,i)); sprintf(spatCount,"%d/%d",getSpatulaCollectedCount(m_currentChapterSelection,i),getSpatulaAvailableCount(m_currentChapterSelection,i));
m_font->print(xpos,ypos,spatCount); m_font->print(xpos,ypos,spatCount);
fh=m_spriteBank->getFrameHeader(s_mapLevelData[m_currentChapterSelection].m_questItemFrames[i]); fh=CGameScene::getSpriteBank()->getFrameHeader(s_mapLevelData[m_currentChapterSelection].m_questItemFrames[i]);
ft4=m_spriteBank->printFT4Scaled(fh,xpos+MAP_LEVEL_WIDTH-fh->W,ypos+MAP_LEVEL_HEIGHT-fh->H,0,0,10,128); ft4=CGameScene::getSpriteBank()->printFT4Scaled(fh,xpos+MAP_LEVEL_WIDTH-fh->W,ypos+MAP_LEVEL_HEIGHT-fh->H,0,0,10,128);
if(!hasQuestItemBeenCollected(m_currentChapterSelection,i)) if(!hasQuestItemBeenCollected(m_currentChapterSelection,i))
{ {
setRGB0(ft4,10,10,10); setRGB0(ft4,10,10,10);
@ -209,8 +204,8 @@ void CMapScene::render()
} }
// Selection cursor // Selection cursor
fh=m_spriteBank->getFrameHeader(FRM__MAPPOINTER); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__MAPPOINTER);
m_spriteBank->printFT4(fh,m_pointerPos.vx-(fh->W/2),m_pointerPos.vy-(fh->H/2),0,0,9); CGameScene::getSpriteBank()->printFT4(fh,m_pointerPos.vx-(fh->W/2),m_pointerPos.vy-(fh->H/2),0,0,9);
char buf[100]; char buf[100];
sprintf(buf,"Chapter %d, Level %d",m_currentChapterSelection+1,m_currentLevelSelection+1); sprintf(buf,"Chapter %d, Level %d",m_currentChapterSelection+1,m_currentLevelSelection+1);

View file

@ -91,8 +91,6 @@ private:
char *m_screenImage; char *m_screenImage;
class SpriteBank *m_spriteBank;
int m_currentChapterSelection; int m_currentChapterSelection;
int m_currentLevelSelection; int m_currentLevelSelection;
DVECTOR m_pointerPos; DVECTOR m_pointerPos;

View file

@ -45,6 +45,7 @@
#include "gfx\otpos.h" #include "gfx\otpos.h"
#endif #endif
#include "game\game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -86,7 +87,7 @@ void CBalloonPickup::init()
CBaseWeaponPickup::init(); CBaseWeaponPickup::init();
m_sin=0; m_sin=0;
fh=getSpriteBank()->getFrameHeader(FRM__BALLOON); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__BALLOON);
setCollisionSize(fh->W,fh->H); setCollisionSize(fh->W,fh->H);
} }
@ -101,7 +102,7 @@ DVECTOR CBalloonPickup::getSizeForPlacement()
DVECTOR size; DVECTOR size;
sFrameHdr *fh; sFrameHdr *fh;
fh=getSpriteBank()->getFrameHeader(FRM__BALLOON); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__BALLOON);
size.vx=fh->W; size.vx=fh->W;
size.vy=fh->H; size.vy=fh->H;
return size; return size;
@ -179,7 +180,7 @@ void CBalloonPickup::renderPickup(DVECTOR *_pos)
int xo1,xo2; int xo1,xo2;
int x,y; int x,y;
sprites=getSpriteBank(); sprites=CGameScene::getSpriteBank();
fh=sprites->getFrameHeader(FRM__BALLOON); fh=sprites->getFrameHeader(FRM__BALLOON);
xo1=((msin((m_sin+balloon_phase)&4095)*balloon_scale1)>>12); xo1=((msin((m_sin+balloon_phase)&4095)*balloon_scale1)>>12);

View file

@ -37,6 +37,7 @@
#include "gfx\otpos.h" #include "gfx\otpos.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -78,7 +79,7 @@ void CBubbleMixturePickup::init()
CBaseRespawningPickup::init(); CBaseRespawningPickup::init();
m_sin=0; m_sin=0;
fh=getSpriteBank()->getFrameHeader(FRM__BUBBLEMIXTURE); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__BUBBLEMIXTURE);
setCollisionSize(fh->W,fh->H); setCollisionSize(fh->W,fh->H);
} }
@ -93,7 +94,7 @@ DVECTOR CBubbleMixturePickup::getSizeForPlacement()
DVECTOR size; DVECTOR size;
sFrameHdr *fh; sFrameHdr *fh;
fh=getSpriteBank()->getFrameHeader(FRM__BUBBLEMIXTURE); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__BUBBLEMIXTURE);
size.vx=fh->W; size.vx=fh->W;
size.vy=fh->H; size.vy=fh->H;
return size; return size;
@ -147,7 +148,7 @@ void CBubbleMixturePickup::renderPickup(DVECTOR *_pos)
sFrameHdr *fh; sFrameHdr *fh;
int x,y; int x,y;
sprites=getSpriteBank(); sprites=CGameScene::getSpriteBank();
fh=sprites->getFrameHeader(FRM__BUBBLEMIXTURE); fh=sprites->getFrameHeader(FRM__BUBBLEMIXTURE);
x=_pos->vx-(fh->W/2); x=_pos->vx-(fh->W/2);
y=_pos->vy-(fh->H/2)+((msin(m_sin)*bubmix_bobscale)>>12); y=_pos->vy-(fh->H/2)+((msin(m_sin)*bubmix_bobscale)>>12);

View file

@ -33,6 +33,7 @@
#include "gfx\otpos.h" #include "gfx\otpos.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -76,7 +77,7 @@ void CGlassesPickup::init()
m_glint=0; m_glint=0;
m_glintRot=0; m_glintRot=0;
fh=getSpriteBank()->getFrameHeader(FRM__GLASSES); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__GLASSES);
setCollisionSize(fh->W,fh->H); setCollisionSize(fh->W,fh->H);
GameScene.getPlayer()->registerAddon(PLAYER_ADDON_GLASSES); GameScene.getPlayer()->registerAddon(PLAYER_ADDON_GLASSES);
@ -93,7 +94,7 @@ DVECTOR CGlassesPickup::getSizeForPlacement()
DVECTOR size; DVECTOR size;
sFrameHdr *fh; sFrameHdr *fh;
fh=getSpriteBank()->getFrameHeader(FRM__GLASSES); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__GLASSES);
size.vx=fh->W; size.vx=fh->W;
size.vy=fh->H; size.vy=fh->H;
return size; return size;
@ -144,7 +145,7 @@ void CGlassesPickup::renderPickup(DVECTOR *_pos)
sFrameHdr *fh; sFrameHdr *fh;
int x,y; int x,y;
sprites=getSpriteBank(); sprites=CGameScene::getSpriteBank();
fh=sprites->getFrameHeader(FRM__GLASSES); fh=sprites->getFrameHeader(FRM__GLASSES);
x=_pos->vx-(fh->W/2); x=_pos->vx-(fh->W/2);
y=_pos->vy-(fh->H/2); y=_pos->vy-(fh->H/2);

View file

@ -33,6 +33,7 @@
#include "gfx\otpos.h" #include "gfx\otpos.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -74,7 +75,7 @@ void CBaseHealthPickup::init()
CBasePickup::init(); CBasePickup::init();
m_sin=0; m_sin=0;
fh=getSpriteBank()->getFrameHeader(getFrameNumber()); fh=CGameScene::getSpriteBank()->getFrameHeader(getFrameNumber());
setCollisionSize(fh->W,fh->H); setCollisionSize(fh->W,fh->H);
} }
@ -89,7 +90,7 @@ DVECTOR CBaseHealthPickup::getSizeForPlacement()
DVECTOR size; DVECTOR size;
sFrameHdr *fh; sFrameHdr *fh;
fh=getSpriteBank()->getFrameHeader(getFrameNumber()); fh=CGameScene::getSpriteBank()->getFrameHeader(getFrameNumber());
size.vx=fh->W; size.vx=fh->W;
size.vy=fh->H; size.vy=fh->H;
return size; return size;
@ -132,7 +133,7 @@ void CBaseHealthPickup::renderPickup(DVECTOR *_pos)
sFrameHdr *fh; sFrameHdr *fh;
int angle; int angle;
sprites=getSpriteBank(); sprites=CGameScene::getSpriteBank();
fh=sprites->getFrameHeader(getFrameNumber()); fh=sprites->getFrameHeader(getFrameNumber());
angle=((msin(m_sin)*health_rotatescale)>>12)&4095; angle=((msin(m_sin)*health_rotatescale)>>12)&4095;
sprites->printRotatedScaledSprite(fh,_pos->vx,_pos->vy,4096,4096,angle,OTPOS__PICKUP_POS); sprites->printRotatedScaledSprite(fh,_pos->vx,_pos->vy,4096,4096,angle,OTPOS__PICKUP_POS);

View file

@ -29,6 +29,7 @@
#include "gfx\otpos.h" #include "gfx\otpos.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -69,7 +70,7 @@ void CHelmetPickup::init()
CBasePickup::init(); CBasePickup::init();
fh=getSpriteBank()->getFrameHeader(FRM__HELMET); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__HELMET);
setCollisionSize(fh->W,fh->H); setCollisionSize(fh->W,fh->H);
} }
@ -84,7 +85,7 @@ DVECTOR CHelmetPickup::getSizeForPlacement()
DVECTOR size; DVECTOR size;
sFrameHdr *fh; sFrameHdr *fh;
fh=getSpriteBank()->getFrameHeader(FRM__HELMET); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__HELMET);
size.vx=fh->W; size.vx=fh->W;
size.vy=fh->H; size.vy=fh->H;
return size; return size;
@ -115,7 +116,7 @@ void CHelmetPickup::renderPickup(DVECTOR *_pos)
sFrameHdr *fh; sFrameHdr *fh;
int x,y; int x,y;
sprites=getSpriteBank(); sprites=CGameScene::getSpriteBank();
fh=sprites->getFrameHeader(FRM__HELMET); fh=sprites->getFrameHeader(FRM__HELMET);
x=_pos->vx-(fh->W/2); x=_pos->vx-(fh->W/2);
y=_pos->vy-(fh->H/2); y=_pos->vy-(fh->H/2);

View file

@ -79,6 +79,7 @@
#include "pickups\pquest.h" #include "pickups\pquest.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -117,8 +118,6 @@ void CBasePickup::init()
{ {
CPickupThing::init(); CPickupThing::init();
m_spriteBank=new ("pickup sprite") SpriteBank();
m_spriteBank->load(SPRITES_SPRITES_SPR);
} }
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
@ -129,7 +128,6 @@ void CBasePickup::init()
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
void CBasePickup::shutdown() void CBasePickup::shutdown()
{ {
m_spriteBank->dump(); delete m_spriteBank;
CPickupThing::shutdown(); CPickupThing::shutdown();
} }
@ -320,7 +318,7 @@ void CBaseWeaponSimplePickup::init()
CBaseWeaponPickup::init(); CBaseWeaponPickup::init();
fh=getSpriteBank()->getFrameHeader(FRM__NET); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__NET);
setCollisionSize(fh->W,fh->H); setCollisionSize(fh->W,fh->H);
} }
@ -335,7 +333,7 @@ DVECTOR CBaseWeaponSimplePickup::getSizeForPlacement()
DVECTOR size; DVECTOR size;
sFrameHdr *fh; sFrameHdr *fh;
fh=getSpriteBank()->getFrameHeader(getWeaponSpriteFrame()); fh=CGameScene::getSpriteBank()->getFrameHeader(getWeaponSpriteFrame());
size.vx=fh->W; size.vx=fh->W;
size.vy=fh->H; size.vy=fh->H;
return size; return size;
@ -353,7 +351,7 @@ void CBaseWeaponSimplePickup::renderPickup(DVECTOR *_pos)
sFrameHdr *fh; sFrameHdr *fh;
int x,y; int x,y;
sprites=getSpriteBank(); sprites=CGameScene::getSpriteBank();
fh=sprites->getFrameHeader(getWeaponSpriteFrame()); fh=sprites->getFrameHeader(getWeaponSpriteFrame());
x=_pos->vx-(fh->W/2); x=_pos->vx-(fh->W/2);
y=_pos->vy-(fh->H/2); y=_pos->vy-(fh->H/2);
@ -374,6 +372,8 @@ CBasePickup *createPickup(const PICKUP_TYPE _type,const DVECTOR *_pos)
CBasePickup *pickup; CBasePickup *pickup;
DVECTOR pickupPos; DVECTOR pickupPos;
pickup = (CBasePickup*)CThingManager::GetThing(CThing::TYPE_PICKUP,_type);
if (!pickup)
switch(_type) switch(_type)
{ {
case PICKUP__BIG_HEALTH: case PICKUP__BIG_HEALTH:
@ -447,6 +447,7 @@ CBasePickup *createPickup(const PICKUP_TYPE _type,const DVECTOR *_pos)
return NULL; return NULL;
} }
pickup->setThingSubType(_type);
pickup->init(); pickup->init();
pickupPos=pickup->getSizeForPlacement(); pickupPos=pickup->getSizeForPlacement();
pickupPos.vx=_pos->vx+(pickupPos.vx/2); pickupPos.vx=_pos->vx+(pickupPos.vx/2);

View file

@ -49,6 +49,7 @@ typedef enum
PICKUP__QUEST_ITEM, PICKUP__QUEST_ITEM,
PICKUP__BALLOON_AND_SPATULA, PICKUP__BALLOON_AND_SPATULA,
PICKUP__JELLY_LAUNCHER, PICKUP__JELLY_LAUNCHER,
PICKUP__MAX
} }
PICKUP_TYPE; PICKUP_TYPE;
@ -60,6 +61,10 @@ PICKUP_TYPE;
class CBasePickup : public CPickupThing class CBasePickup : public CPickupThing
{ {
public: public:
enum
{ // For Dynamic ThingCache
MAX_SUBTYPE =PICKUP__MAX,
};
virtual void init(); virtual void init();
virtual void shutdown(); virtual void shutdown();
virtual void think(int _frames); virtual void think(int _frames);
@ -75,7 +80,6 @@ protected:
DEFAULT_VISIBILITY_RADIUS=32, DEFAULT_VISIBILITY_RADIUS=32,
}; };
class SpriteBank *getSpriteBank() {return m_spriteBank;}
virtual int getVisibilityRadius() {return DEFAULT_VISIBILITY_RADIUS;} virtual int getVisibilityRadius() {return DEFAULT_VISIBILITY_RADIUS;}
virtual void thinkPickup(int _Frames) {;} virtual void thinkPickup(int _Frames) {;}
@ -84,7 +88,6 @@ protected:
virtual void collidedWith(CThing *_thisThing); virtual void collidedWith(CThing *_thisThing);
private: private:
class SpriteBank *m_spriteBank;
}; };

View file

@ -37,6 +37,7 @@
#include "gfx\otpos.h" #include "gfx\otpos.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -78,7 +79,7 @@ void CJellyLauncherAmmoPickup::init()
CBasePickup::init(); CBasePickup::init();
m_rattle=0; m_rattle=0;
fh=getSpriteBank()->getFrameHeader(FRM__JELLYAMMO); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__JELLYAMMO);
setCollisionSize(fh->W,fh->H); setCollisionSize(fh->W,fh->H);
} }
@ -93,7 +94,7 @@ DVECTOR CJellyLauncherAmmoPickup::getSizeForPlacement()
DVECTOR size; DVECTOR size;
sFrameHdr *fh; sFrameHdr *fh;
fh=getSpriteBank()->getFrameHeader(FRM__JELLYAMMO); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__JELLYAMMO);
size.vx=fh->W; size.vx=fh->W;
size.vy=fh->H; size.vy=fh->H;
return size; return size;
@ -139,7 +140,7 @@ void CJellyLauncherAmmoPickup::renderPickup(DVECTOR *_pos)
sFrameHdr *fh; sFrameHdr *fh;
int angle; int angle;
sprites=getSpriteBank(); sprites=CGameScene::getSpriteBank();
fh=sprites->getFrameHeader(FRM__JELLYAMMO); fh=sprites->getFrameHeader(FRM__JELLYAMMO);
if(m_rattle<=jlammo_rattlecount*4095) if(m_rattle<=jlammo_rattlecount*4095)
{ {

View file

@ -33,6 +33,7 @@
#include "gfx\otpos.h" #include "gfx\otpos.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -74,7 +75,7 @@ void CLifePickup::init()
CBasePickup::init(); CBasePickup::init();
m_sin=0; m_sin=0;
fh=getSpriteBank()->getFrameHeader(FRM__PANTS); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__PANTS);
setCollisionSize(fh->W,fh->H); setCollisionSize(fh->W,fh->H);
} }
@ -89,7 +90,7 @@ DVECTOR CLifePickup::getSizeForPlacement()
DVECTOR size; DVECTOR size;
sFrameHdr *fh; sFrameHdr *fh;
fh=getSpriteBank()->getFrameHeader(FRM__PANTS); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__PANTS);
size.vx=fh->W; size.vx=fh->W;
size.vy=fh->H; size.vy=fh->H;
return size; return size;
@ -133,7 +134,7 @@ void CLifePickup::renderPickup(DVECTOR *_pos)
int x,y; int x,y;
int size; int size;
sprites=getSpriteBank(); sprites=CGameScene::getSpriteBank();
fh=sprites->getFrameHeader(FRM__PANTS); fh=sprites->getFrameHeader(FRM__PANTS);
x=_pos->vx-(fh->W/2); x=_pos->vx-(fh->W/2);
y=_pos->vy-(fh->H/2); y=_pos->vy-(fh->H/2);

View file

@ -37,6 +37,7 @@
#include "game\game.h" #include "game\game.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -130,7 +131,7 @@ void CQuestItemPickup::init()
} }
ASSERT(m_gfxFrame!=-1); ASSERT(m_gfxFrame!=-1);
fh=getSpriteBank()->getFrameHeader(m_gfxFrame); fh=CGameScene::getSpriteBank()->getFrameHeader(m_gfxFrame);
setCollisionSize(fh->W,fh->H); setCollisionSize(fh->W,fh->H);
} }
@ -145,7 +146,7 @@ DVECTOR CQuestItemPickup::getSizeForPlacement()
DVECTOR size; DVECTOR size;
sFrameHdr *fh; sFrameHdr *fh;
fh=getSpriteBank()->getFrameHeader(m_gfxFrame); fh=CGameScene::getSpriteBank()->getFrameHeader(m_gfxFrame);
size.vx=fh->W; size.vx=fh->W;
size.vy=fh->H; size.vy=fh->H;
return size; return size;
@ -209,7 +210,7 @@ void CQuestItemPickup::renderPickup(DVECTOR *_pos)
sFrameHdr *fh; sFrameHdr *fh;
int x,y; int x,y;
sprites=getSpriteBank(); sprites=CGameScene::getSpriteBank();
fh=sprites->getFrameHeader(m_gfxFrame); fh=sprites->getFrameHeader(m_gfxFrame);
x=_pos->vx-(fh->W/2); x=_pos->vx-(fh->W/2);
y=_pos->vy-(fh->H/2); y=_pos->vy-(fh->H/2);

View file

@ -33,6 +33,7 @@
#include "gfx\otpos.h" #include "gfx\otpos.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -74,7 +75,7 @@ void CShoesPickup::init()
CBaseRespawningPickup::init(); CBaseRespawningPickup::init();
m_sin=0; m_sin=0;
fh=getSpriteBank()->getFrameHeader(FRM__SHOE); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__SHOE);
setCollisionSize(fh->W,fh->H); setCollisionSize(fh->W,fh->H);
} }
@ -89,7 +90,7 @@ DVECTOR CShoesPickup::getSizeForPlacement()
DVECTOR size; DVECTOR size;
sFrameHdr *fh; sFrameHdr *fh;
fh=getSpriteBank()->getFrameHeader(FRM__SHOE); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__SHOE);
size.vx=fh->W; size.vx=fh->W;
size.vy=fh->H; size.vy=fh->H;
return size; return size;
@ -144,7 +145,7 @@ void CShoesPickup::renderPickup(DVECTOR *_pos)
sFrameHdr *fh; sFrameHdr *fh;
int x,y,yoff; int x,y,yoff;
sprites=getSpriteBank(); sprites=CGameScene::getSpriteBank();
fh=sprites->getFrameHeader(FRM__SHOE); fh=sprites->getFrameHeader(FRM__SHOE);
x=_pos->vx-(fh->W/2); x=_pos->vx-(fh->W/2);
y=_pos->vy-(fh->H/2); y=_pos->vy-(fh->H/2);

View file

@ -37,6 +37,7 @@
#include "game\game.h" #include "game\game.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -79,7 +80,7 @@ void CSpatulaPickup::init()
m_glint=0; m_glint=0;
m_glintRot=0; m_glintRot=0;
fh=getSpriteBank()->getFrameHeader(FRM__SPATULA); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__SPATULA);
setCollisionSize(fh->W,fh->H); setCollisionSize(fh->W,fh->H);
} }
@ -94,7 +95,7 @@ DVECTOR CSpatulaPickup::getSizeForPlacement()
DVECTOR size; DVECTOR size;
sFrameHdr *fh; sFrameHdr *fh;
fh=getSpriteBank()->getFrameHeader(FRM__SPATULA); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__SPATULA);
size.vx=fh->W; size.vx=fh->W;
size.vy=fh->H; size.vy=fh->H;
return size; return size;
@ -143,7 +144,7 @@ void CSpatulaPickup::renderPickup(DVECTOR *_pos)
sFrameHdr *fh; sFrameHdr *fh;
int x,y; int x,y;
sprites=getSpriteBank(); sprites=CGameScene::getSpriteBank();
fh=sprites->getFrameHeader(FRM__SPATULA); fh=sprites->getFrameHeader(FRM__SPATULA);
x=_pos->vx-(fh->W/2); x=_pos->vx-(fh->W/2);
y=_pos->vy-(fh->H/2); y=_pos->vy-(fh->H/2);
@ -213,7 +214,7 @@ void CBalloonAndSpatulaPickup::renderPickup(DVECTOR *_pos)
int xo1,xo2; int xo1,xo2;
int x,y; int x,y;
sprites=getSpriteBank(); sprites=CGameScene::getSpriteBank();
fh=sprites->getFrameHeader(FRM__BALLOON); fh=sprites->getFrameHeader(FRM__BALLOON);
fhspat=sprites->getFrameHeader(FRM__SPATULA); fhspat=sprites->getFrameHeader(FRM__SPATULA);

View file

@ -49,7 +49,7 @@ void CBridgeBalloon::render()
renderPos.vx = Pos.vx - CamPos.vx; renderPos.vx = Pos.vx - CamPos.vx;
renderPos.vy = Pos.vy - CamPos.vy; renderPos.vy = Pos.vy - CamPos.vy;
m_spriteBank->printFT4(FRM__BALLOON,renderPos.vx,renderPos.vy,0,0,10); CGameScene::getSpriteBank()->printFT4(FRM__BALLOON,renderPos.vx,renderPos.vy,0,0,10);
} }
} }
@ -57,15 +57,12 @@ void CBridgeBalloon::render()
void CBridgeBalloon::init() void CBridgeBalloon::init()
{ {
m_spriteBank=new ("enemy sprites") SpriteBank();
m_spriteBank->load(SPRITES_SPRITES_SPR);
} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CBridgeBalloon::shutdown() void CBridgeBalloon::shutdown()
{ {
if (m_spriteBank) m_spriteBank->dump(); delete m_spriteBank;
} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View file

@ -28,7 +28,6 @@ public:
virtual int checkCollisionAgainst(CThing *_thisThing, int _frames); virtual int checkCollisionAgainst(CThing *_thisThing, int _frames);
protected: protected:
DVECTOR Pos; DVECTOR Pos;
SpriteBank *m_spriteBank;
}; };
class CNpcBalloonBridgePlatform : public CNpcPlatform class CNpcBalloonBridgePlatform : public CNpcPlatform

View file

@ -92,7 +92,6 @@ void CNpcGeyserPlatformGenerator::think( int _frames )
} }
} }
newPlatform->setLayerCollision( m_layerCollision );
newPlatform->setTiltable( false ); newPlatform->setTiltable( false );
newPlatform->postInit(); newPlatform->postInit();
} }

View file

@ -67,7 +67,7 @@ void CNpcCartPlatform::processMovement( int _frames )
s32 checkDist = yMovement + 50; s32 checkDist = yMovement + 50;
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx + moveX, Pos.vy, checkDist ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx + moveX, Pos.vy, checkDist );
if ( groundHeight < checkDist ) if ( groundHeight < checkDist )
{ {
@ -116,7 +116,7 @@ void CNpcCartPlatform::processMovement( int _frames )
s32 yDiff; s32 yDiff;
yDiff = m_layerCollision->getHeightFromGround( testPos1.vx, testPos1.vy, sensorDist + 1 ); yDiff = CGameScene::getCollision()->getHeightFromGround( testPos1.vx, testPos1.vy, sensorDist + 1 );
if ( yDiff <= sensorDist ) if ( yDiff <= sensorDist )
{ {
@ -125,7 +125,7 @@ void CNpcCartPlatform::processMovement( int _frames )
testPos1.vy += yDiff; testPos1.vy += yDiff;
} }
yDiff = m_layerCollision->getHeightFromGround( testPos2.vx, testPos2.vy, sensorDist + 1 ); yDiff = CGameScene::getCollision()->getHeightFromGround( testPos2.vx, testPos2.vy, sensorDist + 1 );
if ( yDiff <= sensorDist ) if ( yDiff <= sensorDist )
{ {

View file

@ -62,7 +62,7 @@ void CNpcFallingPlatform::processMovement( int _frames )
moveY = -moveY; moveY = -moveY;
} }
s32 groundHeight = m_layerCollision->getHeightFromGround( Pos.vx + moveX, Pos.vy + moveY, 16 ); s32 groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx + moveX, Pos.vy + moveY, 16 );
if ( groundHeight < moveY ) if ( groundHeight < moveY )
{ {

View file

@ -56,11 +56,11 @@ void CNpcFallingNoRespawnPlatform::processMovement( int _frames )
moveY = -moveY; moveY = -moveY;
} }
s32 groundHeight = m_layerCollision->getHeightFromGround( Pos.vx + moveX, Pos.vy + moveY, 16 ); s32 groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx + moveX, Pos.vy + moveY, 16 );
if ( groundHeight < moveY ) if ( groundHeight < moveY )
{ {
if ( ( m_layerCollision->getCollisionBlock( Pos.vx, Pos.vy + groundHeight + 8 ) & COLLISION_TYPE_MASK ) != (7<<COLLISION_TYPE_FLAG_SHIFT) ) if ( ( CGameScene::getCollision()->getCollisionBlock( Pos.vx, Pos.vy + groundHeight + 8 ) & COLLISION_TYPE_MASK ) != (7<<COLLISION_TYPE_FLAG_SHIFT) )
{ {
moveY = groundHeight; moveY = groundHeight;
moveX = 2 * _frames; moveX = 2 * _frames;

View file

@ -97,7 +97,6 @@ void CNpcFallingPlatformGenerator::think( int _frames )
//startPos.vy = 100; //startPos.vy = 100;
newPlatform->init( startPos ); newPlatform->init( startPos );
ASSERT(m_layerCollision);
while( sourceWaypoint ) while( sourceWaypoint )
{ {
@ -106,7 +105,6 @@ void CNpcFallingPlatformGenerator::think( int _frames )
} }
} }
newPlatform->setLayerCollision( m_layerCollision );
newPlatform->setTiltable( false ); newPlatform->setTiltable( false );
newPlatform->postInit(); newPlatform->postInit();
} }

View file

@ -169,9 +169,11 @@ CNpcPlatform *CNpcPlatform::Create(sThingPlatform *ThisPlatform)
{ {
CNpcPlatform *platform; CNpcPlatform *platform;
NPC_PLATFORM_UNIT_TYPE platformType = getTypeFromMapEdit( ThisPlatform->Type ); NPC_PLATFORM_UNIT_TYPE Type = getTypeFromMapEdit( ThisPlatform->Type );
switch( platformType ) platform = (CNpcPlatform*)CThingManager::GetThing(CThing::TYPE_PLATFORM,Type);
if (!platform)
switch( Type )
{ {
case NPC_LINEAR_PLATFORM: case NPC_LINEAR_PLATFORM:
{ {
@ -271,7 +273,7 @@ CNpcPlatform *CNpcPlatform::Create(sThingPlatform *ThisPlatform)
dualPlatformMaster->setOtherPlatform( dualPlatformSlave ); dualPlatformMaster->setOtherPlatform( dualPlatformSlave );
dualPlatformSlave->setOtherPlatform( dualPlatformMaster ); dualPlatformSlave->setOtherPlatform( dualPlatformMaster );
dualPlatformSlave->setType( platformType ); dualPlatformSlave->setType( Type );
dualPlatformSlave->setGraphic( ThisPlatform ); dualPlatformSlave->setGraphic( ThisPlatform );
dualPlatformSlave->setTiltable( false ); dualPlatformSlave->setTiltable( false );
@ -383,7 +385,8 @@ CNpcPlatform *CNpcPlatform::Create(sThingPlatform *ThisPlatform)
} }
ASSERT(platform); ASSERT(platform);
platform->setType( platformType ); platform->setType( Type );
platform->setThingSubType( Type );
platform->setGraphic( ThisPlatform ); platform->setGraphic( ThisPlatform );
platform->setWaypoints( ThisPlatform ); platform->setWaypoints( ThisPlatform );
@ -471,8 +474,6 @@ void CNpcPlatform::init()
m_tiltable = false; m_tiltable = false;
m_initRotation = 0; m_initRotation = 0;
m_layerCollision = NULL;
m_lifetime = 0; m_lifetime = 0;
m_lifetimeType = m_data[m_type].lifetimeType; m_lifetimeType = m_data[m_type].lifetimeType;
@ -664,7 +665,8 @@ void CNpcPlatform::think(int _frames)
void CNpcPlatform::setCollisionAngle(int newAngle) void CNpcPlatform::setCollisionAngle(int newAngle)
{ {
CPlatformThing::setCollisionAngle(newAngle); m_collisionAngle=newAngle;
// CPlatformThing::setCollisionAngle(newAngle);
calculateBoundingBoxSize(); calculateBoundingBoxSize();
CPlayer *player; CPlayer *player;

View file

@ -88,6 +88,10 @@ public:
NPC_CLAM_PLATFORM, NPC_CLAM_PLATFORM,
NPC_PLATFORM_TYPE_MAX, NPC_PLATFORM_TYPE_MAX,
}; };
enum
{ // For Dynamic ThingCache
MAX_SUBTYPE =NPC_PLATFORM_TYPE_MAX,
};
void init(); void init();
void init( DVECTOR initPos ); void init( DVECTOR initPos );
@ -99,7 +103,6 @@ public:
virtual u8 canDrop() {return true;} virtual u8 canDrop() {return true;}
void setType( NPC_PLATFORM_UNIT_TYPE newType ) {m_type = newType;} void setType( NPC_PLATFORM_UNIT_TYPE newType ) {m_type = newType;}
void setTypeFromMapEdit( u16 newType ); void setTypeFromMapEdit( u16 newType );
void setLayerCollision( class CLayerCollision *_layer ) {m_layerCollision=_layer;}
virtual int checkCollisionAgainst(CThing *_thisThing, int _frames); virtual int checkCollisionAgainst(CThing *_thisThing, int _frames);
virtual u8 checkCollisionDelta( CThing *_thisThing, int threshold, CRECT collisionArea ); virtual u8 checkCollisionDelta( CThing *_thisThing, int threshold, CRECT collisionArea );
virtual int getHeightFromPlatformAtPosition(int _x,int _y, int offsetX = 0, int offsetY = 0); virtual int getHeightFromPlatformAtPosition(int _x,int _y, int offsetX = 0, int offsetY = 0);
@ -179,8 +182,6 @@ protected:
static s32 playerXDistSqr; static s32 playerXDistSqr;
static s32 playerYDistSqr; static s32 playerYDistSqr;
class CLayerCollision *m_layerCollision;
// internal variables // internal variables
NPC_PLATFORM_UNIT_TYPE m_type; NPC_PLATFORM_UNIT_TYPE m_type;
@ -223,10 +224,13 @@ protected:
protected: protected:
virtual void setCollisionAngle(int newAngle); // Actually.. this probly doesn't need to be in the base calss anymore.. :/
virtual void calculateNonRotatedCollisionData(); virtual void calculateNonRotatedCollisionData();
virtual void calculateBoundingBoxSize(); virtual void calculateBoundingBoxSize();
virtual void setCollisionAngle(int newAngle); // Actually.. this probly doesn't need to be in the base calss anymore.. :/
s16 getCollisionAngle() {return m_collisionAngle;}
s16 m_collisionAngle;
}; };

View file

@ -66,7 +66,7 @@ void CNpcLeafPlatform::processMovement( int _frames )
moveY = -moveY; moveY = -moveY;
} }
s32 groundHeight = m_layerCollision->getHeightFromGround( Pos.vx + moveX, Pos.vy + moveY, 16 ); s32 groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx + moveX, Pos.vy + moveY, 16 );
if ( groundHeight < moveY ) if ( groundHeight < moveY )
{ {

View file

@ -55,7 +55,7 @@ void CNpcRaftPlatform::processMovement( int _frames )
{ {
Pos.vy += _frames; Pos.vy += _frames;
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy - 32 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy - 32 );
if ( groundHeight <= 0 ) if ( groundHeight <= 0 )
{ {
@ -85,7 +85,7 @@ void CNpcRaftPlatform::processMovement( int _frames )
distX = distX / abs( distX ); distX = distX / abs( distX );
if ( m_layerCollision->getHeightFromGround( Pos.vx + ( distX * m_speed * _frames ), Pos.vy ) < -maxHeight ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( distX * m_speed * _frames ), Pos.vy ) < -maxHeight )
{ {
// there is an obstacle in the way, increment the path point (hopefully this will resolve the problem) // there is an obstacle in the way, increment the path point (hopefully this will resolve the problem)
@ -95,7 +95,7 @@ void CNpcRaftPlatform::processMovement( int _frames )
{ {
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {
@ -119,7 +119,7 @@ void CNpcRaftPlatform::processMovement( int _frames )
} }
else else
{ {
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {

View file

@ -61,7 +61,7 @@ void CNpcSteerableBarrelPlatform::processMovement( int _frames )
// check for collision // check for collision
if ( m_layerCollision->getHeightFromGround( Pos.vx + moveX, Pos.vy ) < -maxHeight ) if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + moveX, Pos.vy ) < -maxHeight )
{ {
moveX = 0; moveX = 0;
} }
@ -80,7 +80,7 @@ void CNpcSteerableBarrelPlatform::processMovement( int _frames )
// check for vertical movement // check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx + moveX, Pos.vy, yMovement + 16 ); groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx + moveX, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement ) if ( groundHeight <= yMovement )
{ {

View file

@ -596,10 +596,6 @@ void CPlayer::init()
m_fontBank->initialise(&standardFont); m_fontBank->initialise(&standardFont);
m_fontBank->setOt(5); m_fontBank->setOt(5);
m_spriteBank=new ("PlayerSprites") SpriteBank();
m_spriteBank->load(SPRITES_SPRITES_SPR);
m_layerCollision=NULL;
m_actorGfx=CActorPool::GetActor(ACTORS_SPONGEBOB_SBK); m_actorGfx=CActorPool::GetActor(ACTORS_SPONGEBOB_SBK);
@ -665,7 +661,6 @@ void CPlayer::shutdown()
} }
delete m_actorGfx; delete m_actorGfx;
m_spriteBank->dump(); delete m_spriteBank;
m_fontBank->dump(); delete m_fontBank; m_fontBank->dump(); delete m_fontBank;
CPlayerThing::shutdown(); CPlayerThing::shutdown();
@ -1200,10 +1195,10 @@ for(int i=0;i<NUM_LASTPOS;i++)
} }
int ygap; int ygap;
ygap=m_spriteBank->getFrameHeader(*frames)->H; ygap=CGameScene::getSpriteBank()->getFrameHeader(*frames)->H;
for(i=5;i>0;i--) for(i=5;i>0;i--)
{ {
ft4=m_spriteBank->printFT4(*frames++,x,y,0,0,0); ft4=CGameScene::getSpriteBank()->printFT4(*frames++,x,y,0,0,0);
setSemiTrans(ft4,i>m_health); setSemiTrans(ft4,i>m_health);
y+=ygap; y+=ygap;
} }
@ -1215,11 +1210,11 @@ for(int i=0;i<NUM_LASTPOS;i++)
sFrameHdr *fh; sFrameHdr *fh;
int V,W,H,partH; int V,W,H,partH;
ft4=m_spriteBank->printFT4(FRM__WATERHILIGHT,HEALTH_ICONX,HEALTH_ICONY,0,0,0); ft4=CGameScene::getSpriteBank()->printFT4(FRM__WATERHILIGHT,HEALTH_ICONX,HEALTH_ICONY,0,0,0);
setSemiTrans(ft4,true); setSemiTrans(ft4,true);
fh=m_spriteBank->getFrameHeader(FRM__WATER); fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__WATER);
ft4=m_spriteBank->printFT4(fh,0,0,0,0,0); ft4=CGameScene::getSpriteBank()->printFT4(fh,0,0,0,0,0);
setSemiTrans(ft4,true); setSemiTrans(ft4,true);
V=fh->V; V=fh->V;
W=fh->W; W=fh->W;
@ -1230,7 +1225,7 @@ for(int i=0;i<NUM_LASTPOS;i++)
ft4->v0=V+(partH); ft4->v0=V+(partH);
ft4->v1=V+(partH); ft4->v1=V+(partH);
m_spriteBank->printFT4(FRM__WATERMETER,HEALTH_ICONX,HEALTH_ICONY,0,0,0); CGameScene::getSpriteBank()->printFT4(FRM__WATERMETER,HEALTH_ICONX,HEALTH_ICONY,0,0,0);
} }
@ -1242,18 +1237,18 @@ for(int i=0;i<NUM_LASTPOS;i++)
if(isWearingBoots()) if(isWearingBoots())
{ {
int x,y; int x,y;
sFrameHdr *fh=m_spriteBank->getFrameHeader(FRM__SHOE); sFrameHdr *fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__SHOE);
x=itemX-(fh->W/2); x=itemX-(fh->W/2);
y=COLLECTEDITEM_BASEY-(fh->H/2); y=COLLECTEDITEM_BASEY-(fh->H/2);
m_spriteBank->printFT4(fh,x+2,y+2,0,0,0); CGameScene::getSpriteBank()->printFT4(fh,x+2,y+2,0,0,0);
m_spriteBank->printFT4(fh,x-2,y-2,0,0,0); CGameScene::getSpriteBank()->printFT4(fh,x-2,y-2,0,0,0);
itemX+=COLLECTEDITEM_GAP; itemX+=COLLECTEDITEM_GAP;
} }
/* /*
if(isWearingDivingHelmet()) if(isWearingDivingHelmet())
{ {
sFrameHdr *fh=m_spriteBank->getFrameHeader(FRM__HELMET); sFrameHdr *fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__HELMET);
m_spriteBank->printFT4(fh,itemX-(fh->W/2),COLLECTEDITEM_BASEY-(fh->H/2),0,0,0); CGameScene::getSpriteBank()->printFT4(fh,itemX-(fh->W/2),COLLECTEDITEM_BASEY-(fh->H/2),0,0,0);
itemX+=COLLECTEDITEM_GAP; itemX+=COLLECTEDITEM_GAP;
} }
*/ */
@ -1291,7 +1286,7 @@ int CPlayer::getHeightFromGround(int _x,int _y,int _maxHeight)
{ {
int height; int height;
height=m_layerCollision->getHeightFromGround(_x,_y,_maxHeight); height=CGameScene::getCollision()->getHeightFromGround(_x,_y,_maxHeight);
if(height>=_maxHeight) if(height>=_maxHeight)
{ {
CThing *platform; CThing *platform;
@ -1337,7 +1332,7 @@ int CPlayer::getHeightFromPlatformNoGround(int _x,int _y,int _maxHeight)
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
int CPlayer::getHeightFromGroundNoPlatform(int _x,int _y,int _maxHeight=32) int CPlayer::getHeightFromGroundNoPlatform(int _x,int _y,int _maxHeight=32)
{ {
return( m_layerCollision->getHeightFromGround(_x,_y,_maxHeight) ); return( CGameScene::getCollision()->getHeightFromGround(_x,_y,_maxHeight) );
} }
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
@ -1796,7 +1791,7 @@ int CPlayer::canDoLookAround()
void CPlayer::inSoakUpState() void CPlayer::inSoakUpState()
{ {
if(isWearingDivingHelmet()&& if(isWearingDivingHelmet()&&
(m_layerCollision->getCollisionBlock(Pos.vx,Pos.vy)&COLLISION_TYPE_MASK)==COLLISION_TYPE_FLAG_WATER) (CGameScene::getCollision()->getCollisionBlock(Pos.vx,Pos.vy)&COLLISION_TYPE_MASK)==COLLISION_TYPE_FLAG_WATER)
{ {
m_healthWaterLevel+=waterSoakUpSpeed; m_healthWaterLevel+=waterSoakUpSpeed;
if(m_healthWaterLevel>WATERMAXHEALTH) if(m_healthWaterLevel>WATERMAXHEALTH)
@ -2096,7 +2091,7 @@ void CPlayer::shove( DVECTOR move )
int colHeight; int colHeight;
// X movement // X movement
colHeight=m_layerCollision->getHeightFromGround(Pos.vx+move.vx,Pos.vy,5); colHeight=CGameScene::getCollision()->getHeightFromGround(Pos.vx+move.vx,Pos.vy,5);
if(colHeight<0) if(colHeight<0)
{ {
// Stop at the edge of the obstruction // Stop at the edge of the obstruction
@ -2114,7 +2109,7 @@ void CPlayer::shove( DVECTOR move )
cx=Pos.vx; cx=Pos.vx;
for(i=0;i<vx;i++) for(i=0;i<vx;i++)
{ {
if(m_layerCollision->getHeightFromGround(cx,Pos.vy)<0) if(CGameScene::getCollision()->getHeightFromGround(cx,Pos.vy)<0)
{ {
break; break;
} }
@ -2130,7 +2125,7 @@ void CPlayer::shove( DVECTOR move )
} }
// Y movement // Y movement
colHeight=m_layerCollision->getHeightFromGround(Pos.vx,Pos.vy+move.vy,5); colHeight=CGameScene::getCollision()->getHeightFromGround(Pos.vx,Pos.vy+move.vy,5);
if(colHeight<0) if(colHeight<0)
{ {
// Stop at the edge of the obstruction // Stop at the edge of the obstruction
@ -2148,7 +2143,7 @@ void CPlayer::shove( DVECTOR move )
cy=Pos.vy; cy=Pos.vy;
for(i=0;i<vy;i++) for(i=0;i<vy;i++)
{ {
if(m_layerCollision->getHeightFromGround(Pos.vx,cy)<0) if(CGameScene::getCollision()->getHeightFromGround(Pos.vx,cy)<0)
{ {
break; break;
} }
@ -2263,7 +2258,7 @@ int CPlayer::moveVertical(int _moveDistance)
if(colHeightBefore>=0&&colHeightAfter<=0) if(colHeightBefore>=0&&colHeightAfter<=0)
{ {
// About to hit a 'fall to death' block? // About to hit a 'fall to death' block?
if((m_layerCollision->getCollisionBlock(pos.vx,pos.vy+_moveDistance)&COLLISION_TYPE_MASK)!=COLLISION_TYPE_FLAG_DEATH) if((CGameScene::getCollision()->getCollisionBlock(pos.vx,pos.vy+_moveDistance)&COLLISION_TYPE_MASK)!=COLLISION_TYPE_FLAG_DEATH)
{ {
// No // No
// Stick at ground level // Stick at ground level
@ -2287,7 +2282,7 @@ int CPlayer::moveVertical(int _moveDistance)
{ {
// Must be below ground // Must be below ground
// Are we jumping into an impassable block? // Are we jumping into an impassable block?
if((m_layerCollision->getCollisionBlock(pos.vx,pos.vy+_moveDistance)&COLLISION_TYPE_MASK)!=COLLISION_TYPE_FLAG_NORMAL&& if((CGameScene::getCollision()->getCollisionBlock(pos.vx,pos.vy+_moveDistance)&COLLISION_TYPE_MASK)!=COLLISION_TYPE_FLAG_NORMAL&&
getHeightFromGround(pos.vx,pos.vy+_moveDistance)<=0) getHeightFromGround(pos.vx,pos.vy+_moveDistance)<=0)
{ {
pos.vy=(pos.vy&0xfff0); pos.vy=(pos.vy&0xfff0);
@ -2298,7 +2293,7 @@ int CPlayer::moveVertical(int _moveDistance)
else else
{ {
// Stood on any important types of collision? // Stood on any important types of collision?
switch(m_layerCollision->getCollisionBlock(pos.vx,pos.vy+_moveDistance)&COLLISION_TYPE_MASK) switch(CGameScene::getCollision()->getCollisionBlock(pos.vx,pos.vy+_moveDistance)&COLLISION_TYPE_MASK)
{ {
case COLLISION_TYPE_FLAG_DAMAGE: case COLLISION_TYPE_FLAG_DAMAGE:
takeDamage(DAMAGE__COLLISION_DAMAGE); takeDamage(DAMAGE__COLLISION_DAMAGE);
@ -2327,11 +2322,10 @@ int CPlayer::moveHorizontal(int _moveDistance)
hitWall=false; hitWall=false;
if(_moveDistance) if(_moveDistance)
{ {
CLayerCollision *collision; CLayerCollision *collision=CGameScene::getCollision();
DVECTOR pos; DVECTOR pos;
int colHeight; int colHeight;
collision=getLayerCollision();
pos=getPlayerPos(); pos=getPlayerPos();
colHeight=getHeightFromGround(pos.vx,pos.vy,5); colHeight=getHeightFromGround(pos.vx,pos.vy,5);
if(colHeight==0) if(colHeight==0)
@ -2379,7 +2373,7 @@ int CPlayer::moveHorizontal(int _moveDistance)
} }
else if(colHeight>0) // Lets you jump through platforms from below else if(colHeight>0) // Lets you jump through platforms from below
{ {
if((m_layerCollision->getCollisionBlock(pos.vx+_moveDistance,pos.vy)&COLLISION_TYPE_MASK)!=COLLISION_TYPE_FLAG_NORMAL&& if((CGameScene::getCollision()->getCollisionBlock(pos.vx+_moveDistance,pos.vy)&COLLISION_TYPE_MASK)!=COLLISION_TYPE_FLAG_NORMAL&&
getHeightFromGround(pos.vx+_moveDistance,pos.vy,5)<0) getHeightFromGround(pos.vx+_moveDistance,pos.vy,5)<0)
{ {
// Stop at the edge of the obstruction // Stop at the edge of the obstruction

View file

@ -214,7 +214,6 @@ public:
DVECTOR getCameraPos() {return m_cameraPos;} DVECTOR getCameraPos() {return m_cameraPos;}
void setLayerCollision(class CLayerCollision *_layer) {m_layerCollision=_layer;}
void setCameraBox(CameraBox _cameraBox); void setCameraBox(CameraBox _cameraBox);
void setRespawnPos(DVECTOR _respawn) {m_respawnPos=_respawn;} void setRespawnPos(DVECTOR _respawn) {m_respawnPos=_respawn;}
@ -262,7 +261,6 @@ public:
PLAYERINPUT getPadInputHeld() {return m_padInput;} PLAYERINPUT getPadInputHeld() {return m_padInput;}
PLAYERINPUT getPadInputDown() {return m_padInputDown;} PLAYERINPUT getPadInputDown() {return m_padInputDown;}
int tryingToPickupWeapon() {return m_tryingToPickupWeapon;} int tryingToPickupWeapon() {return m_tryingToPickupWeapon;}
class CLayerCollision *getLayerCollision() {return m_layerCollision;}
void inSoakUpState(); void inSoakUpState();
void takeDamage(DAMAGE_TYPE _damage,REACT_DIRECTION _reactDirection=REACT__UP,CThing *_thing=NULL); void takeDamage(DAMAGE_TYPE _damage,REACT_DIRECTION _reactDirection=REACT__UP,CThing *_thing=NULL);
@ -344,7 +342,6 @@ private:
// Various info about the current map // Various info about the current map
class CLayerCollision *m_layerCollision;
CameraBox m_cameraPosLimitBox; CameraBox m_cameraPosLimitBox;
CameraBox m_playerPosLimitBox; CameraBox m_playerPosLimitBox;
DVECTOR m_respawnPos; DVECTOR m_respawnPos;
@ -429,7 +426,6 @@ public:
// Graphical resources // Graphical resources
public: public:
class FontBank *getFontBank() {return m_fontBank;} class FontBank *getFontBank() {return m_fontBank;}
class SpriteBank *getSpriteBank() {return m_spriteBank;}
enum enum
{ {
@ -447,8 +443,6 @@ public:
private: private:
class FontBank *m_fontBank; class FontBank *m_fontBank;
class SpriteBank *m_spriteBank;
}; };

View file

@ -25,6 +25,7 @@
#include "gfx\font.h" #include "gfx\font.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -172,7 +173,7 @@ void CPlayerModeBubbleMixture::renderModeUi()
char buf[4]; char buf[4];
FontBank *fb; FontBank *fb;
sb=m_player->getSpriteBank(); sb=CGameScene::getSpriteBank();
fh=sb->getFrameHeader(FRM__BUBBLEWAND); fh=sb->getFrameHeader(FRM__BUBBLEWAND);
sb->printFT4(fh,CPlayer::POWERUPUI_ICONX,CPlayer::POWERUPUI_ICONY,0,0,CPlayer::POWERUPUI_OT); sb->printFT4(fh,CPlayer::POWERUPUI_ICONX,CPlayer::POWERUPUI_ICONY,0,0,CPlayer::POWERUPUI_OT);

View file

@ -283,7 +283,7 @@ void CPlayerModeCoralBlower::think()
CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE,
CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE,
5*60); 5*60);
projectile->setLayerCollision( m_player->getLayerCollision() );
//CActorGfx *projectileGfx; //CActorGfx *projectileGfx;
//projectileGfx=CActorPool::GetActor((FileEquate)ACTORS_SHELL_SBK); //projectileGfx=CActorPool::GetActor((FileEquate)ACTORS_SHELL_SBK);
@ -354,7 +354,7 @@ void CPlayerModeCoralBlower::renderModeUi()
sFrameHdr *fh; sFrameHdr *fh;
// char buf[4]; // char buf[4];
sb=m_player->getSpriteBank(); sb=CGameScene::getSpriteBank();
fh=sb->getFrameHeader(FRM__BLOWER); fh=sb->getFrameHeader(FRM__BLOWER);
if(m_blowerState==BLOWER_STATE__FULL||m_blowerState==BLOWER_STATE__AIMING) if(m_blowerState==BLOWER_STATE__FULL||m_blowerState==BLOWER_STATE__AIMING)
{ {

View file

@ -33,6 +33,7 @@
#include "gfx\font.h" #include "gfx\font.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -152,7 +153,7 @@ void CPlayerModeJellyLauncher::renderModeUi()
FontBank *fb; FontBank *fb;
char buf[4]; char buf[4];
sb=m_player->getSpriteBank(); sb=CGameScene::getSpriteBank();
fh=sb->getFrameHeader(FRM__LAUNCHER); fh=sb->getFrameHeader(FRM__LAUNCHER);
switch(m_firingState) switch(m_firingState)
{ {
@ -301,7 +302,7 @@ void CPlayerModeJellyLauncher::launchProjectile()
CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE,
CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE,
5*60); 5*60);
projectile->setLayerCollision( m_player->getLayerCollision() );
projectile->setRGB( 255 + ( 128 << 8 ) + ( 255 << 16 ) ); projectile->setRGB( 255 + ( 128 << 8 ) + ( 255 << 16 ) );
fireHeading+=512; fireHeading+=512;
m_player->useOneJelly(); m_player->useOneJelly();
@ -317,7 +318,7 @@ void CPlayerModeJellyLauncher::launchProjectile()
CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE,
CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE,
5*60); 5*60);
projectile->setLayerCollision( m_player->getLayerCollision() );
projectile->setRGB( 255 + ( 128 << 8 ) + ( 255 << 16 ) ); projectile->setRGB( 255 + ( 128 << 8 ) + ( 255 << 16 ) );
m_player->useOneJelly(); m_player->useOneJelly();
} }

View file

@ -237,7 +237,7 @@ void CPlayerModeNet::think()
CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE,
CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE,
5*60); 5*60);
projectile->setLayerCollision( m_player->getLayerCollision() );
projectile->updateCollisionArea(); projectile->updateCollisionArea();
projectile->setRGB( m_RGB ); projectile->setRGB( m_RGB );
@ -282,7 +282,7 @@ void CPlayerModeNet::think()
sFrameHdr *fh; sFrameHdr *fh;
char buf[4]; char buf[4];
sb=m_player->getSpriteBank(); sb=CGameScene::getSpriteBank();
fh=sb->getFrameHeader(FRM__NET); fh=sb->getFrameHeader(FRM__NET);
if(m_player->getJellyFishAmmo()) if(m_player->getJellyFishAmmo())
{ {

View file

@ -70,7 +70,7 @@
#include "player\psspring.h" #include "player\psspring.h"
#endif #endif
#include "game/game.h"
/* Std Lib /* Std Lib
------- */ ------- */
@ -297,7 +297,7 @@ void CPlayerModeBase::thinkVerticalMovement()
playerHasHitGround(); playerHasHitGround();
pos=m_player->getPlayerPos(); pos=m_player->getPlayerPos();
if(m_player->getHeightFromGround(pos.vx,pos.vy,5)==0&& if(m_player->getHeightFromGround(pos.vx,pos.vy,5)==0&&
(m_player->getLayerCollision()->getCollisionBlock(pos.vx,pos.vy)&COLLISION_TYPE_MASK)==COLLISION_TYPE_FLAG_WATER&& (CGameScene::getCollision()->getCollisionBlock(pos.vx,pos.vy)&COLLISION_TYPE_MASK)==COLLISION_TYPE_FLAG_WATER&&
!m_player->getIsHealthSoFullThatIDontNeedToSoakUp()) !m_player->getIsHealthSoFullThatIDontNeedToSoakUp())
{ {
// Hit water - Go into soakup mode // Hit water - Go into soakup mode
@ -474,11 +474,10 @@ int csize=5;
int cheight=15; int cheight=15;
int CPlayerModeBase::isOnEdge() int CPlayerModeBase::isOnEdge()
{ {
CLayerCollision *collision; CLayerCollision *collision=CGameScene::getCollision();
DVECTOR pos; DVECTOR pos;
int ret; int ret;
collision=m_player->getLayerCollision();
pos=m_player->getPlayerPos(); pos=m_player->getPlayerPos();
ret=0; ret=0;
if(m_player->getHeightFromGround(pos.vx-csize,pos.vy,cheight+1)>cheight) if(m_player->getHeightFromGround(pos.vx-csize,pos.vy,cheight+1)>cheight)

View file

@ -23,6 +23,8 @@
#include "level\level.h" #include "level\level.h"
#endif #endif
#include "game/game.h"
void CEnemyAsSpriteProjectile::think( int _frames ) void CEnemyAsSpriteProjectile::think( int _frames )
{ {
CPlayerProjectile::think( _frames ); CPlayerProjectile::think( _frames );
@ -51,8 +53,8 @@ void CEnemyAsSpriteProjectile::render()
int x,y; int x,y;
int scrnWidth = VidGetScrW(); int scrnWidth = VidGetScrW();
int scrnHeight = VidGetScrH(); int scrnHeight = VidGetScrH();
int spriteWidth = m_spriteBank->getFrameWidth( m_spriteFrame ); int spriteWidth = CGameScene::getSpriteBank()->getFrameWidth( m_spriteFrame );
int spriteHeight = m_spriteBank->getFrameHeight( m_spriteFrame ); int spriteHeight = CGameScene::getSpriteBank()->getFrameHeight( m_spriteFrame );
offset = getScreenOffset(); offset = getScreenOffset();
@ -64,8 +66,8 @@ void CEnemyAsSpriteProjectile::render()
return; return;
} }
frameHdr = m_spriteBank->getFrameHeader( m_spriteFrame ); frameHdr = CGameScene::getSpriteBank()->getFrameHeader( m_spriteFrame );
POLY_FT4 *SprFrame = m_spriteBank->printRotatedScaledSprite( frameHdr, x, y, 4096, 4096, m_rotation, 0 ); POLY_FT4 *SprFrame = CGameScene::getSpriteBank()->printRotatedScaledSprite( frameHdr, x, y, 4096, 4096, m_rotation, 0 );
if ( m_hasRGB ) if ( m_hasRGB )
{ {

View file

@ -55,8 +55,6 @@ void CProjectile::init()
{ {
CEnemyProjectileThing::init(); CEnemyProjectileThing::init();
m_spriteBank=new ("projectile sprites") SpriteBank();
m_spriteBank->load(SPRITES_SPRITES_SPR);
m_spriteFrame = FRM__SPIKE; m_spriteFrame = FRM__SPIKE;
m_initHeading = m_heading = 0; m_initHeading = m_heading = 0;
@ -97,8 +95,6 @@ void CProjectile::init( DVECTOR initPos, s16 initHeading, PROJECTILE_MOVEMENT_TY
void CProjectile::shutdown() void CProjectile::shutdown()
{ {
m_spriteBank->dump(); delete m_spriteBank;
CEnemyProjectileThing::shutdown(); CEnemyProjectileThing::shutdown();
} }
@ -250,7 +246,7 @@ void CProjectile::think(int _frames)
case PROJECTILE_USER_SEEK: case PROJECTILE_USER_SEEK:
{ {
if ( m_layerCollision->Get( Pos.vx >> 4, Pos.vy >> 4 ) ) if ( CGameScene::getCollision()->Get( Pos.vx >> 4, Pos.vy >> 4 ) )
{ {
setToShutdown(); setToShutdown();
} }
@ -312,7 +308,7 @@ void CProjectile::think(int _frames)
case PROJECTILE_DUMBFIRE: case PROJECTILE_DUMBFIRE:
default: default:
{ {
if ( m_layerCollision->Get( Pos.vx >> 4, Pos.vy >> 4 ) ) if ( CGameScene::getCollision()->Get( Pos.vx >> 4, Pos.vy >> 4 ) )
{ {
setToShutdown(); setToShutdown();
} }
@ -346,8 +342,8 @@ void CProjectile::render()
int x,y; int x,y;
int scrnWidth = VidGetScrW(); int scrnWidth = VidGetScrW();
int scrnHeight = VidGetScrH(); int scrnHeight = VidGetScrH();
int spriteWidth = m_spriteBank->getFrameWidth( m_spriteFrame ); int spriteWidth = CGameScene::getSpriteBank()->getFrameWidth( m_spriteFrame );
int spriteHeight = m_spriteBank->getFrameHeight( m_spriteFrame ); int spriteHeight = CGameScene::getSpriteBank()->getFrameHeight( m_spriteFrame );
offset = getScreenOffset(); offset = getScreenOffset();
@ -359,11 +355,11 @@ void CProjectile::render()
return; return;
} }
//m_spriteBank->printFT4(FRM__SPIKE,x,y,0,0,0); //CGameScene::getSpriteBank()->printFT4(FRM__SPIKE,x,y,0,0,0);
frameHdr = m_spriteBank->getFrameHeader( m_spriteFrame ); frameHdr = CGameScene::getSpriteBank()->getFrameHeader( m_spriteFrame );
m_spriteBank->printRotatedScaledSprite( frameHdr, x, y, 4096, 4096, m_heading, m_ot ); CGameScene::getSpriteBank()->printRotatedScaledSprite( frameHdr, x, y, 4096, 4096, m_heading, m_ot );
} }
DVECTOR CProjectile::getScreenOffset() DVECTOR CProjectile::getScreenOffset()
@ -405,9 +401,6 @@ void CPlayerProjectile::init()
{ {
CPlayerProjectileThing::init(); CPlayerProjectileThing::init();
m_spriteBank=new ("projectile sprites") SpriteBank();
m_spriteBank->load(SPRITES_SPRITES_SPR);
m_heading = 0; m_heading = 0;
m_lifetime = GameState::getOneSecondInFrames() * 2; m_lifetime = GameState::getOneSecondInFrames() * 2;
m_movementType = PLAYER_PROJECTILE_DUMBFIRE; m_movementType = PLAYER_PROJECTILE_DUMBFIRE;
@ -453,7 +446,6 @@ void CPlayerProjectile::init( DVECTOR initPos, s16 initHeading, PLAYER_PROJECTIL
void CPlayerProjectile::shutdown() void CPlayerProjectile::shutdown()
{ {
m_spriteBank->dump(); delete m_spriteBank;
CPlayerProjectileThing::shutdown(); CPlayerProjectileThing::shutdown();
} }
@ -499,7 +491,7 @@ void CPlayerProjectile::think(int _frames)
case PLAYER_PROJECTILE_DUMBFIRE: case PLAYER_PROJECTILE_DUMBFIRE:
default: default:
{ {
if ( m_layerCollision->Get( Pos.vx >> 4, Pos.vy >> 4 ) ) if ( CGameScene::getCollision()->Get( Pos.vx >> 4, Pos.vy >> 4 ) )
{ {
// destroy destructable tiles // destroy destructable tiles
@ -538,8 +530,8 @@ void CPlayerProjectile::render()
int x,y; int x,y;
int scrnWidth = VidGetScrW(); int scrnWidth = VidGetScrW();
int scrnHeight = VidGetScrH(); int scrnHeight = VidGetScrH();
int spriteWidth = m_spriteBank->getFrameWidth(m_frame); int spriteWidth = CGameScene::getSpriteBank()->getFrameWidth(m_frame);
int spriteHeight = m_spriteBank->getFrameHeight(m_frame); int spriteHeight = CGameScene::getSpriteBank()->getFrameHeight(m_frame);
offset = getScreenOffset(); offset = getScreenOffset();
@ -559,7 +551,7 @@ void CPlayerProjectile::render()
return; return;
} }
SprFrame = m_spriteBank->printFT4(FRM_JELLYFISH1_SWIM1 + m_frame,x,y,m_reversed,0,0); SprFrame = CGameScene::getSpriteBank()->printFT4(FRM_JELLYFISH1_SWIM1 + m_frame,x,y,m_reversed,0,0);
setRGB0( SprFrame, m_RGB.r, m_RGB.g, m_RGB.b ); setRGB0( SprFrame, m_RGB.r, m_RGB.g, m_RGB.b );
} }

View file

@ -42,6 +42,10 @@ public:
PROJECTILE_ATTACK = 0, PROJECTILE_ATTACK = 0,
PROJECTILE_RETURN = 1, PROJECTILE_RETURN = 1,
}; };
enum
{ // For Dynamic ThingCache
MAX_SUBTYPE =1,
};
void init(); void init();
void init( DVECTOR initPos, s16 initHeading ); void init( DVECTOR initPos, s16 initHeading );
@ -57,20 +61,15 @@ public:
void setLifeTime( PROJECTILE_LIFETIME_TYPE lifeType ); void setLifeTime( PROJECTILE_LIFETIME_TYPE lifeType );
void setPosition( DVECTOR newPos ); void setPosition( DVECTOR newPos );
void setHeading( s16 newHeading ) {m_heading = newHeading;} void setHeading( s16 newHeading ) {m_heading = newHeading;}
void setLayerCollision( class CLayerCollision *_layer ) {m_layerCollision=_layer;}
void setOt( u8 newOt ) {m_ot=newOt;} void setOt( u8 newOt ) {m_ot=newOt;}
void setGraphic( int frame ); void setGraphic( int frame );
void setSpeed( u16 newSpeed ) {m_speed = newSpeed;} void setSpeed( u16 newSpeed ) {m_speed = newSpeed;}
private:
class CLayerCollision *m_layerCollision;
protected: protected:
DVECTOR getScreenOffset(); DVECTOR getScreenOffset();
bool processTargetSeek( int _frames, DVECTOR targetPos ); bool processTargetSeek( int _frames, DVECTOR targetPos );
void collidedWith( CThing *_thisThing ); void collidedWith( CThing *_thisThing );
class SpriteBank *m_spriteBank;
DVECTOR m_initPos; DVECTOR m_initPos;
s16 m_heading; s16 m_heading;
s16 m_initHeading; s16 m_initHeading;
@ -100,6 +99,10 @@ public:
PLAYER_PROJECTILE_FINITE_LIFE = 0, PLAYER_PROJECTILE_FINITE_LIFE = 0,
PLAYER_PROJECTILE_INFINITE_LIFE = 1, PLAYER_PROJECTILE_INFINITE_LIFE = 1,
}; };
enum
{ // For Dynamic ThingCache
MAX_SUBTYPE =1,
};
void init(); void init();
void init( DVECTOR initPos, s16 initHeading ); void init( DVECTOR initPos, s16 initHeading );
@ -109,21 +112,18 @@ public:
virtual void think(int _frames); virtual void think(int _frames);
virtual void render(); virtual void render();
void processEvent( GAME_EVENT evt, CThing *sourceThing ); void processEvent( GAME_EVENT evt, CThing *sourceThing );
void setMovementType( PLAYER_PROJECTILE_MOVEMENT_TYPE moveType ); void setMovementType( PLAYER_PROJECTILE_MOVEMENT_TYPE moveType );
PLAYER_PROJECTILE_MOVEMENT_TYPE getMovementType(); PLAYER_PROJECTILE_MOVEMENT_TYPE getMovementType();
void setLifeTime( PLAYER_PROJECTILE_LIFETIME_TYPE lifeType ); void setLifeTime( PLAYER_PROJECTILE_LIFETIME_TYPE lifeType );
void setPosition( DVECTOR newPos ); void setPosition( DVECTOR newPos );
void setLayerCollision( class CLayerCollision *_layer ) {m_layerCollision=_layer;}
void setRGB( u32 new_RGB ); void setRGB( u32 new_RGB );
private:
class CLayerCollision *m_layerCollision;
protected: protected:
DVECTOR getScreenOffset(); DVECTOR getScreenOffset();
void collidedWith( CThing *_thisThing ); void collidedWith( CThing *_thisThing );
class SpriteBank *m_spriteBank;
DVECTOR m_initPos; DVECTOR m_initPos;
s16 m_heading; s16 m_heading;
s32 m_lifetime; s32 m_lifetime;

View file

@ -113,6 +113,9 @@ void InitSystem() // reordered to reduce black screen (hope all is well
SetDispMask(1); SetDispMask(1);
GenericSpriteBank.load(SPRITES_SPRITES_SPR);
CGameScene::setSpriteBank(&GenericSpriteBank);
GameState::initialise(); GameState::initialise();
CSoundMediator::initialise(); CSoundMediator::initialise();
CSoundMediator::setSfxBank(CSoundMediator::SFX_INGAME); CSoundMediator::setSfxBank(CSoundMediator::SFX_INGAME);
@ -122,8 +125,6 @@ void InitSystem() // reordered to reduce black screen (hope all is well
CBubicleFactory::init(); CBubicleFactory::init();
CActorPool::AddActor(ACTORS_SPONGEBOB_SBK); CActorPool::AddActor(ACTORS_SPONGEBOB_SBK);
GenericSpriteBank.load(SPRITES_SPRITES_SPR);
#if defined(__DEBUG_MEM__) #if defined(__DEBUG_MEM__)
DebugMemFontInit(); DebugMemFontInit();

View file

@ -11,6 +11,7 @@
===========================================================================*/ ===========================================================================*/
//#define USE_FREE_LIST
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
Includes Includes
-------- */ -------- */
@ -31,9 +32,13 @@
#include "level\level.h" #include "level\level.h"
#ifndef __HAZARD_HAZARD_H__ // Needed for freelist table :o(
#include "hazard\hazard.h" #include "pickups\pickup.h"
#endif #include "platform\platform.h"
#include "projectl\projectl.h"
#include "enemy\npc.h"
#include "friend\friend.h"
#include "fx\fx.h"
#ifndef __HAZARD_HRWEIGHT_H__ #ifndef __HAZARD_HRWEIGHT_H__
#include "hazard\hrweight.h" #include "hazard\hrweight.h"
@ -47,7 +52,6 @@
#include "hazard\hpswitch.h" #include "hazard\hpswitch.h"
#endif #endif
/* Std Lib /* Std Lib
------- */ ------- */
@ -82,11 +86,34 @@ static const int s_ThinkBBoxY1=256+128;
CThing *CThingManager::s_thingLists[CThing::MAX_TYPE]; CThing *CThingManager::s_thingLists[CThing::MAX_TYPE];
CThing *CThingManager::s_CollisionLists[CThing::MAX_TYPE]; CThing *CThingManager::s_CollisionLists[CThing::MAX_TYPE];
int CThingManager::s_initialised=false; int CThingManager::s_initialised=false;
sBBox CThingManager::m_RenderBBox; sBBox CThingManager::m_RenderBBox;
sBBox CThingManager::m_ThinkBBox; sBBox CThingManager::m_ThinkBBox;
#ifdef USE_FREE_LIST
CThing **CThingManager::s_FreeList[CThing::MAX_TYPE];
struct sFreeListTable
{
u16 Type;
u16 Count;
};
static const sFreeListTable FreeListTable[]=
{
/* 0*/ {CThing::TYPE_PICKUP ,CBasePickup::MAX_SUBTYPE},
/* 1*/ {CThing::TYPE_PLATFORM ,CNpcPlatform::MAX_SUBTYPE},
/* 2*/ {CThing::TYPE_PLAYER ,CPlayerThing::MAX_SUBTYPE},
/* 3*/ {CThing::TYPE_PLAYERPROJECTILE ,CPlayerProjectile::MAX_SUBTYPE},
/* 4*/ {CThing::TYPE_NPC ,CNpcFriend::MAX_SUBTYPE},
/* 5*/ {CThing::TYPE_ENEMY ,CNpcEnemy::MAX_SUBTYPE},
/* 6*/ {CThing::TYPE_ENEMYPROJECTILE ,CProjectile::MAX_SUBTYPE},
/* 7*/ {CThing::TYPE_TRIGGER ,CTriggerThing::MAX_SUBTYPE},
/* 8*/ {CThing::TYPE_HAZARD ,CNpcHazard::MAX_SUBTYPE},
/* 9*/ {CThing::TYPE_FX ,CFX::MAX_SUBTYPE},
};
static const int FreeListTableSize=sizeof(FreeListTable)/sizeof(sFreeListTable);
#endif
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
Function: Function:
Purpose: Purpose:
@ -98,6 +125,7 @@ void CThingManager::init()
ASSERT(!s_initialised); ASSERT(!s_initialised);
initList(s_thingLists); initList(s_thingLists);
initList(s_CollisionLists); initList(s_CollisionLists);
initFreeList();
s_initialised=true; s_initialised=true;
} }
@ -119,10 +147,11 @@ void CThingManager::shutdown()
{ {
thing=s_thingLists[i]; thing=s_thingLists[i];
thing->shutdown(); thing->shutdown();
delete thing; DeleteThing(thing);
} }
} }
s_initialised=false; s_initialised=false;
shutdownFreeList();
} }
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
@ -167,7 +196,7 @@ void CThingManager::killAllThingsForRespawn()
else else
{ {
thing->shutdown(); thing->shutdown();
delete thing; DeleteThing(thing);
thing=s_thingLists[i]; thing=s_thingLists[i];
} }
} }
@ -353,7 +382,7 @@ DVECTOR const &CamPos=CLevel::getCameraPos();
if (player && playerThing) if (player && playerThing)
{ {
playerThing->setHasPlatformCollided( false ); playerThing->setHasPlatformCollided( false );
playerThing->setNewCollidedPos( playerThing->getPos() ); //!Dave! playerThing->setNewCollidedPos( playerThing->getPos() );
// Player -> Platform collision // Player -> Platform collision
thing1=s_CollisionLists[CThing::TYPE_PLATFORM]; thing1=s_CollisionLists[CThing::TYPE_PLATFORM];
@ -521,7 +550,7 @@ DVECTOR const &CamPos=CLevel::getCameraPos();
if ( thing->isSetToShutdown() ) if ( thing->isSetToShutdown() )
{ {
thing->shutdown(); thing->shutdown();
delete thing; DeleteThing(thing);
} }
thing = nextThing; thing = nextThing;
@ -629,6 +658,7 @@ CThing *CThingManager::checkCollisionAreaAgainstThings(CRECT *_area,int _type,i
void CThingManager::addToThingList(CThing *_this) void CThingManager::addToThingList(CThing *_this)
{ {
int Type=_this->getThingType(); int Type=_this->getThingType();
_this->m_nextListThing=s_thingLists[Type]; _this->m_nextListThing=s_thingLists[Type];
s_thingLists[Type]=_this; s_thingLists[Type]=_this;
} }
@ -675,14 +705,130 @@ int Type=thing->getThingType();
s_CollisionLists[Type]=thing; s_CollisionLists[Type]=thing;
} }
/********************************************************************/
/********************************************************************/
/*** Free List Stuff ************************************************/
/********************************************************************/
/********************************************************************/
void CThingManager::initFreeList()
{
#ifdef USE_FREE_LIST
// Make sure no-one is being naughty
ASSERT(FreeListTableSize==CThing::MAX_TYPE)
for (int i=0; i<FreeListTableSize; i++)
{
sFreeListTable const &ThisType=FreeListTable[i];
int Count=ThisType.Count;
CThing **List=(CThing**)MemAlloc(Count*sizeof(CThing**),"ThingCache");
for (int t=0; t<Count; t++)
{
List[t]=0;
}
s_FreeList[ThisType.Type]=List;
}
#endif
}
/********************************************************************/
void CThingManager::resetFreeList()
{
#ifdef USE_FREE_LIST
for (int i=0; i<FreeListTableSize; i++)
{
sFreeListTable const &ThisType=FreeListTable[i];
int Count=ThisType.Count;
CThing **List=s_FreeList[i];
for (int t=0; t<Count; t++)
{
CThing *ThisThing=List[t];
while (ThisThing)
{
CThing *Next=ThisThing->NextFreeThing;
delete ThisThing;
ThisThing=Next;
}
List[t]=0;
}
}
#endif
}
/********************************************************************/
void CThingManager::shutdownFreeList()
{
#ifdef USE_FREE_LIST
resetFreeList();
for (int i=0; i<FreeListTableSize; i++)
{
sFreeListTable const &ThisType=FreeListTable[i];
MemFree(s_FreeList[ThisType.Type]);
}
#endif
}
/********************************************************************/
CThing *CThingManager::GetThing(int Type,int SubType)
{
#ifdef USE_FREE_LIST
CThing **List=s_FreeList[Type];
CThing *Thing=List[SubType];
if (Thing)
{
List[SubType]=Thing->NextFreeThing;
Thing->initDef();
Thing->NextFreeThing=0;
}
return(Thing);
#else
return(0);
#endif
}
/********************************************************************/
void CThingManager::DeleteThing(CThing *Thing)
{
#ifdef USE_FREE_LIST
int Type=Thing->getThingType();
int SubType=Thing->getThingSubType();
CThing **List=s_FreeList[Type];
// Check its been aquired/set correctly
ASSERT(SubType!=1234);
Thing->NextFreeThing=List[SubType];
List[SubType]=Thing;
#else
delete Thing;
#endif
}
/********************************************************************/
/********************************************************************/
/********************************************************************/
/********************************************************************/
/********************************************************************/
/********************************************************************/
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
Function: Function:
Purpose: Purpose:
Params: Params:
Returns: Returns:
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
int DaveDbg=1;
void CThing::init() void CThing::init()
{ {
ASSERT(DaveDbg);
ParentThing=NULL; ParentThing=NULL;
NextThing=NULL; NextThing=NULL;
m_numChildren = 0; m_numChildren = 0;
@ -691,11 +837,10 @@ void CThing::init()
// These need to stay for init // These need to stay for init
setCollisionSize(20,20); // Some temporary defaults.. (pkg) setCollisionSize(20,20); // Some temporary defaults.. (pkg)
setCollisionCentreOffset(0,0); setCollisionCentreOffset(0,0);
setCollisionAngle(0); //!Dave! setCollisionAngle(0);
// Add to thing list // Add to thing list
CThingManager::addToThingList(this); CThingManager::addToThingList(this);
} }
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
@ -983,7 +1128,7 @@ CThing *List=NextThing;
List->ParentThing=NULL; List->ParentThing=NULL;
List->NextThing=NULL; List->NextThing=NULL;
List->shutdown(); List->shutdown();
delete List; CThingManager::DeleteThing(List);
List=NextThing; List=NextThing;
} }
NextThing=NULL; NextThing=NULL;
@ -1181,6 +1326,5 @@ void CTriggerThing::setTargetBox(int _x,int _y,int _w,int _h)
m_boxY2=_y+_h; m_boxY2=_y+_h;
} }
/*===========================================================================
end */

View file

@ -84,11 +84,19 @@ private:
static CThing *s_CollisionLists[]; static CThing *s_CollisionLists[];
static sBBox m_RenderBBox; static sBBox m_RenderBBox;
static sBBox m_ThinkBBox; static sBBox m_ThinkBBox;
public:
// FreeList Stuff
static void initFreeList();
static void resetFreeList();
static void shutdownFreeList();
static CThing *GetThing(int Type,int SubType);
static void DeleteThing(CThing *Thing);
// static CThing *s_FreeList[]; private:
static CThing **s_FreeList[];
}; };
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
// Base thing class // Base thing class
class CThing class CThing
@ -110,16 +118,29 @@ public:
MAX_TYPE, MAX_TYPE,
}; };
// TYPE; // TYPE;
CThing() {m_isShuttingDown=false;} CThing()
{
initDef();
m_SubType=1234;
}
virtual ~CThing() {;} virtual ~CThing() {;}
virtual void initDef()
{
m_isShuttingDown=false;
NextFreeThing=0;
}
virtual TYPE getThingType()=0; virtual TYPE getThingType()=0;
virtual void setThingSubType(int T) {m_SubType=T;}
virtual int getThingSubType() {return(m_SubType);}
virtual void init(); virtual void init();
virtual void shutdown(); virtual void shutdown();
virtual void think(int _frames); virtual void think(int _frames);
virtual void render(); virtual void render();
void setToShutdown() {m_isShuttingDown = true;} void setToShutdown(bool f=true) {m_isShuttingDown = f;}
u8 isSetToShutdown() {return( m_isShuttingDown);} u8 isSetToShutdown() {return( m_isShuttingDown);}
virtual int dontKillDuringLevelRespawn() {return false;} virtual int dontKillDuringLevelRespawn() {return false;}
@ -167,8 +188,8 @@ virtual bool alwaysThink() {return(false);}
DVECTOR const &getCollisionCentreOffset() {return m_collisionCentreOffset;} DVECTOR const &getCollisionCentreOffset() {return m_collisionCentreOffset;}
int getCollisionRadius() {return m_collisionRadius;} int getCollisionRadius() {return m_collisionRadius;}
virtual CRECT const &getCollisionArea() {return m_collisionArea;} virtual CRECT const &getCollisionArea() {return m_collisionArea;}
s16 getCollisionAngle() {return m_collisionAngle;} // pkg - move to CNpcPlatform? //!Dave! s16 getCollisionAngle() {return m_collisionAngle;} // pkg - move to CNpcPlatform?
DVECTOR const &getNewCollidedPos() {return m_newCollidedPos;} // pkg - to be removed? //!Dave! DVECTOR const &getNewCollidedPos() {return m_newCollidedPos;} // pkg - to be removed?
DVECTOR const &getCollisionSize() {return m_collisionSize;} DVECTOR const &getCollisionSize() {return m_collisionSize;}
virtual int canCollide() {return true;} virtual int canCollide() {return true;}
@ -179,8 +200,7 @@ virtual void collidedWith(CThing *_thisThing) {;}
virtual void setHasPlatformCollided( bool newVal ) {;} virtual void setHasPlatformCollided( bool newVal ) {;}
virtual bool getHasPlatformCollided() {return false;} virtual bool getHasPlatformCollided() {return false;}
virtual s32 getNewYPos( CThing *_thisThing ); virtual s32 getNewYPos( CThing *_thisThing );
void setNewCollidedPos(DVECTOR newPos) {m_newCollidedPos = newPos;} // pkg - to be removed? //!Dave! void setNewCollidedPos(DVECTOR newPos) {m_newCollidedPos = newPos;} // pkg - to be removed?
public: public:
// Thing states // Thing states
@ -193,24 +213,26 @@ protected:
bool m_renderFlag,m_thinkFlag; bool m_renderFlag,m_thinkFlag;
DVECTOR m_RenderPos; DVECTOR m_RenderPos;
bool m_isShuttingDown; bool m_isShuttingDown;
int m_SubType;
protected: protected:
virtual void setCollisionSize(int _w,int _h); virtual void setCollisionSize(int _w,int _h);
virtual void setCollisionCentreOffset(int _x,int _y) {m_collisionCentreOffset.vx=_x;m_collisionCentreOffset.vy=_y;} virtual void setCollisionCentreOffset(int _x,int _y) {m_collisionCentreOffset.vx=_x;m_collisionCentreOffset.vy=_y;}
virtual void setCollisionCentreOffset(DVECTOR xy) {m_collisionCentreOffset=xy;} virtual void setCollisionCentreOffset(DVECTOR xy) {m_collisionCentreOffset=xy;}
virtual void setCollisionAngle(int newAngle) {m_collisionAngle = newAngle;} // pkg - move to CNpcPlatform? //!Dave!virtual void setCollisionAngle(int newAngle) {m_collisionAngle = newAngle;} // pkg - move to CNpcPlatform?
private: private:
DVECTOR m_collisionSize; DVECTOR m_collisionSize;
DVECTOR m_collisionCentreOffset; DVECTOR m_collisionCentreOffset;
int m_collisionRadius; int m_collisionRadius;
CRECT m_collisionArea; CRECT m_collisionArea;
DVECTOR m_collisionCentre; DVECTOR m_collisionCentre;
s16 m_collisionAngle; // pkg - move to CNpcPlatform? //!Dave! s16 m_collisionAngle; // pkg - move to CNpcPlatform?
DVECTOR m_newCollidedPos; // pkg - to be removed? //!Dave! DVECTOR m_newCollidedPos; // pkg - to be removed?
// Free List Stuff // Free List Stuff
public: public:
//virtual int getMaxType()=0; CThing *NextFreeThing;
}; };
/*---------------------------------------------------------------------- */ /*---------------------------------------------------------------------- */
@ -224,6 +246,10 @@ virtual TYPE getThingType() {return TYPE_PICKUP;}
class CPlayerThing : public CThing class CPlayerThing : public CThing
{ {
public: public:
enum
{ // For Dynamic ThingCache
MAX_SUBTYPE =1,
};
virtual TYPE getThingType() {return TYPE_PLAYER;} virtual TYPE getThingType() {return TYPE_PLAYER;}
virtual bool alwaysThink() {return(true);} virtual bool alwaysThink() {return(true);}
@ -262,9 +288,15 @@ virtual TYPE getThingType() {return TYPE_PLATFORM;}
class CTriggerThing : public CThing class CTriggerThing : public CThing
{ {
public: public:
enum
{ // For Dynamic ThingCache
MAX_SUBTYPE =1,
};
virtual TYPE getThingType() {return TYPE_TRIGGER;} virtual TYPE getThingType() {return TYPE_TRIGGER;}
virtual void setPositionAndSize(int _x,int _y,int _w,int _h); // Wonder if this might be better in CThing? (pkg) virtual void setPositionAndSize(int _x,int _y,int _w,int _h); // Wonder if this might be better in CThing? (pkg)
virtual void setTargetBox(int _x,int _y,int _w,int _h); // Wonder if this might be better in CThing? (pkg) virtual void setTargetBox(int _x,int _y,int _w,int _h); // Wonder if this might be better in CThing? (pkg)
protected: protected:
int m_boxX1,m_boxY1,m_boxX2,m_boxY2; int m_boxX1,m_boxY1,m_boxX2,m_boxY2;
}; };