Patched bug #45 without resolving it
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
## Outline
|
## Outline
|
||||||
|
|
||||||
Tortuga is a 2D multiplayer JRPG featuring permadeath, with an emphasis on multiplayer cooperation, exploration and customization. The game runs on customizable public and private servers.
|
Tortuga is a 2D MMORPG featuring permadeath, with an emphasis on multiplayer cooperation, exploration and customization. The game runs on customizable public and private servers.
|
||||||
|
|
||||||
This game is inspired by classic 2D RPGs (Final Fantasy, The Legend of Zelda), as well as more modern sandboxes amd MMOs (Minecraft, EVE Online). This project is currently independently created and funded, with the goal of creating a game that will engage the players and inspire a large community.
|
This game is inspired by classic 2D RPGs (Final Fantasy, The Legend of Zelda), as well as more modern sandboxes amd MMOs (Minecraft, EVE Online). This project is currently independently created and funded, with the goal of creating a game that will engage the players and inspire a large community.
|
||||||
|
|
||||||
|
|||||||
@@ -125,8 +125,16 @@ void World::Update() {
|
|||||||
it.second.Update();
|
it.second.Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
//update the map
|
try {
|
||||||
UpdateMap();
|
//update the map
|
||||||
|
UpdateMap();
|
||||||
|
}
|
||||||
|
catch(terminal_error& e) {
|
||||||
|
throw(e);
|
||||||
|
}
|
||||||
|
catch(std::exception& e) {
|
||||||
|
std::cerr << "UpdateMap Error: " << e.what() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
//skip the rest without a local character
|
//skip the rest without a local character
|
||||||
if (!localCharacter) {
|
if (!localCharacter) {
|
||||||
@@ -164,9 +172,9 @@ void World::Render(SDL_Surface* const screen) {
|
|||||||
tileSheet.DrawRegionTo(screen, &(*it), camera.x, camera.y);
|
tileSheet.DrawRegionTo(screen, &(*it), camera.x, camera.y);
|
||||||
|
|
||||||
//debugging
|
//debugging
|
||||||
std::ostringstream msg;
|
// std::ostringstream msg;
|
||||||
msg << it->GetX() << ", " << it->GetY();
|
// msg << it->GetX() << ", " << it->GetY();
|
||||||
font.DrawStringTo(msg.str(), screen, it->GetX() * tileSheet.GetImage()->GetClipW() - camera.x, it->GetY() * tileSheet.GetImage()->GetClipH() - camera.y);
|
// font.DrawStringTo(msg.str(), screen, it->GetX() * tileSheet.GetImage()->GetClipW() - camera.x, it->GetY() * tileSheet.GetImage()->GetClipH() - camera.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
//draw the entities
|
//draw the entities
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#include "channels.hpp"
|
#include "channels.hpp"
|
||||||
|
|
||||||
#include <iostream>
|
#include <sstream>
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//static functions
|
//static functions
|
||||||
@@ -58,12 +58,11 @@ void World::SendRegionRequest(int roomIndex, int x, int y) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void World::hRegionContent(RegionPacket* const argPacket) {
|
void World::hRegionContent(RegionPacket* const argPacket) {
|
||||||
//debugging
|
|
||||||
std::cout << "hRegionContent(" << roomIndex << ", " << argPacket->x << ", " << argPacket->y << ")" << std::endl;
|
|
||||||
|
|
||||||
//checksum
|
//checksum
|
||||||
if (regionChecksum(argPacket->region) == 0) {
|
if (regionChecksum(argPacket->region) == 0) {
|
||||||
std::cout << "Received checksum failed: " << argPacket->x << ", " << argPacket->y << std::endl;
|
std::ostringstream msg;
|
||||||
|
msg << "Received region checksum failed: " << argPacket->x << ", " << argPacket->y;
|
||||||
|
throw(std::runtime_error(msg.str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
//replace existing regions
|
//replace existing regions
|
||||||
@@ -99,11 +98,20 @@ void World::UpdateMap() {
|
|||||||
for (int j = yStart; j <= yEnd; j += REGION_HEIGHT) {
|
for (int j = yStart; j <= yEnd; j += REGION_HEIGHT) {
|
||||||
Region* region = regionPager.FindRegion(i, j);
|
Region* region = regionPager.FindRegion(i, j);
|
||||||
if (!region) {
|
if (!region) {
|
||||||
|
//request absent region
|
||||||
SendRegionRequest(roomIndex, i, j);
|
SendRegionRequest(roomIndex, i, j);
|
||||||
}
|
}
|
||||||
else if (regionChecksum(region) == 0) {
|
else if (regionChecksum(region) == 0) {
|
||||||
std::cout << "Existing checksum failed: " << roomIndex << ", " << i << ", " << j << std::endl;
|
//checksum failed
|
||||||
|
//NOTE: this patches bug #45, but does not resolve it
|
||||||
|
regionPager.UnloadIf([region](Region const& ref) -> bool {
|
||||||
|
//remove the erroneous region
|
||||||
|
return region == &ref;
|
||||||
|
});
|
||||||
SendRegionRequest(roomIndex, i, j);
|
SendRegionRequest(roomIndex, i, j);
|
||||||
|
std::ostringstream msg;
|
||||||
|
msg << "Existing region checksum failed: " << roomIndex << ", " << i << ", " << j;
|
||||||
|
throw(std::runtime_error(msg.str()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,11 +70,8 @@ Region* RegionPagerBase::FindRegion(int x, int y) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Region* RegionPagerBase::PushRegion(Region* const ptr) {
|
Region* RegionPagerBase::PushRegion(Region* const ptr) {
|
||||||
//BUG: Lists seem to not work properly
|
//BUG: #45 Some regions are occasionally losing their tile data
|
||||||
regionList.push_front(*ptr);
|
regionList.push_front(*ptr);
|
||||||
// if (debugRegionSum(®ionList.front()) == 0) {
|
|
||||||
// throw(std::runtime_error("Checksum fail; RegionPagerBase::PushRegion()"));
|
|
||||||
// }
|
|
||||||
return ®ionList.front();
|
return ®ionList.front();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include <stack>
|
#include <stack>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
|
//TODO: (9) character collisions should be preformed client-side
|
||||||
void RoomData::RunFrame() {
|
void RoomData::RunFrame() {
|
||||||
//get the hook
|
//get the hook
|
||||||
lua_rawgeti(lua, LUA_REGISTRYINDEX, tickRef);
|
lua_rawgeti(lua, LUA_REGISTRYINDEX, tickRef);
|
||||||
|
|||||||
Reference in New Issue
Block a user