diff --git a/res/alice.png b/res/alice.png new file mode 100644 index 0000000..58ff397 Binary files /dev/null and b/res/alice.png differ diff --git a/res/fairy.png b/res/fairy.png new file mode 100644 index 0000000..34f9b8e Binary files /dev/null and b/res/fairy.png differ diff --git a/res/fairy2.png b/res/fairy2.png new file mode 100644 index 0000000..61a3b9f Binary files /dev/null and b/res/fairy2.png differ diff --git a/res/resources.res b/res/resources.res index fbf8f94..2330de0 100644 --- a/res/resources.res +++ b/res/resources.res @@ -7,9 +7,13 @@ IMAGE sky "sky.png" NONE NONE IMAGE fadeTop "fadetop.png" NONE NONE IMAGE fadeBottom "fadebottom.png" NONE NONE -SPRITE sakuyaSprite "sakuya.png" 4 4 NONE 0 +// SPRITE sakuyaSprite "sakuya.png" 4 4 NONE 0 +SPRITE sakuyaSprite "sakuya2.png" 6 6 NONE 0 SPRITE bulletsSprite "bullets.png" 2 2 NONE 0 SPRITE pBulletSprite "pbullet.png" 4 4 NONE 0 -SPRITE butterflySprite "butterfly.png" 4 4 NONE 8 \ No newline at end of file +SPRITE butterflySprite "butterfly.png" 4 4 NONE 8 +// SPRITE fairySprite "fairy.png" 4 4 NONE 8 +SPRITE fairySprite "fairy2.png" 4 4 NONE 8 +SPRITE aliceSprite "alice.png" 6 6 NONE 0 \ No newline at end of file diff --git a/res/sakuya2.png b/res/sakuya2.png new file mode 100644 index 0000000..f68a7db Binary files /dev/null and b/res/sakuya2.png differ diff --git a/runblastem.sh b/runblastem.sh new file mode 100755 index 0000000..f414170 --- /dev/null +++ b/runblastem.sh @@ -0,0 +1 @@ +./blastem/blastem out/rom.bin \ No newline at end of file diff --git a/src/bullets.h b/src/bullets.h index 3d00548..e9259f6 100644 --- a/src/bullets.h +++ b/src/bullets.h @@ -59,7 +59,7 @@ static void doBulletRotation(u8 i){ void spawnBullet(struct bulletSpawner spawner, void(*updater)){ // Don't spawn if offscreen fix32 dx = getWrappedDelta(spawner.x, player.pos.x); - bool offScreenX = (dx < FIX32(-256) || dx > FIX32(256)); + bool offScreenX = (dx < -CULL_LIMIT || dx > CULL_LIMIT); bool offScreenY = (spawner.y < FIX32(-16) || spawner.y > GAME_H_F + FIX32(16)); if(offScreenX || offScreenY) return; @@ -91,6 +91,11 @@ void spawnBullet(struct bulletSpawner spawner, void(*updater)){ -32, -32, TILE_ATTR(gameOver ? PAL1 : PAL0, 0, 0, spawner.player && spawner.angle == 512 ? 1 : 0)); + if(!bullets[i].image){ + bullets[i].active = FALSE; + return; + } + if(spawner.anim) SPR_setAnim(bullets[i].image, spawner.anim); bullets[i].anim = spawner.anim; bullets[i].frame = spawner.frame; @@ -100,20 +105,17 @@ void spawnBullet(struct bulletSpawner spawner, void(*updater)){ doBulletRotation(i); } -s32 bulletDist; #define BULLET_CHECK FIX32(32) +s32 bulletDist; static void collideWithEnemy(u8 i){ for(s16 j = 0; j < ENEMY_COUNT; j++) { - if(enemies[j].active){ + if(enemies[j].active && enemies[j].onScreen && bullets[i].active){ fix32 deltaX = getWrappedDelta(bullets[i].pos.x, enemies[j].pos.x); fix32 deltaY = bullets[i].pos.y - enemies[j].pos.y; - if(deltaY >= -BULLET_CHECK && deltaY <= BULLET_CHECK && deltaX >= -BULLET_CHECK && deltaX <= BULLET_CHECK){ - bulletDist = getApproximatedDistance( - fix32ToInt(deltaX), - fix32ToInt(deltaY)); - if(bulletDist <= bullets[i].dist){ + bulletDist = getApproximatedDistance(fix32ToInt(deltaX), fix32ToInt(deltaY)); + if(bulletDist <= bullets[i].dist){ killBullet(i); killEnemy(j); } @@ -123,18 +125,16 @@ static void collideWithEnemy(u8 i){ } static void collideWithPlayer(u8 i){ - if(!bullets[i].player && bullets[i].active){ - fix32 deltaX = getWrappedDelta(bullets[i].pos.x, player.pos.x); - fix32 deltaY = bullets[i].pos.y - player.pos.y; + fix32 deltaX = getWrappedDelta(bullets[i].pos.x, player.pos.x); + fix32 deltaY = bullets[i].pos.y - player.pos.y; - s32 dist = getApproximatedDistance( - fix32ToInt(deltaX), - fix32ToInt(deltaY)); - if(dist <= 4){ - killBullet(i); - // player.lives--; - // if(player.lives <= 0) gameOver = TRUE; - } + s32 dist = getApproximatedDistance( + fix32ToInt(deltaX), + fix32ToInt(deltaY)); + if(dist <= 4){ + killBullet(i); + // player.lives--; + // if(player.lives <= 0) gameOver = TRUE; } } @@ -150,7 +150,7 @@ static void updateBullet(u8 i){ } fix32 dx = getWrappedDelta(bullets[i].pos.x, player.pos.x); - bool offScreenX = (dx < FIX32(-256) || dx > FIX32(256)); + bool offScreenX = (dx < -CULL_LIMIT || dx > CULL_LIMIT); bool offScreenY = (bullets[i].pos.y < FIX32(-16) || bullets[i].pos.y > GAME_H_F + FIX32(16)); @@ -167,11 +167,14 @@ static void updateBullet(u8 i){ u8 off = bullets[i].player ? P_BULLET_OFF : BULLET_OFF; SPR_setPosition(bullets[i].image, sx - off, sy - off); bullets[i].clock++; + bulletCount++; } } void updateBullets(){ + bulletCount = 0; for(s16 i = 0; i < BULLET_COUNT; i++) if(bullets[i].active) updateBullet(i); + intToStr(bulletCount, debugStr, 1); } \ No newline at end of file diff --git a/src/enemies.h b/src/enemies.h index 3d9fb55..8b2df37 100644 --- a/src/enemies.h +++ b/src/enemies.h @@ -41,12 +41,12 @@ void spawnEnemy(u8 type, u8 zone){ enemies[i].pos.x = randX; enemies[i].pos.y = randY; enemies[i].off = 16; - enemies[i].image = SPR_addSprite(&butterflySprite, + enemies[i].image = SPR_addSprite(&fairySprite, getScreenX(enemies[i].pos.x, player.camera) - enemies[i].off, fix32ToInt(enemies[i].pos.y) - enemies[i].off, TILE_ATTR(gameOver ? PAL1 : PAL0, 0, 0, 0)); - enemies[i].angle = random() % 2 < 1 ? 128 : 384; - enemies[i].speed = FIX32(1); - enemies[i].vel.x = fix32Mul(fix16ToFix32(cosFix16(enemies[i].angle)), enemies[i].speed); - enemies[i].vel.y = fix32Mul(fix16ToFix32(sinFix16(enemies[i].angle)), enemies[i].speed); + if(!enemies[i].image){ + enemies[i].active = FALSE; + return; + } for(u8 j = 0; j < PROP_COUNT; j++){ enemies[i].ints[j] = 0; } @@ -55,6 +55,8 @@ void spawnEnemy(u8 type, u8 zone){ loadEnemyOne(i); break; } + enemies[i].vel.x = fix32Mul(fix16ToFix32(cosFix16(enemies[i].angle)), enemies[i].speed); + enemies[i].vel.y = fix32Mul(fix16ToFix32(sinFix16(enemies[i].angle)), enemies[i].speed); } @@ -84,8 +86,8 @@ static void updateEnemy(u8 i){ s16 sx = getScreenX(enemies[i].pos.x, player.camera); s16 sy = fix32ToInt(enemies[i].pos.y); fix32 dx = getWrappedDelta(enemies[i].pos.x, player.pos.x); - bool onScreen = (dx >= FIX32(-256) && dx <= FIX32(256)); - SPR_setVisibility(enemies[i].image, onScreen ? VISIBLE : HIDDEN); + enemies[i].onScreen = (dx >= -CULL_LIMIT && dx <= CULL_LIMIT); + SPR_setVisibility(enemies[i].image, enemies[i].onScreen ? VISIBLE : HIDDEN); SPR_setPosition(enemies[i].image, sx - enemies[i].off, sy - enemies[i].off); enemies[i].clock++; @@ -97,5 +99,5 @@ void updateEnemies(){ enemyCount = 0; for(s16 i = 0; i < ENEMY_COUNT; i++) if(enemies[i].active) updateEnemy(i); - intToStr(enemyCount, debugStr, 1); + // intToStr(enemyCount, debugStr, 1); } \ No newline at end of file diff --git a/src/enemytypes.h b/src/enemytypes.h index 622e211..0203f93 100644 --- a/src/enemytypes.h +++ b/src/enemytypes.h @@ -1,5 +1,7 @@ void loadEnemyOne(u8 i){ enemies[i].ints[0] = random() % 60; + enemies[i].angle = ((random() % 4) * 256) + 128; + enemies[i].speed = FIX32(2); } void updateEnemyOne(u8 i){ @@ -7,15 +9,16 @@ void updateEnemyOne(u8 i){ struct bulletSpawner spawner = { .x = enemies[i].pos.x, .y = enemies[i].pos.y, - .anim = 6 + (random() % 3), + // .anim = 6 + (random() % 3), + .anim = 6, // .frame = 1, - .speed = FIX32(4), - .angle = random() % 256, + .speed = FIX32(2) + FIX16(random() % 4), + .angle = random() % 128, }; - if(random() % 2 < 1) spawner.anim += 3; - for(u8 j = 0; j < 4; j++){ + // if(random() % 2 < 1) spawner.anim += 3; + for(u8 j = 0; j < 8; j++){ spawnBullet(spawner, EMPTY); - spawner.angle += 256; + spawner.angle += 128; } } } diff --git a/src/global.h b/src/global.h index 2267466..06e280d 100644 --- a/src/global.h +++ b/src/global.h @@ -8,6 +8,8 @@ u32 clock; #define SECTION_COUNT 4 #define GAME_WRAP (SECTION_SIZE * SECTION_COUNT) +#define CULL_LIMIT FIX32(240) + u32 score; #define SCORE_LENGTH 8 @@ -17,7 +19,7 @@ char debugStr[8]; void EMPTY(s16 i){(void)i;} bool gameOver; -s16 enemyCount; +s16 enemyCount, bulletCount; // controls struct controls { @@ -44,7 +46,7 @@ struct playerStruct { Vect2D_f32 pos, vel; s16 shotAngle; u8 lives; - fix32 camera; + fix32 camera, yCamera; Sprite* image; }; struct playerStruct player; @@ -71,10 +73,10 @@ struct bullet bullets[BULLET_COUNT]; // enemies -#define ENEMY_COUNT 24 +#define ENEMY_COUNT 16 struct enemy { - bool active; + bool active, onScreen; u8 type; s16 angle, off; u32 clock; diff --git a/src/player.h b/src/player.h index 775d51c..b5844f3 100644 --- a/src/player.h +++ b/src/player.h @@ -5,7 +5,7 @@ #define PLAYER_ACCEL PLAYER_SPEED >> 3 #define PLAYER_ACCEL_FOCUS PLAYER_SPEED_FOCUS >> 3 -#define PLAYER_OFF 16 +#define PLAYER_OFF 24 #define PLAYER_BOUND_Y FIX32(PLAYER_OFF) #define PLAYER_BOUND_H FIX32(224 - PLAYER_OFF) @@ -84,6 +84,8 @@ static void boundsPlayer(){ player.camera += GAME_WRAP; } + player.yCamera = (fix32ToInt(player.pos.y) - FIX16(112)) >> 2; + } static void cameraPlayer(){ @@ -120,6 +122,7 @@ void loadPlayer(){ fix32ToInt(player.pos.x) - PLAYER_OFF, fix32ToInt(player.pos.y) - PLAYER_OFF, TILE_ATTR(PAL0, 0, 0, 0)); + player.yCamera = (fix32ToInt(player.pos.y) - FIX16(112)) >> 2; } void updatePlayer(){ @@ -134,5 +137,5 @@ void updatePlayer(){ SPR_setPosition(player.image, sx - PLAYER_OFF, sy - PLAYER_OFF); - intToStr(fix32ToInt(player.pos.x), debugStr, 1); + // intToStr(fix32ToInt(player.pos.x), debugStr, 1); } \ No newline at end of file