/** * check_direction(uint8 dir) * * @brief * @param dir * @return sboolean true or false */ sbool check_direction(uint8 dir) { uint32 x = player(myindex())->x; uint32 y = player(myindex())->y; uint32 i = 0; switch(dir){ case DIR_UP: y--; break; case DIR_DOWN: y++; break; case DIR_LEFT: x--; break; case DIR_RIGHT: x++; break; } if(map()->tile[GETXY(x,y)].type == TILE_TYPE_BLOCKED) return TRUE; for(i = 0; i < players_on_map(); i++){ if(player(player_on_map(i))->x == x && player(player_on_map(i))->y == y) return TRUE; } for(i = 0; i < MAX_MAP_NPCS; i++){ if(map()->npc[i].num){ if(map()->npc[i].x == x && map()->npc[i].y == y) return TRUE; } } return FALSE; }
void update_map_spawn_items(void) { uint8 x = 0; uint8 y = 0; for(y = 1; y < MAX_MAPS; y++){ if(!players_on_map(y)){ for( x = 0; x < MAX_MAP_ITEMS; x++){ map(y)->items[x].num = 0; map(y)->items[x].dur = 0; map(y)->items[x].value = 0; map(y)->items[x].x = 0; map(y)->items[x].y = 0; } spawn_map_items(y); send_map_items_to_all(y); } } }
/** * game loop(void) * * @brief Game loop function * @param void * @return void */ void gameloop(void) { uint32 i = 0; tick = gettickcount(); if(tmr25 < tick){ if(tempdata()->canmovenow){ check_movement(); check_attack(); } if(tempdata()->mapanimtimer < tick){ if(tempdata()->mapanim) tempdata()->mapanim = FALSE; else tempdata()->mapanim = TRUE; tempdata()->mapanimtimer = tick + .250; } tmr25 = tick + .025; } if(walktimer < tick){ for( i = 0; i < players_on_map(); i++){ if(player(player_on_map(i))->moving > 0) process_movement(player_on_map(i)); } for( i = 0; i < MAX_MAP_NPCS; i++){ if(map()->npc[i].num){ if(map()->npc[i].moving) process_npc_movement(i); } } walktimer = tick + .030; } }
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); } } } } }