Пример #1
0
/**
* 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;
}
Пример #2
0
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);
		}
	}
}
Пример #3
0
/**
* 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;
	}
}
Пример #4
0
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);
				}
			}
		}
	}
}