long computer_check_no_imps(struct Computer2 *comp, struct ComputerCheck * check) { struct Dungeon *dungeon; SYNCDBG(8,"Starting"); //return _DK_computer_check_no_imps(comp, check); dungeon = comp->dungeon; if (dungeon->num_active_diggers >= check->param1) { return 4; } long able; able = computer_able_to_use_magic(comp, PwrK_MKDIGGER, 0, 1); if (able == 1) { struct Thing *heartng; MapSubtlCoord stl_x, stl_y; heartng = get_player_soul_container(dungeon->owner); stl_x = heartng->mappos.x.stl.num; stl_y = heartng->mappos.y.stl.num; if (xy_walkable(stl_x, stl_y, dungeon->owner)) { if (try_game_action(comp, dungeon->owner, GA_UseMkDigger, 0, stl_x, stl_y, 1, 1) > Lb_OK) { able = 1; } } } return able; }
/** * Checks if a computer player has not enough imps. * @param comp * @param check The check structure; param1 is preferred amount of imps, param2 is minimal amount. */ long computer_check_no_imps(struct Computer2 *comp, struct ComputerCheck * check) { if (is_newdig_enabled(comp)) { //workaround for interval seeming to be ignored by from my reconfiguration. //modern computers can handle interval 1 and interval 200 is awfully passive and easy to kill //interval 20 means player-like imp swarms will form while not being excessive //consider making configurable again if *properly* reconfiguring to 20 for all levels except easy beginner levels if (check->turns_interval > 20) check->turns_interval = 20; if (check->param2 < 8) check->param2 = 8; } struct Dungeon *dungeon; SYNCDBG(8,"Starting"); dungeon = comp->dungeon; if (dungeon_invalid(dungeon) || !player_has_heart(dungeon->owner)) { SYNCDBG(7,"Computer players %d dungeon in invalid or has no heart",(int)dungeon->owner); return CTaskRet_Unk4; } long power_price, lowest_price; TbBool diggers_are_cheap; power_price = compute_power_price(dungeon->owner, PwrK_MKDIGGER, 0); lowest_price = compute_lowest_digger_price(dungeon->owner); diggers_are_cheap = power_price <= lowest_price; //see if we can sacrifice imps to reduce price if (gameadd.sacrifice_info.classic_imp_sacrifice) { SYNCDBG(18, "Imp creation power price: %d, lowest: %d", power_price, lowest_price); if (!diggers_are_cheap && dungeon->total_money_owned > power_price //TODO: might need to multiply for safety factor && dungeon_has_room(dungeon, RoK_TEMPLE)) { struct Thing* imp; imp = find_imp_for_sacrifice(comp->dungeon); if (!thing_is_invalid(imp)) { long dist; struct Room* room; room = find_room_nearest_to_position(dungeon->owner, RoK_TEMPLE, &imp->mappos, &dist); if (!room_is_invalid(room)) { if (create_task_move_creature_to_subtile(comp, imp, room->central_stl_x, room->central_stl_y, CrSt_CreatureSacrifice)) return CTaskRet_Unk4; } } } } //regular old imp check after this point long controlled_diggers; TbBool digging_gems; long limit; digging_gems = is_digging_any_gems(dungeon); controlled_diggers = dungeon->num_active_diggers - count_player_diggers_not_counting_to_total(dungeon->owner); //SYNCLOG("controlled diggers of %d = %d, params = %d %d", (int)dungeon->owner, controlled_diggers, check->param1, check->param2); limit = check->param1; if (digging_gems) { if (diggers_are_cheap) limit = max(limit, 50); else limit = max(limit, 20); } if (controlled_diggers >= limit) { return CTaskRet_Unk4; } long able; if ((controlled_diggers == 0 || (controlled_diggers < 3 && (digging_gems || diggers_are_cheap))) && is_power_available(dungeon->owner, PwrK_MKDIGGER)) { //ignore payday and everything else, we need at least 3 imp to play the game able = dungeon->total_money_owned >= compute_power_price(dungeon->owner, PwrK_MKDIGGER, 0); //TODO: recovery could be improved further by looking at length to payday and time it takes to get more money to increase lower bound } else if (controlled_diggers >= check->param2 && !digging_gems) { // We have less than preferred amount, but higher than minimal; allow building if we've got spare money able = computer_able_to_use_magic(comp, PwrK_MKDIGGER, 0, 3 + (controlled_diggers - check->param2)/4); } else { able = computer_able_to_use_magic(comp, PwrK_MKDIGGER, 0, 1); } if (able == CTaskRet_Unk1) { struct Thing *heartng; MapSubtlCoord stl_x, stl_y; heartng = get_player_soul_container(dungeon->owner); stl_x = heartng->mappos.x.stl.num; stl_y = heartng->mappos.y.stl.num; if (xy_walkable(stl_x, stl_y, dungeon->owner)) { if (try_game_action(comp, dungeon->owner, GA_UseMkDigger, 0, stl_x, stl_y, 1, 1) > Lb_OK) { return CTaskRet_Unk1; } } return CTaskRet_Unk1; } return CTaskRet_Unk0; }