sbool ai_npc_move(uint32 mapnum, uint8 mapnpcnum, uint16 target) { switch(rand() % 4){ case 0: if(map(mapnum)->npc[mapnpcnum].y > player(target)->y && !ai_npc_move(mapnum,mapnpcnum,target)){ if(can_npc_move(mapnum, mapnpcnum,DIR_UP)){ npc_move(mapnum, mapnpcnum, DIR_UP); return TRUE; } break; } case 1: if(map(mapnum)->npc[mapnpcnum].y < player(target)->y && !ai_npc_move(mapnum,mapnpcnum,target)){ if(can_npc_move(mapnum, mapnpcnum,DIR_DOWN)){ npc_move(mapnum, mapnpcnum, DIR_DOWN); return TRUE; } } break; case 2: if(map(mapnum)->npc[mapnpcnum].x > player(target)->x && !ai_npc_move(mapnum,mapnpcnum,target)){ if(can_npc_move(mapnum, mapnpcnum,DIR_LEFT)){ npc_move(mapnum, mapnpcnum, DIR_LEFT); return TRUE; } } break; case 3: if(map(mapnum)->npc[mapnpcnum].x < player(target)->x && !ai_npc_move(mapnum,mapnpcnum,target)){ if(can_npc_move(mapnum, mapnpcnum,DIR_RIGHT)){ npc_move(mapnum, mapnpcnum, DIR_RIGHT); return TRUE; } } break; } return FALSE; }
void ai_npc_collision(sbool didwalk, uint32 mapnum , uint8 mapnpcnum, uint16 target) { uint8 i; if(didwalk) return; if(!didwalk){ if(map(mapnum)->npc[mapnpcnum].x - 1 == player(target)->x && map(mapnum)->npc[mapnpcnum].y == player(target)->y) if(map(mapnum)->npc[mapnpcnum].dir != DIR_LEFT) npc_dir(mapnum, mapnpcnum, DIR_LEFT); didwalk = TRUE; } if(!didwalk){ if(map(mapnum)->npc[mapnpcnum].x + 1 == player(target)->x && map(mapnum)->npc[mapnpcnum].y == player(target)->y) if(map(mapnum)->npc[mapnpcnum].dir != DIR_RIGHT) npc_dir(mapnum, mapnpcnum, DIR_RIGHT); didwalk = TRUE; } if(!didwalk){ if(map(mapnum)->npc[mapnpcnum].x == player(target)->x && map(mapnum)->npc[mapnpcnum].y - 1 == player(target)->y) if(map(mapnum)->npc[mapnpcnum].dir != DIR_UP) npc_dir(mapnum, mapnpcnum, DIR_UP); didwalk = TRUE; } if(!didwalk){ if(map(mapnum)->npc[mapnpcnum].x == player(target)->x && map(mapnum)->npc[mapnpcnum].y + 1 == player(target)->y) if(map(mapnum)->npc[mapnpcnum].dir != DIR_DOWN) npc_dir(mapnum, mapnpcnum, DIR_DOWN); didwalk = TRUE; } if(!didwalk){ if((rand() % 2) == 1){ i = rand() % 4; if(can_npc_move(mapnum, mapnpcnum, i)) npc_move(mapnum, mapnpcnum, i); } } }
void move_enemies() { struct map_list *curr = maps; while(curr) { struct map_t *map = curr->map; struct npc_list *npcs = map->enemies; while(npcs) { struct npc_data *npc = npcs->npc; npc_move(npc); npcs = npcs->next; } curr = curr->next; } }
void update_npc_ai(void) { uint8 i = 0; uint32 mapnum = 1; uint8 mapnpcnum = 0; uint16 npcnum, target; double tickcount; uint32 damage; char *string = NULL; for(mapnum = 1; mapnum < MAX_MAPS; mapnum++){ if(players_on_map(mapnum)){ tickcount = gettickcount(); for(mapnpcnum = 0; mapnpcnum < MAX_MAP_NPCS; mapnpcnum++){ npcnum = map(mapnum)->npc[mapnpcnum].num; if(npcnum > 0){ target = map(mapnum)->npc[mapnpcnum].target; ai_attack_on_sight(mapnpcnum, target, mapnum); if(npc(npcnum)->behavior != BEHAVIOR_SHOPKEEPER){ if(target > 0){ if(temp_player(target)->loggedin && player(target)->map == mapnum){ ai_npc_collision(ai_npc_move(mapnum, mapnpcnum, target), mapnum, mapnpcnum, target); if(can_npc_attack_player(mapnpcnum,target)){ if(!can_player_block_hit(target)){ damage = npc(npcnum)->stat[STAT_STRENGTH] - get_player_protection(target); npc_attack_player(mapnpcnum, target, damage); } else{ string = comb_4str(item(player(target)->inv[player(target)->equipment[EQUIPMENT_SHIELD]].id)->name, " blocks the ", npc(npcnum)->name,"'s hit!"); player_msg(target, string, 1); //bright cyan } } else map(mapnum)->npc[mapnpcnum].target = 0; } else map(mapnum)->npc[mapnpcnum].target = 0; } } else{ if((rand() % 4) == 1){ i = rand() % 4; if(can_npc_move(mapnum,mapnpcnum, i)) npc_move(mapnum,mapnpcnum,i); } } ai_hp_regen(tickcount, mapnum, mapnpcnum); if(tickcount > map(mapnum)->npc[mapnpcnum].spawnwait + npc(map(mapnum)->npc[mapnpcnum].num)->spawnsecs * 1000) spawn_npc(mapnpcnum, mapnum); } } } } }
int main() { window_setup(); data_setup(); SDL_Event event; while(1) { start_time = SDL_GetTicks(); if (SDL_PollEvent(&event)) { handle_event(&event); } /* //Set up screen and background display for (int x = 0; x < SCREEN_WIDTH / SPRITE_SIZE; x++) { for (int y = 0; y < SCREEN_HEIGHT / SPRITE_SIZE; y++) { rcGrass.x = x * SPRITE_SIZE; rcGrass.y = y * SPRITE_SIZE; SDL_BlitSurface(grass, &rcSrc_Grass, screen, &rcGrass); } } */ SDL_BlitSurface(grass, &rcSrc_Grass, screen, &rcGrass); //Handle character movement int i = 0; for (i = 0; i<2; i++){ npc_move(&demo[i]); animate(&demo[i]); move(&demo[i]); rcSprite.x = demo[i].move.position[0]; rcSprite.y = demo[i].move.position[1]; switch(demo[i].move.direction) { case SDLK_UP: rcSrc_Sprite.y = demo[i].up[demo[i].cur_frame]; break; case SDLK_DOWN: rcSrc_Sprite.y = demo[i].down[demo[i].cur_frame]; break; case SDLK_LEFT: rcSrc_Sprite.y = demo[i].left[demo[i].cur_frame]; break; case SDLK_RIGHT: rcSrc_Sprite.y = demo[i].right[demo[i].cur_frame]; break; } SDL_BlitSurface(sprite, &rcSrc_Sprite, screen, &rcSprite); }/* animate(&demo1); animate(&demo2); move(&demo1); move(&demo2); rcSprite.x = demo1.move.position[0]; rcSprite.y = demo1.move.position[1]; switch(demo1.move.direction) { case SDLK_UP: rcSrc_Sprite.y = demo1.up[demo1.cur_frame]; break; case SDLK_DOWN: rcSrc_Sprite.y = demo1.down[demo1.cur_frame]; break; case SDLK_LEFT: rcSrc_Sprite.y = demo1.left[demo1.cur_frame]; break; case SDLK_RIGHT: rcSrc_Sprite.y = demo1.right[demo1.cur_frame]; break; } */ SDL_UpdateRect(screen, 0, 0, 0, 0); endtime = SDL_GetTicks()-start_time; if (1000/FPS > endtime) SDL_Delay((1000/FPS)-endtime); } }