X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fgamescr.c;h=56e390010241d330a6d0f672fe92784834fe42cf;hb=fb3b2fcb8626823232533d59dad1be5dc27d6a78;hp=fa74c94a20f0049c8bcf8283bbfd61b77cc6680b;hpb=2e5cc6552f3e43f97fa049bb91498b4ae8877438;p=gbajam22 diff --git a/src/gamescr.c b/src/gamescr.c index fa74c94..56e3900 100644 --- a/src/gamescr.c +++ b/src/gamescr.c @@ -8,6 +8,7 @@ #include "input.h" #include "gba.h" #include "sprite.h" +#include "timer.h" #include "debug.h" #include "voxscape.h" #include "data.h" @@ -16,6 +17,10 @@ #define NEAR 2 #define FAR 85 +#define P_RATE 250 +#define E_RATE 250 +#define SHOT_TIME 50 + static int gamescr_start(void); static void gamescr_stop(void); static void gamescr_frame(void); @@ -36,7 +41,7 @@ struct enemy { struct vox_object vobj; short hp; short anm; - int last_fire; + int last_shot; }; #define ENEMY_VALID(e) ((e)->anm != 0) @@ -46,6 +51,7 @@ static int nframes, backbuf; static uint16_t *vram[] = { gba_vram_lfb0, gba_vram_lfb1 }; static int32_t pos[2], angle, horizon = 80; +static long last_shot; #define COLOR_HORIZON 192 #define COLOR_ZENITH 255 @@ -57,10 +63,12 @@ static int dynspr_base, dynspr_count; #define MAX_ENEMIES (255 - CMAP_SPAWN0) struct enemy enemies[MAX_ENEMIES]; -int num_enemies, total_enemies; +int num_kills, total_enemies; static int energy; #define MAX_ENERGY 5 +#define ENEMY_ENERGY 4 + #define XFORM_PIXEL_X(x, y) (xform_ca * (x) - xform_sa * (y) + (120 << 8)) #define XFORM_PIXEL_Y(x, y) (xform_sa * (x) + xform_ca * (y) + (80 << 8)) @@ -79,6 +87,21 @@ struct screen *init_game_screen(void) return &gamescr; } +static void setup_palette(void) +{ + int i; + unsigned char *cmap = gba_colors ? color_gba_cmap : color_cmap; + + emuprint("setting up %s palette", gba_colors ? "GBA" : "NDS/Emu"); + + for(i=0; i<256; i++) { + int r = cmap[i * 3]; + int g = cmap[i * 3 + 1]; + int b = cmap[i * 3 + 2]; + gba_bgpal[i] = RGB555(r, g, b); + } +} + static int gamescr_start(void) { int i, j, sidx; @@ -93,18 +116,15 @@ static int gamescr_start(void) vblperf_setcolor(0); pos[0] = pos[1] = VOX_SZ << 15; + angle = 0x8000; + last_shot = -P_RATE - 1; vox_init(VOX_SZ, VOX_SZ, height_pixels, color_pixels); vox_proj(FOV, NEAR, FAR); vox_view(pos[0], pos[1], -40, angle); /* setup color image palette */ - for(i=0; i<256; i++) { - int r = color_cmap[i * 3]; - int g = color_cmap[i * 3 + 1]; - int b = color_cmap[i * 3 + 2]; - gba_bgpal[i] = (((uint16_t)b << 7) & 0x7c00) | (((uint16_t)g << 2) & 0x3e0) | (((uint16_t)r >> 3) & 0x1f); - } + setup_palette(); spr_setup(16, 16, spr_game_pixels, spr_game_cmap); wait_vblank(); @@ -123,7 +143,7 @@ static int gamescr_start(void) spr_oam(oam, sidx++, SPRID_UISLASH, 216, 144, SPR_VRECT | SPR_256COL); dynspr_base = sidx; - num_enemies = total_enemies = 0; + num_kills = total_enemies = 0; energy = 5; memset(enemies, 0, sizeof enemies); @@ -147,8 +167,8 @@ static int gamescr_start(void) enemy->vobj.y = i; enemy->vobj.px = -1; enemy->anm = 0xff; - enemy->hp = 2; - enemy->last_fire = 0; + enemy->hp = ENEMY_ENERGY; + enemy->last_shot = timer_msec > E_RATE ? timer_msec - E_RATE : 0; if(++total_enemies >= MAX_ENEMIES) { goto endspawn; } @@ -267,9 +287,24 @@ static int update(void) pos[0] += fwd[0]; pos[1] += fwd[1]; } - if(keystate & BN_B) { - pos[0] -= fwd[0]; - pos[1] -= fwd[1]; + + if((keystate & BN_B) && (timer_msec - last_shot >= P_RATE)) { + last_shot = timer_msec; + for(i=0; i= 0) { + int dx = enemies[i].vobj.px - 120; + int dy = enemies[i].vobj.py - 80; + int rad = enemies[i].vobj.scale >> 5; + + /*emuprint("rad: %d (%d,%d)", rad, enemies[i].vobj.px, enemies[i].vobj.py);*/ + if(rad < 1) rad = 1; + + if(abs(dx) < rad && abs(dy) < (rad << 1)) { + enemies[i].hp--; + break; + } + } + } } if(keystate & BN_UP) { if(horizon > 40) horizon -= ELEV_SPEED; @@ -291,8 +326,8 @@ static int update(void) snum = 0; /* turrets number */ - spr_oam(oam, dynspr_base + snum++, numspr[num_enemies][0], 200, 144, SPR_VRECT | SPR_256COL); - spr_oam(oam, dynspr_base + snum++, numspr[num_enemies][1], 208, 144, SPR_VRECT | SPR_256COL); + spr_oam(oam, dynspr_base + snum++, numspr[num_kills][0], 200, 144, SPR_VRECT | SPR_256COL); + spr_oam(oam, dynspr_base + snum++, numspr[num_kills][1], 208, 144, SPR_VRECT | SPR_256COL); spr_oam(oam, dynspr_base + snum++, numspr[total_enemies][0], 224, 144, SPR_VRECT | SPR_256COL); spr_oam(oam, dynspr_base + snum++, numspr[total_enemies][1], 232, 144, SPR_VRECT | SPR_256COL); /* energy bar */ @@ -309,27 +344,30 @@ static int update(void) /*spr_oam(oam, dynspr_base + snum++, SPRID_ENEMY, 50, 50, SPR_VRECT | SPR_SZ64 | SPR_256COL);*/ enemy = enemies; for(i=0; ivobj.px >= 0) { - flags = SPR_SZ32 | SPR_DBLSZ | SPR_256COL | SPR_ROTSCL | SPR_ROTSCL_SEL(0); + flags = SPR_DBLSZ | SPR_256COL | SPR_ROTSCL | SPR_ROTSCL_SEL(0); if(enemies->hp > 0) { anm = (enemies->anm + (vblcount >> 3)) & 0xf; sid = SPRID_ENEMY0 + ((anm & 7) << 2); - flags |= SPR_VRECT; + flags |= SPR_SZ32 | SPR_VRECT; + yoffs = 32; } else { anm = 0; sid = SPRID_HUSK; + flags |= SPR_SZ16; + yoffs = 16; } px = enemy->vobj.px - 120; py = enemy->vobj.py - 80; xform_pixel(&px, &py); - spr_oam(oam, dynspr_base + snum++, sid, px - 20, py - 32, flags); + spr_oam(oam, dynspr_base + snum++, sid, px - 16, py - yoffs, flags); scale = enemy->vobj.scale; if(scale > 0x10000) scale = 0x10000; @@ -345,6 +383,17 @@ static int update(void) } enemy++; } + if(timer_msec - last_shot <= SHOT_TIME) { + spr_oam(oam, dynspr_base + snum++, SPRID_LAS0, -8, 118, SPR_SZ32 | SPR_256COL); + spr_oam(oam, dynspr_base + snum++, SPRID_LAS1, 22, 103, SPR_SZ32 | SPR_256COL); + spr_oam(oam, dynspr_base + snum++, SPRID_LAS2, 54, 88, SPR_SZ32 | SPR_256COL); + spr_oam(oam, dynspr_base + snum++, SPRID_LAS3, 86, 72, SPR_SZ32 | SPR_256COL); + + spr_oam(oam, dynspr_base + snum++, SPRID_LAS0, 240 + 8 - 32, 118, SPR_SZ32 | SPR_256COL | SPR_HFLIP); + spr_oam(oam, dynspr_base + snum++, SPRID_LAS1, 240 - 22 - 32, 103, SPR_SZ32 | SPR_256COL | SPR_HFLIP); + spr_oam(oam, dynspr_base + snum++, SPRID_LAS2, 240 - 54 - 32, 88, SPR_SZ32 | SPR_256COL | SPR_HFLIP); + spr_oam(oam, dynspr_base + snum++, SPRID_LAS3, 240 - 86 - 32, 72, SPR_SZ32 | SPR_256COL | SPR_HFLIP); + } for(i=snum; i