Mercurial > repos > genjam1
view src/creep.c @ 23:330e58fb01aa
simple object selection
author | William Morgan <bill@mrgn.org> |
---|---|
date | Mon, 13 Jan 2014 23:05:30 -0800 |
parents | 51a0972fcf76 |
children |
line wrap: on
line source
#include <genesis.h> #include "creep.h" #include "map.h" creep creeps[MAX_CREEPS]; u16 cur_creeps; const s16 speeds[NUM_SPECIES] = { 2 }; u16 spawn_creep(u8 species, s16 x, s16 y) { u16 index; for (index = 0; index < MAX_SPRITE; index++) { if (spriteDefCache[index].posx == -0x80) { break; } } if (index > 0) { VDP_setSprite(index, x, y, SPRITE_SIZE(1, 1), TILE_ATTR_FULL(2, 0, 0, 0, 'C' + TILE_FONTINDEX), spriteDefCache[0].link); spriteDefCache[0].link = index; } else { VDP_setSprite(index, x, y, SPRITE_SIZE(1, 1), TILE_ATTR_FULL(2, 0, 0, 0, 'C' + TILE_FONTINDEX), 0); } creeps[cur_creeps].index = index; creeps[cur_creeps].health = 1000; creeps[cur_creeps].species = species; creeps[cur_creeps].direction = 0; creeps[cur_creeps].targetx = x; creeps[cur_creeps].targety = y; return cur_creeps++; } void update_creeps(void) { s16 i, disty, distx, mdist; for (i = cur_creeps-1; i >= 0; --i) { creep *cur = creeps + i; SpriteDef * sprite = spriteDefCache + cur->index; distx = sprite->posx - cur->targetx; if (distx < 0) distx = -distx; disty = sprite->posy - cur->targety; if (disty < 0) disty = -disty; mdist = distx > disty ? distx : disty; if (mdist < speeds[cur->species]) { s16 dindex = sprite->posx / 16 + (sprite->posy / 16) * 20; if (distances[dindex]) { u16 bestdist = 0xFFFF; s16 bestindex = 0xFFFF,diff,next; if (sprite->posx > 8 && distances[dindex-1] < bestdist) { bestindex = dindex-1; bestdist = distances[bestindex]; } if (sprite->posx < (320-16) && distances[dindex+1] < bestdist) { bestindex = dindex+1; bestdist = distances[bestindex]; } if (sprite->posy > 8 && distances[dindex-20] < bestdist) { bestindex = dindex-20; bestdist = distances[bestindex]; } if (sprite->posy < (224-16) && distances[dindex+20] < bestdist) { bestindex = dindex+20; bestdist = distances[bestindex]; } diff = bestindex-dindex; next = bestindex + diff; while (next >= 0 && next < 20*14 && distances[next] < bestdist) { bestindex = next; bestdist = distances[bestindex]; } cur->targetx = (bestindex % 20) * 16 + 4; cur->targety = (bestindex / 20) * 16 + 4; } else { //creep is at the goal VDP_setSpritePosition(cur->index, -0x80, -0x80); cur_creeps--; if (i != cur_creeps) { memcpy(cur, creeps+cur_creeps, sizeof(creep)); } } } else { if (distx > disty) { VDP_setSpritePosition(cur->index, sprite->posx + (sprite->posx > cur->targetx ? -speeds[cur->species] : speeds[cur->species]), sprite->posy); } else { VDP_setSpritePosition(cur->index, sprite->posx, sprite->posy + (sprite->posy > cur->targety ? -speeds[cur->species] : speeds[cur->species])); } } } }