Is this it?

This commit is contained in:
Themaister 2011-10-05 02:09:54 +02:00
parent a0acb75a19
commit 65ec7fae9c

View File

@ -90,6 +90,7 @@ struct netplay
uint32_t packet_buffer[UDP_FRAME_PACKETS * 2]; // To compat UDP packet loss we also send old data along with the packets. uint32_t packet_buffer[UDP_FRAME_PACKETS * 2]; // To compat UDP packet loss we also send old data along with the packets.
uint32_t frame_count; uint32_t frame_count;
uint32_t read_frame_count; uint32_t read_frame_count;
uint32_t other_frame_count;
struct addrinfo *addr; struct addrinfo *addr;
struct sockaddr_storage their_addr; struct sockaddr_storage their_addr;
bool has_client_addr; bool has_client_addr;
@ -543,7 +544,7 @@ bool netplay_poll(netplay_t *handle)
if (!get_self_input_state(handle)) if (!get_self_input_state(handle))
return false; return false;
// We skip reading the first frame so the host has a change to grab our host info so we don't block forever :') // We skip reading the first frame so the host has a chance to grab our host info so we don't block forever :')
if (handle->frame_count == 0) if (handle->frame_count == 0)
{ {
handle->buffer[0].used_real = true; handle->buffer[0].used_real = true;
@ -554,8 +555,8 @@ bool netplay_poll(netplay_t *handle)
return true; return true;
} }
//fprintf(stderr, "Before poll: Other ptr: %lu, Read ptr: %lu, Self ptr: %lu\n", handle->other_ptr, handle->read_ptr, handle->self_ptr);
/* /*
fprintf(stderr, "Other ptr: %lu, Read ptr: %lu, Self ptr: %lu\n", handle->other_ptr, handle->read_ptr, handle->self_ptr);
if (handle->buffer_size > 1) if (handle->buffer_size > 1)
{ {
assert(handle->other_ptr != handle->self_ptr); assert(handle->other_ptr != handle->self_ptr);
@ -594,13 +595,15 @@ bool netplay_poll(netplay_t *handle)
else else
{ {
// Cannot allow this. Should not happen though. // Cannot allow this. Should not happen though.
if (NEXT_PTR(handle->self_ptr) == handle->other_ptr) if (handle->self_ptr == handle->other_ptr)
{ {
SSNES_WARN("Netplay connection hung up. Will continue without netplay.\n"); SSNES_WARN("Netplay connection hung up. Will continue without netplay.\n");
return false; return false;
} }
} }
//fprintf(stderr, "After poll: Other ptr: %lu, Read ptr: %lu, Self ptr: %lu\n", handle->other_ptr, handle->read_ptr, handle->self_ptr);
if (handle->read_ptr != handle->self_ptr) if (handle->read_ptr != handle->self_ptr)
simulate_input(handle); simulate_input(handle);
else else
@ -670,33 +673,37 @@ void netplay_post_frame(netplay_t *handle)
handle->frame_count++; handle->frame_count++;
// Nothing to do... // Nothing to do...
if (handle->other_ptr == handle->read_ptr) if (handle->other_frame_count == handle->read_frame_count)
return; return;
// Skip ahead if we predicted correctly. Skip until our simulation failed. // Skip ahead if we predicted correctly. Skip until our simulation failed.
while (handle->other_ptr != handle->read_ptr) while (handle->other_frame_count < handle->read_frame_count)
{ {
struct delta_frame *ptr = &handle->buffer[handle->other_ptr]; struct delta_frame *ptr = &handle->buffer[handle->other_ptr];
if ((ptr->simulated_input_state != ptr->real_input_state) && !ptr->used_real) if ((ptr->simulated_input_state != ptr->real_input_state) && !ptr->used_real)
break; break;
handle->other_ptr = NEXT_PTR(handle->other_ptr); handle->other_ptr = NEXT_PTR(handle->other_ptr);
handle->other_frame_count++;
} }
if (handle->other_ptr != handle->read_ptr) if (handle->other_frame_count < handle->read_frame_count)
{ {
// Replay frames // Replay frames
handle->is_replay = true; handle->is_replay = true;
handle->tmp_ptr = handle->other_ptr; handle->tmp_ptr = handle->other_ptr;
psnes_unserialize(handle->buffer[handle->other_ptr].state, handle->state_size); psnes_unserialize(handle->buffer[handle->other_ptr].state, handle->state_size);
while (handle->tmp_ptr != handle->self_ptr) bool first = true;
while (first || (handle->tmp_ptr != handle->self_ptr))
{ {
psnes_serialize(handle->buffer[handle->tmp_ptr].state, handle->state_size); psnes_serialize(handle->buffer[handle->tmp_ptr].state, handle->state_size);
lock_autosave(); lock_autosave();
psnes_run(); psnes_run();
unlock_autosave(); unlock_autosave();
handle->tmp_ptr = NEXT_PTR(handle->tmp_ptr); handle->tmp_ptr = NEXT_PTR(handle->tmp_ptr);
first = false;
} }
handle->other_ptr = handle->read_ptr; handle->other_ptr = handle->read_ptr;
handle->other_frame_count = handle->read_frame_count;
handle->is_replay = false; handle->is_replay = false;
} }
} }