From 025a30fd41c7a4fe5d5f5000ce6a0245c0129a16 Mon Sep 17 00:00:00 2001 From: Clownacy Date: Tue, 5 Feb 2019 21:47:42 +0000 Subject: [PATCH] Added all the remaining bullet types --- src/ArmsItem.cpp | 5 +- src/Bullet.cpp | 883 ++++++++++++++++++++++++++++++++++++++++++++++- src/Shoot.cpp | 375 +++++++++++++++++++- src/Shoot.h | 1 + 4 files changed, 1258 insertions(+), 6 deletions(-) diff --git a/src/ArmsItem.cpp b/src/ArmsItem.cpp index 55d441c2..e0176053 100644 --- a/src/ArmsItem.cpp +++ b/src/ArmsItem.cpp @@ -9,6 +9,7 @@ #include "Sound.h" #include "Main.h" #include "Game.h" +#include "Shoot.h" int gArmsEnergyX = 16; @@ -457,7 +458,7 @@ int RotationArms() if (!arms_num) return 0; - //ResetSpurCharge(); + ResetSpurCharge(); ++gSelectedArms; while (gSelectedArms < arms_num && !gArmsData[gSelectedArms].code) @@ -479,7 +480,7 @@ int RotationArmsRev() if (!arms_num) return 0; - //ResetSpurCharge(); + ResetSpurCharge(); if (--gSelectedArms < 0) gSelectedArms = arms_num - 1; diff --git a/src/Bullet.cpp b/src/Bullet.cpp index 115edae9..7a4cf6bf 100644 --- a/src/Bullet.cpp +++ b/src/Bullet.cpp @@ -169,6 +169,198 @@ void SetBullet(int no, int x, int y, int dir) } } +void ActBullet_Frontia1(BULLET *bul) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, 3, 0); + } + else + { + if (bul->act_no) + { + bul->x += bul->xm; + bul->y += bul->ym; + } + else + { + bul->ani_no = Random(0, 2); + bul->act_no = 1; + + switch (bul->direct) + { + case 0: + bul->xm = -0x600; + break; + case 1: + bul->ym = -0x600; + break; + case 2: + bul->xm = 0x600; + break; + case 3: + bul->ym = 0x600; + break; + } + } + + if (++bul->ani_wait > 0) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->ani_no > 3) + bul->ani_no = 0; + + RECT rcLeft[4]; + RECT rcRight[4]; + + rcLeft[0] = {136, 80, 152, 80}; + rcLeft[1] = {120, 80, 136, 96}; + rcLeft[2] = {136, 64, 152, 80}; + rcLeft[3] = {120, 64, 136, 80}; + + rcRight[0] = {120, 64, 136, 80}; + rcRight[1] = {136, 64, 152, 80}; + rcRight[2] = {120, 80, 136, 96}; + rcRight[3] = {136, 80, 152, 80}; + + if (bul->direct == 0) + bul->rect = rcLeft[bul->ani_no]; + else + bul->rect = rcRight[bul->ani_no]; + } +} + +void ActBullet_Frontia2(BULLET *bul, int level) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, 3, 0); + } + else + { + if (bul->act_no) + { + switch (bul->direct) + { + case 0: + bul->xm -= 0x80; + break; + case 1: + bul->ym -= 0x80; + break; + case 2: + bul->xm += 0x80; + break; + case 3: + bul->ym += 0x80; + break; + } + + switch (bul->direct) + { + case 0: + case 2: + if (bul->count1 % 5 == 2) + { + if (bul->ym < 0) + bul->ym = 0x400; + else + bul->ym = -0x400; + } + + break; + + case 1u: + case 3u: + if (bul->count1 % 5 == 2) + { + if (bul->xm < 0) + bul->xm = 0x400; + else + bul->xm = -0x400u; + } + + break; + } + + bul->x += bul->xm; + bul->y += bul->ym; + } + else + { + bul->ani_no = Random(0, 2); + bul->act_no = 1; + + switch (bul->direct) + { + case 0: + bul->xm = -0x200; + break; + case 1: + bul->ym = -0x200; + break; + case 2: + bul->xm = 0x200; + break; + case 3: + bul->ym = 0x200; + break; + } + + static unsigned int inc; + ++inc; + + switch (bul->direct) + { + case 0: + case 2: + if (inc % 2) + bul->ym = 0x400; + else + bul->ym = -0x400; + + break; + + case 1: + case 3: + if (inc % 2) + bul->xm = -0x400; + else + bul->xm = 0x400; + + break; + } + } + + if ( ++bul->ani_wait > 0 ) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if ( bul->ani_no > 2 ) + bul->ani_no = 0; + + RECT rect[3]; + + rect[0] = {192, 16, 208, 32}; + rect[1] = {208, 16, 224, 32}; + rect[2] = {224, 16, 240, 32}; + + bul->rect = rect[bul->ani_no]; + + if (level == 2) + SetNpChar(129, bul->x, bul->y, 0, -0x200, bul->ani_no, 0, 0x100); + else + SetNpChar(129, bul->x, bul->y, 0, -0x200, bul->ani_no + 3, 0, 0x100); + } +} + void ActBullet_PoleStar(BULLET *bul, int level) { if (++bul->count1 <= bul->life_count) @@ -1091,6 +1283,332 @@ void ActBullet_Spine(BULLET *bul) } } +void ActBullet_Sword1(BULLET *bul) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, 3, 0); + } + else + { + if (bul->count1 == 3) + bul->bbits &= ~4; + + if (bul->count1 % 5 == 1) + PlaySoundObject(34, 1); + + if (bul->act_no) + { + bul->x += bul->xm; + bul->y += bul->ym; + } + else + { + bul->act_no = 1; + + switch (bul->direct) + { + case 0: + bul->xm = -0x800; + break; + case 1: + bul->ym = -0x800; + break; + case 2: + bul->xm = 0x800; + break; + case 3: + bul->ym = 0x800; + break; + } + } + + RECT rcLeft[4]; + RECT rcRight[4]; + + rcLeft[0] = {0, 48, 16, 64}; + rcLeft[1] = {16, 48, 32, 64}; + rcLeft[2] = {32, 48, 48, 64}; + rcLeft[3] = {48, 48, 64, 64}; + + rcRight[0] = {64, 48, 80, 64}; + rcRight[1] = {80, 48, 96, 64}; + rcRight[2] = {96, 48, 112, 64}; + rcRight[3] = {112, 48, 128, 64}; + + if (++bul->ani_wait > 1) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->ani_no > 3) + bul->ani_no = 0; + + if (bul->direct == 0) + bul->rect = rcLeft[bul->ani_no]; + else + bul->rect = rcRight[bul->ani_no]; + } +} + +void ActBullet_Sword2(BULLET *bul) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, 3, 0); + } + else + { + if (bul->count1 == 3) + bul->bbits &= ~4; + + if (bul->count1 % 7 == 1) + PlaySoundObject(106, 1); + + if (bul->act_no) + { + bul->x += bul->xm; + bul->y += bul->ym; + } + else + { + bul->act_no = 1; + + switch (bul->direct) + { + case 0: + bul->xm = -0x800; + break; + case 1: + bul->ym = -0x800; + break; + case 2: + bul->xm = 0x800; + break; + case 3: + bul->ym = 0x800; + break; + } + } + + RECT rcLeft[4]; + RECT rcRight[4]; + + rcLeft[0] = {160, 48, 184, 72}; + rcLeft[1] = {184, 48, 208, 72}; + rcLeft[2] = {208, 48, 232, 72}; + rcLeft[3] = {232, 48, 256, 72}; + + rcRight[0] = {160, 72, 184, 96}; + rcRight[1] = {184, 72, 208, 96}; + rcRight[2] = {208, 72, 232, 96}; + rcRight[3] = {232, 72, 256, 96}; + + if (++bul->ani_wait > 1) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->ani_no > 3) + bul->ani_no = 0; + + if (bul->direct == 0) + bul->rect = rcLeft[bul->ani_no]; + else + bul->rect = rcRight[bul->ani_no]; + } +} + +void ActBullet_Sword3(BULLET *bul) +{ + RECT rcLeft[2]; + RECT rcUp[2]; + RECT rcDown[2]; + RECT rcRight[2]; + + rcLeft[0] = {272, 0, 296, 24}; + rcLeft[1] = {296, 0, 320, 24}; + + rcUp[0] = {272, 48, 296, 72}; + rcUp[1] = {296, 0, 320, 24}; + + rcRight[0] = {272, 24, 296, 48}; + rcRight[1] = {296, 24, 320, 48}; + + rcDown[0] = {296, 48, 320, 72}; + rcDown[1] = {296, 24, 320, 48}; + + switch (bul->act_no) + { + case 0: + bul->act_no = 1; + bul->xm = 0; + bul->ym = 0; + // Fallthrough + case 1: + switch (bul->direct) + { + case 0: + bul->xm = -0x800; + break; + case 1: + bul->ym = -0x800; + break; + case 2: + bul->xm = 0x800; + break; + case 3: + bul->ym = 0x800; + break; + } + + if (bul->life != 100) + { + bul->act_no = 2; + bul->ani_no = 1; + bul->damage = -1; + bul->act_wait = 0; + } + + if (++bul->act_wait % 4 == 1) + { + PlaySoundObject(106, 1); + + if (++bul->count1 % 2) + SetBullet(23, bul->x, bul->y, 0); + else + SetBullet(23, bul->x, bul->y, 2); + } + + if ( ++bul->count1 == 5 ) + bul->bbits &= ~4u; + + if (bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, 3, 0); + return; + } + + break; + + case 2: + bul->xm = 0; + bul->ym = 0; + ++bul->act_wait; + + if (Random(-1, 1) == 0) + { + PlaySoundObject(106, 1); + + if (Random(0, 1) % 2) + SetBullet(23, bul->x + (Random(-0x40, 0x40) * 0x200), bul->y + (Random(-0x40, 0x40) * 0x200), 0); + else + SetBullet(23, bul->x + (Random(-0x40, 0x40) * 0x200), bul->y + (Random(-0x40, 0x40) * 0x200), 2); + } + + if (bul->act_wait > 50) + bul->cond = 0; + } + + bul->x += bul->xm; + bul->y += bul->ym; + + switch (bul->direct) + { + case 0: + bul->rect = rcLeft[bul->ani_no]; + break; + case 1: + bul->rect = rcUp[bul->ani_no]; + break; + case 2: + bul->rect = rcRight[bul->ani_no]; + break; + case 3: + bul->rect = rcDown[bul->ani_no]; + break; + } + + if (bul->act_wait % 2) + bul->rect.right = 0; +} + +void ActBullet_Edge(BULLET *bul) +{ + RECT rcLeft[5]; + RECT rcRight[5]; + + switch (bul->act_no) + { + case 0: + bul->act_no = 1; + bul->y -= 0x1800; + + if (bul->direct == 0) + bul->x += 0x2000; + else + bul->x -= 0x2000; + // Fallthrough + case 1: + if (++bul->ani_wait > 2) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->direct == 0) + bul->x -= 0x400; + else + bul->x += 0x400; + + bul->y += 0x400; + + if (bul->ani_no == 1) + bul->damage = 2; + else + bul->damage = 1; + + if (bul->ani_no > 4) + bul->cond = 0; + + break; + } + + rcLeft[0] = {0, 64, 24, 88}; + rcLeft[1] = {24, 64, 48, 88}; + rcLeft[2] = {48, 64, 72, 88}; + rcLeft[3] = {72, 64, 96, 88}; + rcLeft[4] = {96, 64, 120, 88}; + + rcRight[0] = {0, 88, 24, 112}; + rcRight[1] = {24, 88, 48, 112}; + rcRight[2] = {48, 88, 72, 112}; + rcRight[3] = {72, 88, 96, 112}; + rcRight[4] = {96, 88, 120, 112}; + + if (bul->direct == 0) + bul->rect = rcLeft[bul->ani_no]; + else + bul->rect = rcRight[bul->ani_no]; +} + +void ActBullet_Drop(BULLET *bul) +{ + RECT rc[1]; + + rc[0] = {0, 0, 0, 0}; + + if (++bul->act_wait > 2) + bul->cond = 0; + + bul->rect = rc[0]; +} + void ActBullet_SuperMissile(BULLET *bul, int level) { if (++bul->count1 > bul->life_count) @@ -1344,6 +1862,313 @@ void ActBullet_SuperBom(BULLET *bul, int level) } } +void ActBullet_Nemesis(BULLET *bul, int level) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, 3, 0); + } + else + { + if (bul->act_no) + { + if (level == 1 && bul->count1 % 4 == 1) + { + switch (bul->direct) + { + case 0: + SetNpChar(4, bul->x, bul->y, -0x200, Random(-0x200, 0x200), 2, 0, 0x100); + break; + case 1: + SetNpChar(4, bul->x, bul->y, Random(-0x200, 0x200), -0x200, 2, 0, 0x100); + break; + case 2: + SetNpChar(4, bul->x, bul->y, 0x200, Random(-0x200, 0x200), 2, 0, 0x100); + break; + case 3: + SetNpChar(4, bul->x, bul->y, Random(-0x200, 0x200), 0x200, 2, 0, 0x100); + break; + } + } + + bul->x += bul->xm; + bul->y += bul->ym; + } + else + { + bul->act_no = 1; + bul->count1 = 0; + + switch (bul->direct) + { + case 0: + bul->xm = -0x1000; + break; + case 1: + bul->ym = -0x1000; + break; + case 2: + bul->xm = 0x1000; + break; + case 3: + bul->ym = 0x1000; + break; + } + + if (level == 3) + { + bul->xm /= 3; + bul->ym /= 3; + } + } + + if (++bul->ani_no > 1) + bul->ani_no = 0; + + RECT rcL[2]; + RECT rcU[2]; + RECT rcR[2]; + RECT rcD[2]; + + rcL[0] = {0, 112, 32, 128}; + rcL[1] = {0, 128, 32, 144}; + + rcU[0] = {32, 112, 48, 144}; + rcU[1] = {48, 112, 64, 144}; + + rcR[0] = {64, 112, 96, 128}; + rcR[1] = {64, 128, 96, 144}; + + rcD[0] = {96, 112, 112, 144}; + rcD[1] = {112, 112, 128, 144}; + + switch (bul->direct) + { + case 0: + bul->rect = rcL[bul->ani_no]; + break; + case 1: + bul->rect = rcU[bul->ani_no]; + break; + case 2: + bul->rect = rcR[bul->ani_no]; + break; + case 3: + bul->rect = rcD[bul->ani_no]; + break; + } + + bul->rect.top += 32 * ((level - 1) / 2); + bul->rect.bottom += 32 * ((level - 1) / 2); + bul->rect.left += (level - 1) % 2 << 7; + bul->rect.right += (level - 1) % 2 << 7; + } +} + +void ActBullet_Spur(BULLET *bul, int level) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, 3, 0); + } + else + { + if (bul->damage && bul->life != 100) + bul->damage = 0; + + if (bul->act_no) + { + bul->x += bul->xm; + bul->y += bul->ym; + } + else + { + bul->act_no = 1; + + switch (bul->direct) + { + case 0: + bul->xm = -0x1000; + break; + case 1: + bul->ym = -0x1000; + break; + case 2: + bul->xm = 0x1000; + break; + case 3: + bul->ym = 0x1000; + break; + } + + if (level == 1) + { + switch (bul->direct) + { + case 0: + bul->enemyYL = 0x400; + break; + case 1: + bul->enemyXL = 0x400; + break; + case 2: + bul->enemyYL = 0x400; + break; + case 3: + bul->enemyXL = 0x400; + break; + } + } + else if (level == 2) + { + switch (bul->direct) + { + case 0: + bul->enemyYL = 0x800; + break; + case 1: + bul->enemyXL = 0x800; + break; + case 2: + bul->enemyYL = 0x800; + break; + case 3: + bul->enemyXL = 0x800; + break; + } + } + } + + RECT rect1[2]; + RECT rect2[2]; + RECT rect3[2]; + + rect1[0] = {128, 32, 144, 48}; + rect1[1] = {144, 32, 160, 48}; + + rect2[0] = {160, 32, 176, 48}; + rect2[1] = {176, 32, 192, 48}; + + rect3[0] = {128, 48, 144, 64}; + rect3[1] = {144, 48, 160, 64}; + + bul->damage = bul->life; + + switch (level) + { + case 1: + if (bul->direct == 1 || bul->direct == 3) + bul->rect = rect1[1]; + else + bul->rect = rect1[0]; + + break; + + case 2: + if (bul->direct == 1 || bul->direct == 3) + bul->rect = rect2[1]; + else + bul->rect = rect2[0]; + + break; + + case 3: + if (bul->direct == 1 || bul->direct == 3) + bul->rect = rect3[1]; + else + bul->rect = rect3[0]; + + break; + } + + SetBullet(level + 39, bul->x, bul->y, bul->direct); + } +} + +void ActBullet_SpurTail(BULLET *bul, int level) +{ + if ( ++bul->count1 > 20 ) + bul->ani_no = bul->count1 - 20; + if ( bul->ani_no > 2 ) + bul->cond = 0; + if ( bul->damage && bul->life != 100 ) + bul->damage = 0; + + RECT rc_h_lv1[3]; + RECT rc_v_lv1[3]; + RECT rc_h_lv2[3]; + RECT rc_v_lv2[3]; + RECT rc_h_lv3[3]; + RECT rc_v_lv3[3]; + + rc_h_lv1[0] = {192, 32, 200, 40}; + rc_h_lv1[1] = {200, 32, 208, 40}; + rc_h_lv1[2] = {208, 32, 216, 40}; + + rc_v_lv1[0] = {192, 40, 200, 48}; + rc_v_lv1[1] = {200, 40, 208, 48}; + rc_v_lv1[2] = {208, 40, 216, 48}; + + rc_h_lv2[0] = {216, 32, 224, 40}; + rc_h_lv2[1] = {224, 32, 232, 40}; + rc_h_lv2[2] = {232, 32, 240, 40}; + + rc_v_lv2[0] = {216, 40, 224, 48}; + rc_v_lv2[1] = {224, 40, 232, 48}; + rc_v_lv2[2] = {232, 40, 240, 48}; + + rc_h_lv3[0] = {240, 32, 248, 40}; + rc_h_lv3[1] = {248, 32, 256, 40}; + rc_h_lv3[2] = {256, 32, 264, 40}; + + rc_v_lv3[0] = {240, 32, 248, 40}; + rc_v_lv3[1] = {248, 32, 256, 40}; + rc_v_lv3[2] = {256, 32, 264, 40}; + + switch (level) + { + case 1: + if (bul->direct == 0 || bul->direct == 2) + bul->rect = rc_h_lv1[bul->ani_no]; + else + bul->rect = rc_v_lv1[bul->ani_no]; + + break; + + case 2: + if (bul->direct == 0 || bul->direct == 2) + bul->rect = rc_h_lv2[bul->ani_no]; + else + bul->rect = rc_v_lv2[bul->ani_no]; + + break; + + case 3: + if (bul->direct == 0 || bul->direct == 2) + bul->rect = rc_h_lv3[bul->ani_no]; + else + bul->rect = rc_v_lv3[bul->ani_no]; + + break; + } +} + +void ActBullet_EnemyClear(BULLET *bul) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + } + else + { + bul->damage = 10000; + bul->enemyXL = 0xC8000; + bul->enemyYL = 0xC8000; + } +} + void ActBullet_Star(BULLET *bul) { if (++bul->count1 > bul->life_count) @@ -1360,6 +2185,15 @@ void ActBullet() { switch (gBul[i].code_bullet) { + case 1: + ActBullet_Frontia1(&gBul[i]); + break; + case 2: + ActBullet_Frontia2(&gBul[i], 2); + break; + case 3: + ActBullet_Frontia2(&gBul[i], 3); + break; case 4: ActBullet_PoleStar(&gBul[i], 1); break; @@ -1417,7 +2251,21 @@ void ActBullet() case 22: ActBullet_Spine(&gBul[i]); break; - // TODO everything else + case 23: + ActBullet_Edge(&gBul[i]); + break; + case 24: + ActBullet_Drop(&gBul[i]); + break; + case 25: + ActBullet_Sword1(&gBul[i]); + break; + case 26: + ActBullet_Sword2(&gBul[i]); + break; + case 27: + ActBullet_Sword3(&gBul[i]); + break; case 28: ActBullet_SuperMissile(&gBul[i], 1); break; @@ -1436,6 +2284,39 @@ void ActBullet() case 33: ActBullet_SuperBom(&gBul[i], 3); break; + case 34: + ActBullet_Nemesis(&gBul[i], 1); + break; + case 35: + ActBullet_Nemesis(&gBul[i], 2); + break; + case 36: + ActBullet_Nemesis(&gBul[i], 3); + break; + case 37: + ActBullet_Spur(&gBul[i], 1); + break; + case 38: + ActBullet_Spur(&gBul[i], 2); + break; + case 39: + ActBullet_Spur(&gBul[i], 3); + break; + case 40: + ActBullet_SpurTail(&gBul[i], 1); + break; + case 41: + ActBullet_SpurTail(&gBul[i], 2); + break; + case 42: + ActBullet_SpurTail(&gBul[i], 3); + break; + case 43: + ActBullet_Nemesis(&gBul[i], 1); + break; + case 44: + ActBullet_EnemyClear(&gBul[i]); + break; case 45: ActBullet_Star(&gBul[i]); break; diff --git a/src/Shoot.cpp b/src/Shoot.cpp index 874bf9e5..93958841 100644 --- a/src/Shoot.cpp +++ b/src/Shoot.cpp @@ -10,6 +10,76 @@ int empty; int spur_charge; +void ShootBullet_Frontia1(int level) +{ + int bul_no; + + switch (level) + { + case 1: + bul_no = 1; + break; + case 2: + bul_no = 2; + break; + case 3: + bul_no = 3; + break; + } + + if (CountArmsBullet(1) <= 3 && gKeyTrg & gKeyShot) + { + if (!UseArmsEnergy(1)) + { + ChangeToFirstArms(); + } + else + { + if (gMC.up) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - 0x600, gMC.y - 0x1400, 1); + SetCaret(gMC.x - 0x600, gMC.y - 0x1400, 3, 0); + } + else + { + SetBullet(bul_no, gMC.x + 0x600, gMC.y - 0x1400, 1); + SetCaret(gMC.x + 0x600, gMC.y - 0x1400, 3, 0); + } + } + else if (gMC.down) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - 0x600, gMC.y + 0x1400, 3); + SetCaret(gMC.x - 0x600, gMC.y + 0x1400, 3, 0); + } + else + { + SetBullet(bul_no, gMC.x + 0x600, gMC.y + 0x1400, 3); + SetCaret(gMC.x + 0x600, gMC.y + 0x1400, 3, 0); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - 0xC00, gMC.y + 0x400, 0); + SetCaret(gMC.x - 0x1800, gMC.y + 0x400, 3, 0); + } + else + { + SetBullet(bul_no, gMC.x + 0xC00, gMC.y + 0x400, 2); + SetCaret(gMC.x + 0x1800, gMC.y + 0x400, 3, 0); + } + } + + PlaySoundObject(33, 1); + } + } +} + void ShootBullet_PoleStar(int level) { int bul_no; @@ -163,6 +233,7 @@ void ShootBullet_Machinegun1(int level) if (CountArmsBullet(4) < 5) { int bul_no; + switch (level) { case 1: @@ -625,6 +696,283 @@ void ShootBullet_Bubblin2(int level) } } +void ShootBullet_Sword(int level) +{ + if (CountArmsBullet(9) <= 0) + { + int bul_no; + + switch (level) + { + case 1: + bul_no = 25; + break; + case 2: + bul_no = 26; + break; + case 3: + bul_no = 27; + break; + } + + if (gKeyTrg & gKeyShot) + { + if (gMC.up) + { + if (gMC.direct == 0) + SetBullet(bul_no, gMC.x - 0x200, gMC.y + 0x800, 1); + else + SetBullet(bul_no, gMC.x + 0x200, gMC.y + 0x800, 1); + } + else if (gMC.down) + { + if (gMC.direct == 0) + SetBullet(bul_no, gMC.x - 0x200, gMC.y - 0xC00, 3); + else + SetBullet(bul_no, gMC.x + 0x200, gMC.y - 0xC00, 3); + } + else + { + if (gMC.direct == 0) + SetBullet(bul_no, gMC.x + 0xC00, gMC.y - 0x600, 0); + else + SetBullet(bul_no, gMC.x - 0xC00, gMC.y - 0x600, 2); + } + + PlaySoundObject(34, 1); + } + } +} + +void ShootBullet_Nemesis(int level) +{ + int bul_no; + + switch (level) + { + case 1: + bul_no = 34; + break; + case 2: + bul_no = 35; + break; + case 3: + bul_no = 36; + break; + } + + if (CountArmsBullet(12) <= 1 && gKeyTrg & gKeyShot) + { + if (!UseArmsEnergy(1)) + { + PlaySoundObject(37, 1); + } + else + { + if (gMC.up) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - 0x200, gMC.y - 0x1800, 1); + SetCaret(gMC.x - 0x200, gMC.y - 0x1800, 3, 0); + } + else + { + SetBullet(bul_no, gMC.x + 0x200, gMC.y - 0x1800, 1); + SetCaret(gMC.x + 0x200, gMC.y - 0x1800, 3, 0); + } + } + else if (gMC.down) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - 0x200, gMC.y + 0x1800, 3); + SetCaret(gMC.x - 0x200, gMC.y + 0x1800, 3, 0); + } + else + { + SetBullet(bul_no, gMC.x + 0x200, gMC.y + 0x1800, 3); + SetCaret(gMC.x + 0x200, gMC.y + 0x1800, 3, 0); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - 0x2C00, gMC.y + 0x600, 0); + SetCaret(gMC.x - 0x2000, gMC.y + 0x600, 3, 0); + } + else + { + SetBullet(bul_no, gMC.x + 0x2C00, gMC.y + 0x600, 2); + SetCaret(gMC.x + 0x2000, gMC.y + 0x600, 3, 0); + } + } + + switch (level) + { + case 1: + PlaySoundObject(117, 1); + break; + case 2: + PlaySoundObject(49, 1); + break; + case 3: + PlaySoundObject(60, 1); + break; + } + } + } +} + +void ResetSpurCharge(void) +{ + spur_charge = 0; + + if (gArmsData[gSelectedArms].code == 13) + ZeroExpMyChar(); +} + +void ShootBullet_Spur(int level) +{ + int bul_no; + + bool bShot = false; + + if (gKey & gKeyShot) + { + if (gMC.equip & 8) + AddExpMyChar(3); + else + AddExpMyChar(2); + + if (++spur_charge / 2 % 2) + { + if (level == 1) + { + PlaySoundObject(59, 1); + } + else if (level == 2) + { + PlaySoundObject(60, 1); + } + else if (level == 3) + { + if (!IsMaxExpMyChar()) + PlaySoundObject(61, 1); + } + } + } + else + { + if (spur_charge) + bShot = true; + + spur_charge = 0; + } + + static bool bMax; + + if (IsMaxExpMyChar()) + { + if (bMax == false) + { + bMax = true; + PlaySoundObject(65, 1); + } + } + else + { + bMax = false; + } + + if (gKey & gKeyShot == 0) + ZeroExpMyChar(); + + switch (level) + { + case 1: + bul_no = 6; + bShot = false; + break; + case 2: + bul_no = 37; + break; + case 3: + if (bMax) + bul_no = 39; + else + bul_no = 38; + break; + } + + if (CountArmsBullet(13) <= 0 && CountArmsBullet(14) <= 0 && (gKeyTrg & gKeyShot || bShot)) + { + if (!UseArmsEnergy(1)) + { + PlaySoundObject(37, 1); + } + else + { + if (gMC.up) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - 0x200, gMC.y - 0x1000, 1); + SetCaret(gMC.x - 0x200, gMC.y - 0x1000, 3, 0); + } + else + { + SetBullet(bul_no, gMC.x + 0x200, gMC.y - 0x1000, 1); + SetCaret(gMC.x + 0x200, gMC.y - 0x1000, 3, 0); + } + } + else if (gMC.down) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - 0x200, gMC.y + 0x1000, 3); + SetCaret(gMC.x - 0x200, gMC.y + 0x1000, 3, 0); + } + else + { + SetBullet(bul_no, gMC.x + 0x200, gMC.y + 0x1000, 3); + SetCaret(gMC.x + 0x200, gMC.y + 0x1000, 3, 0); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - 0xC00, gMC.y + 0x600, 0); + SetCaret(gMC.x - 0x1800, gMC.y + 0x600, 3, 0); + } + else + { + SetBullet(bul_no, gMC.x + 0xC00, gMC.y + 0x600, 2); + SetCaret(gMC.x + 0x1800, gMC.y + 0x600, 3, 0); + } + } + + switch (bul_no) + { + case 6: + PlaySoundObject(49, 1); + break; + case 37: + PlaySoundObject(62, 1); + break; + case 38: + PlaySoundObject(63, 1); + break; + case 39: + PlaySoundObject(64, 1); + break; + } + } + } +} + void ShootBullet() { if (empty) @@ -647,6 +995,9 @@ void ShootBullet() { switch (gArmsData[gSelectedArms].code) { + case 1: + ShootBullet_Frontia1(gArmsData[gSelectedArms].level); + break; case 2: ShootBullet_PoleStar(gArmsData[gSelectedArms].level); break; @@ -673,13 +1024,31 @@ void ShootBullet() break; } + break; + case 9: + switch (gArmsData[gSelectedArms].level) + { + case 1: + ShootBullet_Sword(1); + break; + case 2: + ShootBullet_Sword(2); + break; + case 3: + ShootBullet_Sword(3); + break; + } + break; case 10: ShootBullet_Missile(gArmsData[gSelectedArms].level, true); break; + case 12: + ShootBullet_Nemesis(gArmsData[gSelectedArms].level); + break; + case 13: + ShootBullet_Spur(gArmsData[gSelectedArms].level); + break; } - - if (!(gKeyTrg & gKeyShot)) - return; } } diff --git a/src/Shoot.h b/src/Shoot.h index 8869077c..f5c02a1e 100644 --- a/src/Shoot.h +++ b/src/Shoot.h @@ -1,2 +1,3 @@ #pragma once +void ResetSpurCharge(void); void ShootBullet();