From a3f0474ec9320d09d6ddc1fc70342f44a8bdc105 Mon Sep 17 00:00:00 2001 From: Trevor Boddy Date: Sun, 15 Feb 2026 15:57:58 -0500 Subject: [PATCH] null check to squash bug. some gfx --- res/alice.png | Bin 0 -> 1880 bytes res/fairy.png | Bin 0 -> 5570 bytes res/fairy2.png | Bin 0 -> 4965 bytes res/resources.res | 8 ++++++-- res/sakuya2.png | Bin 0 -> 1659 bytes runblastem.sh | 1 + src/bullets.h | 43 +++++++++++++++++++++++-------------------- src/enemies.h | 18 ++++++++++-------- src/enemytypes.h | 15 +++++++++------ src/global.h | 10 ++++++---- src/player.h | 7 +++++-- 11 files changed, 60 insertions(+), 42 deletions(-) create mode 100644 res/alice.png create mode 100644 res/fairy.png create mode 100644 res/fairy2.png create mode 100644 res/sakuya2.png create mode 100755 runblastem.sh diff --git a/res/alice.png b/res/alice.png new file mode 100644 index 0000000000000000000000000000000000000000..58ff397ef2a92bc6a45321a9bf6531304ad0888b GIT binary patch literal 1880 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 F^M9rnJ-q+` literal 0 HcmV?d00001 diff --git a/res/fairy2.png b/res/fairy2.png new file mode 100644 index 0000000000000000000000000000000000000000..61a3b9f7caabf7e9b2f232414b2928b28f73dd20 GIT binary patch literal 4965 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f68a7dbf51d36384e68af11a7585f847069840d2 GIT binary patch literal 1659 zcmbVMTWl0n7#?knY^AZ#a%uHpoT{|S?wr}}Zg+=nVeM{hL#H&|RjSe0vomMAV|Omh zOuM@^VgfYUrapn7q&6WDLr82f+CXCr1VS_=gb?NOfR{>4Dx#D|LM-0S*;|0%jZJ3f zoH^h5{{Q=LLmll;mzGqOP!v_#+7j%wOLh)QKYJ@p)I%PT+L2pq>RzJLlv%FVDH?+>gN)4JpQV z2AgyC@XpV~ElcNFHknL1k}ij4^st=I=fec7(`m;DyO~xkn6j&8b)F%JOwo{aOV(7H zFv6(TXZacIZB~Y&7id*87b+YyHU)K-a{wYM1C+!9PVX}k8RL@3q6AWqYMB_z6|j0- zvotfV{S9^D_!a{=yn;}$aYtVirC`FeLj71qE+BVAn~}7R*iK|>eTIla{n*WFqDJSN z3I01CWIZ znk2{4w?W+z;NzWM-tD{viVH`A7W`MRB=RxMP#~5pE3gN#y4u6gg+TI6T0%3hVd7oJ z3qjypRnvm1h+2bw2CH_+vc!wfheRprw#Tqtd!08LwR@pUv`aANk?P$b<^w2yKd6a) zB)9qd(*L}_!H{u(!Ngtjkgg*|!MDgJPFFhD6JfL|w@S!#rVe;0lKS>DB1tTgnA~Ui zt|O48O~w%>{fBgCVWt+dlF&eb9vrRzP*5y(pC!GRRl?pbGIMrQ-{#?X7?5RQ65&l@ zmLU}nFauAjz<0s|o^o@o!9b*CXmZC->QS&bbV^v@hEsoDFSdO=vh=;O>8|bVHAAoM z{qXYk-gC<<%fBtZ{`iUmZ`Hsk^}-goFHlxg{msbevm;f-$A5eDnYTCCzFL^RxN^no zH;&=6`!^rDZ{tIyt6%-OvMOE{-nV0R$xDYWy}LX-JAdqS(XRSsd#frc8cwbn>mFV- zylnT*cN#xka>6#|TJ!LW>X)@wwjP+dbamc!?o9vw(A?=w3V5)5*GVcoqfK7E`0IJ; zV9ANaUESk>+4=Fv<|o=le_wT^V(Gf8-%kyJQ1RfY^hc@p-#9WceWSVfvG&1jXW9;X fUVi@gXWP~s{JQRgxt;4E8S$;5_Tcza-CO 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