function exploit()
    local nfa_me = nfa_helper:get_info()
    assert(nfa_me.data.is_actor == true, "只有角色才能调用exploit")

    local nfa_data = nfa_helper:read_contract_data({ exploit_start_block=true, exploit_count=true })
    nfa_data.exploit_start_block = nfa_data.exploit_start_block or contract_helper:block() -- 可能的初始化
    nfa_data.exploit_count = nfa_data.exploit_count or 0

    local tiandao = contract_helper:get_tiandao_property()
    if (contract_helper:block() - nfa_data.exploit_start_block) >= tiandao.v_1day_blocks then
        nfa_data.exploit_count = 0
        nfa_data.exploit_start_block = contract_helper:block()
    end

    assert(nfa_data.exploit_count < 2, "今天探索已经超过两次了")

    -- current zone exit
    local actor_me = contract_helper:get_actor_info(nfa_me.id)
    local zone_info = contract_helper:get_zone_info_by_name(actor_me.location)

    -- exploit target zone
    contract_helper:narrate(string.format('&YEL&%s&NOR&在周围搜寻了一会儿。', actor_me.name), true)
    local err = contract_helper:exploit_zone(actor_me.name, zone_info.name)
    assert(err == '', string.format('%s。', err))

    nfa_data.exploit_count = nfa_data.exploit_count + 1
    nfa_helper:write_contract_data(nfa_data, { exploit_start_block=true, exploit_count=true })
end

function break_new_zone()
    local nfa_me = nfa_helper:get_info()
    assert(nfa_me.data.is_actor == true, "只有角色才能调用break_new_zone")

    local nfa_data = nfa_helper:read_contract_data({ exploit_start_block=true, exploit_count=true })
    nfa_data.exploit_start_block = nfa_data.exploit_start_block or contract_helper:block() -- 可能的初始化
    nfa_data.exploit_count = nfa_data.exploit_count or 0

    local tiandao = contract_helper:get_tiandao_property()
    if (contract_helper:block() - nfa_data.exploit_start_block) >= tiandao.v_1day_blocks then
        nfa_data.exploit_count = 0
        nfa_data.exploit_start_block = contract_helper:block()
    end

    assert(nfa_data.exploit_count < 2, "今天探索已经超过两次了")

    -- current zone
    local actor_me = contract_helper:get_actor_info(nfa_me.id)
    local zone_info = contract_helper:get_zone_info_by_name(actor_me.location)

    -- exploit new zone
    contract_helper:narrate(string.format('&YEL&%s&NOR&在&HIC&%s&NOR&周边探索了很久。', actor_me.name, zone_info.name), true)
    local new_zone_name = contract_helper:break_new_zone(actor_me.name)
    if new_zone_name == '' then
        contract_helper:narrate('什么都没有发现', false)
    else
        contract_helper:narrate(string.format('&YEL&%s&NOR&发现了新的地区——&HIC&%s&NOR&！', actor_me.name, new_zone_name), true)
    end

    nfa_data.exploit_count = nfa_data.exploit_count + 1
    nfa_helper:write_contract_data(nfa_data, { exploit_start_block=true, exploit_count=true })
end