From 3457454e06c5d4f0cbd79162b30808e8c67a91cd Mon Sep 17 00:00:00 2001 From: rustushki Date: Mon, 17 Sep 2007 02:42:50 +0000 Subject: [PATCH] Testing Complete. I've verified that Bounding Box Id 1 is being loaded with all the MapObjects present in it. In turn each MapObject is being created and granted hardpoints and npc paths accordingly. --- AUTHORS | 13 ++++++ Makefile.am | 1 + README | 45 +++++++------------- database/Makefile | 2 +- database/createdb.sql | 2 +- database/populatedb.sql | 34 +++++++++------ database/sqlite3.cpp | 10 ++--- src/Database.cpp | 81 ++++++++++++++++++++++++++--------- src/Database.h | 5 ++- src/DatabaseColumnMap.h | 5 +-- src/Makefile.am | 2 + src/MapObject.cpp | 2 +- src/MapObjectFactory.cpp | 80 ++++++++++++++++++++--------------- src/MapObjectFactory.h | 5 ++- src/QueryGenerator.cpp | 59 ++++++++++++++++++-------- src/QueryGenerator.h | 2 +- src/{Database.h => RowSet.cpp} | 96 +++++++++++++++++++++++++++++++----------- src/{main.cpp => RowSet.h} | 30 ++++++++++--- src/main.cpp | 5 +++ 19 files changed, 319 insertions(+), 160 deletions(-) rewrite README (96%) copy src/{Database.h => RowSet.cpp} (50%) copy src/{main.cpp => RowSet.h} (68%) diff --git a/AUTHORS b/AUTHORS index e69de29..8546b65 100644 --- a/AUTHORS +++ b/AUTHORS @@ -0,0 +1,13 @@ +Developers: +Ben Markwardt +Sean Eubanks +Russ Adams + +Story and Gameplay: +Erick Bousman + +Graphic Artist: +Steve Brush + +Other Contributors: +Countless Spammers diff --git a/Makefile.am b/Makefile.am index af437a6..f0c13d8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1 +1,2 @@ SUBDIRS = src +EXTRA_DIST = src/asgard.db3 diff --git a/README b/README dissimilarity index 96% index eeb7bb8..cbe39ae 100644 --- a/README +++ b/README @@ -1,30 +1,15 @@ -Short Guide for Making GNU-style Package: -09/03/2007 -Written by Russ Adams - - -[only if necessary] - 1. Change trunk/packages/gnu/asgard/configure.ac - 2. Change trunk/packages/gnu/asgard/Makefile.am - 3. Change trunk/packages/gnu/asgard/src/Makefile.am - 4. Add any other necessary Makefile.am's - * at this point, be sure to add any new Makefile.am's or changes to - configure.ac to source control - -[required] - 5. cd trunk/packages/gnu - 6. make - 7. cd asgard - 8. aclocal - 9. autoheader -10. autoconf -11. automake --add-missing - -[test-compile] -12. ./configure -13. make - -[making a tar.gz] -14. make dist - -The created package should appear in trunk/packages/gnu/asgard/asgard-version.tar.gz. +Running Asgard +09/16/2007 +Written by Russ Adams + +Standard flags work, you may: + +% ./configure +% make +% make install + +finally, + +% asgard + +Finally, you will need to run `asgard` in the working directory with asgard.db3. A copy was included in ./src/. diff --git a/database/Makefile b/database/Makefile index bb6a26b..a6a615b 100644 --- a/database/Makefile +++ b/database/Makefile @@ -4,7 +4,7 @@ create: ./runquery asgard.db3 createdb.sql ./runquery asgard.db3 populatedb.sql install: - mv asgard.db3 ../src + cp asgard.db3 ../src clean: rm runquery rm asgard.db3 diff --git a/database/createdb.sql b/database/createdb.sql index ab3bafc..21e764c 100644 --- a/database/createdb.sql +++ b/database/createdb.sql @@ -25,7 +25,7 @@ create table NonPlayerCharacterPath create table BoundingBox ( - BoundingBoxId integer(10) primary key, + BoundingBoxId integer primary key, WC_X integer(10) null, WC_Y integer(10) null, Height integer(10) null, diff --git a/database/populatedb.sql b/database/populatedb.sql index e1449c8..72db93b 100644 --- a/database/populatedb.sql +++ b/database/populatedb.sql @@ -18,44 +18,54 @@ insert into MapObject (MapObjectId,WC_X,WC_Y,Height,Width,BoundingBoxId) values(NULL,23,47,3,3,1); +-- Puddle (id = 4) +insert into MapObject +(MapObjectId,WC_X,WC_Y,Height,Width,BoundingBoxId) +values(NULL,1,1,2,2,1); + --Treasure Chest's Container (Saftey Match) insert into Container -(item0) -values(1); +(MapObjectId,item0) +values(2,1); --Hand's NPC insert into NonPlayerCharacter (MapObjectId,Speed) values(3,1); +--Puddle's Tile +insert into Tiles +(MapObjectId,TileType) +values(4,0); + --Hand's NPC Path insert into NonPlayerCharacterPath (MapObjectId,WC_X,WC_Y,PathIndex) -values(1,43,43,0); +values(3,43,43,0); insert into NonPlayerCharacterPath (MapObjectId,WC_X,WC_Y,PathIndex) -values(1,33,25,1); +values(3,33,25,1); insert into NonPlayerCharacterPath (MapObjectId,WC_X,WC_Y,PathIndex) -values(1,55,3,2); +values(3,55,3,2); insert into NonPlayerCharacterPath (MapObjectId,WC_X,WC_Y,PathIndex) -values(1,23,47,3); +values(3,23,47,3); --Palm Tree's Hardpoint ---Hardpoint Type = 2 = CircHardPoint +--Hardpoint Type = 1 = CircHardPoint insert into Hardpoints (MapObjectId,HardpointType,RelativeX,RelativeY,Radius) -values(1,2,0,0,3); +values(1,1,0,0,3); --Treasure Chest's Hardpoint ---Hardpoint Type = 1 = CircHardPoint +--Hardpoint Type = 0 = RectHardPoint insert into Hardpoints (MapObjectId,HardpointType,RelativeX,RelativeY,Height,Width) -values(2,1,0,0,5,5); +values(2,0,0,0,5,5); --Hand's Hardpoint ---Hardpoint Type = 2 = CircHardPoint +--Hardpoint Type = 1 = CircHardPoint insert into Hardpoints (MapObjectId,HardpointType,RelativeX,RelativeY,Radius) -values(3,2,0,0,3); +values(3,1,0,0,3); diff --git a/database/sqlite3.cpp b/database/sqlite3.cpp index fdaecef..7a543c0 100644 --- a/database/sqlite3.cpp +++ b/database/sqlite3.cpp @@ -10,11 +10,11 @@ using std::ifstream; using std::stringstream; using std::endl; - -/*static int callback(void *NotUsed, int argc, char ** argv, char **azColName) +int callback(void *NotUsed, int argc, char ** argv, char **azColName) { + cout << "foo"; return 0; -}*/ +} int main(int argc, char **argv) { @@ -27,7 +27,7 @@ int main(int argc, char **argv) if (argc >= 1 && argc < 3) { - cout << "usage: querydb \n"; + cout << "usage: runquery \n"; return 0; } @@ -43,7 +43,7 @@ int main(int argc, char **argv) sqlite_script.close(); rc = sqlite3_open(argv[1], &db); - rc = sqlite3_exec(db, query.c_str(), 0, 0, &zErrMsg); + rc = sqlite3_exec(db, query.c_str(), callback, 0, &zErrMsg); if (rc > 0) { diff --git a/src/Database.cpp b/src/Database.cpp index b671d41..14bf9d5 100644 --- a/src/Database.cpp +++ b/src/Database.cpp @@ -24,6 +24,7 @@ #include "QueryGenerator.h" #include "DatabaseColumnMap.h" #include "GameEngine.h" +#include "RowSet.h" Database* Database::instance = NULL; @@ -53,43 +54,81 @@ Database* Database::getInstance() void Database::determineVisibleBoxes(Coordinate currentPosition, int *visibleBoxes, int numVisibleBoxes) { // Map as of 0.3.0 is 1 boundbox, 0. - visibleBoxes[0] = 0; + visibleBoxes[0] = 1; } bool Database::loadBoundingBox(int boxId) { - char **sqliteErrorCode; + char* query; + MapObjectType type; + char *sqliteErrorCode; - sqlite3_exec(this->asgardDb, QueryGenerator::container(boxId), MapObjectFactory::processRow, (void*)(MAP_OBJECT_TYPE_CONTAINER), sqliteErrorCode); - sqlite3_exec(this->asgardDb, QueryGenerator::nonPlayerCharacter(boxId), MapObjectFactory::processRow, (void*)MAP_OBJECT_TYPE_NON_PLAYER_CHARACTER, sqliteErrorCode); - sqlite3_exec(this->asgardDb, QueryGenerator::staticMapObject(boxId), MapObjectFactory::processRow, (void*)MAP_OBJECT_TYPE_STATIC_MAP_OBJECT, sqliteErrorCode); - sqlite3_exec(this->asgardDb, QueryGenerator::tile(boxId), MapObjectFactory::processRow, (void*)MAP_OBJECT_TYPE_TILE, sqliteErrorCode); + // Invalid Bounding Box + if (boxId <= 0) + return false; + + // NonPlayerCharacter + query = QueryGenerator::nonPlayerCharacter(boxId); + type = MAP_OBJECT_TYPE_NON_PLAYER_CHARACTER; + sqlite3_exec(this->asgardDb, query, MapObjectFactory::processRow, (void*)&type, &sqliteErrorCode); + delete query; + + // Container + query = QueryGenerator::container(boxId); + type = MAP_OBJECT_TYPE_CONTAINER; + sqlite3_exec(this->asgardDb, query, MapObjectFactory::processRow, (void*)&type, &sqliteErrorCode); + delete query; + + // StaticMapObject + query = QueryGenerator::staticMapObject(boxId); + type = MAP_OBJECT_TYPE_STATIC_MAP_OBJECT; + sqlite3_exec(this->asgardDb, query, MapObjectFactory::processRow, (void*)&type, &sqliteErrorCode); + delete query; + + // Tile + query = QueryGenerator::tile(boxId); + type = MAP_OBJECT_TYPE_TILE; + sqlite3_exec(this->asgardDb, query, MapObjectFactory::processRow, (void*)&type, &sqliteErrorCode); + delete query; + + sqlite3_free(sqliteErrorCode); return true; } -char*** Database::loadHardpoints(int smoId, int* rowCount) +RowSet* Database::loadHardpoints(int smoId) { - char*** table = NULL; - int* numColumns; - char** sqliteErrorCode; + RowSet* rs = new RowSet(); + char* query; + int rc; - sqlite3_get_table(this->asgardDb, QueryGenerator::hardpoint(smoId), table, rowCount, numColumns, sqliteErrorCode); + query = QueryGenerator::hardpoint(smoId); + rc = rs->select(this->asgardDb, query); + delete query; - assert(*numColumns == CONTAINER_COLUMN_COUNT); + if (rc == SQLITE_OK) + { + assert(rs->getColCount() == HARDPOINT_COLUMN_COUNT); + } - return table; + return rs; } -char*** Database::loadNonPlayerCharacterPath(int npcId, int* rowCount) +RowSet* Database::loadNonPlayerCharacterPath(int npcId) { - char*** table = NULL; - int* numColumns; - char** sqliteErrorCode; + RowSet* rs = new RowSet(); + char* query; + int rc; - sqlite3_get_table(this->asgardDb, QueryGenerator::nonPlayerCharacterPath(npcId), table, rowCount, numColumns, sqliteErrorCode); - - assert(*numColumns == HARDPOINT_COLUMN_COUNT); + query = QueryGenerator::nonPlayerCharacterPath(npcId); + rc = rs->select(this->asgardDb, query); + delete query; + + if (rc == SQLITE_OK) + { + assert(rs->getColCount() == NON_PLAYER_CHARACTER_PATH_COLUMN_COUNT); + } - return table; + return rs; + } diff --git a/src/Database.h b/src/Database.h index 42904a7..3fe5e30 100644 --- a/src/Database.h +++ b/src/Database.h @@ -22,6 +22,7 @@ #include #include "Coordinate.h" +#include "RowSet.h" #define ASGARD_DATABASE "asgard.db3" @@ -37,8 +38,8 @@ class Database static Database* getInstance(); void determineVisibleBoxes(Coordinate currentPosition, int *visibleBoxes, int numVisibleBoxes); bool loadBoundingBox(int boxId); - char*** loadHardpoints(int smoId, int *rowCount); - char*** loadNonPlayerCharacterPath(int npcId, int *rowCount); + RowSet* loadHardpoints(int smoId); + RowSet* loadNonPlayerCharacterPath(int npcId); }; diff --git a/src/DatabaseColumnMap.h b/src/DatabaseColumnMap.h index 918dcdd..bb59a03 100644 --- a/src/DatabaseColumnMap.h +++ b/src/DatabaseColumnMap.h @@ -55,10 +55,7 @@ enum NonPlayerCharacterPathColumn NON_PLAYER_CHARACTER_PATH_COLUMN_MAP_OBJECT_ID, NON_PLAYER_CHARACTER_PATH_COLUMN_WC_X, NON_PLAYER_CHARACTER_PATH_COLUMN_WC_Y, - NON_PLAYER_CHARACTER_PATH_COLUMN_HEIGHT, - NON_PLAYER_CHARACTER_PATH_COLUMN_WIDTH, - NON_PLAYER_CHARACTER_PATH_COLUMN_SPEED, - NON_PLAYER_CHARACTER_PATH_COLUMN_BOUNDING_BOX_ID, + NON_PLAYER_CHARACTER_PATH_COLUMN_PATHINDEX, NON_PLAYER_CHARACTER_PATH_COLUMN_COUNT }; diff --git a/src/Makefile.am b/src/Makefile.am index 0daacb0..c37adac 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,6 +13,7 @@ MapObjectFactory.cpp \ NonPlayerCharacter.cpp \ QueryGenerator.cpp \ RectHardpoint.cpp \ +RowSet.cpp \ StaticMapObject.cpp \ WaterTile.cpp \ main.cpp @@ -34,6 +35,7 @@ MapObjectType.h \ NonPlayerCharacter.h \ QueryGenerator.h \ RectHardpoint.h \ +RowSet.h \ StaticMapObject.h \ Tile.h \ TileType.h \ diff --git a/src/MapObject.cpp b/src/MapObject.cpp index cab69c1..a7692ad 100644 --- a/src/MapObject.cpp +++ b/src/MapObject.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2006 Russ Adams, Sean Eubanks, Asgard Contributors + * Copyright (c) 2007 Russ Adams, Sean Eubanks, Asgard Contributors * This file is part of Asgard. * * Asgard is free software; you can redistribute it and/or modify diff --git a/src/MapObjectFactory.cpp b/src/MapObjectFactory.cpp index 20d63f9..122682f 100644 --- a/src/MapObjectFactory.cpp +++ b/src/MapObjectFactory.cpp @@ -33,11 +33,10 @@ #include "RectHardpoint.h" #include "Database.h" - int MapObjectFactory::processRow(void *mapObjectType, int columnCount, char **columnValue, char **columnName) { MapObjectType *type = static_cast(mapObjectType); - + switch(*type) { case MAP_OBJECT_TYPE_CONTAINER: { MapObjectFactory::createContainer(columnValue); break; } @@ -47,7 +46,8 @@ int MapObjectFactory::processRow(void *mapObjectType, int columnCount, char **co default: { /* TODO: Error case... add logging */ break; } } - return true; + + return 0; } @@ -97,8 +97,7 @@ void MapObjectFactory::createTile(char **columnValue) void MapObjectFactory::createContainer(char **columnValue) { Database* db = Database::getInstance(); - char*** table; - int* rowCount; + RowSet* rs; // MapObject Req'd Members int wc_x; @@ -110,9 +109,14 @@ void MapObjectFactory::createContainer(char **columnValue) Container* container = new Container(); // Create Hardpoints - table = db->loadHardpoints(atoi(columnValue[CONTAINER_COLUMN_MAP_OBJECT_ID]),rowCount); - for (int row = 0; row < *rowCount; row++) - container->addHardpoint(createHardpoint(table[row])); + rs = db->loadHardpoints(atoi(columnValue[CONTAINER_COLUMN_MAP_OBJECT_ID])); + + if (rs != NULL) + { + for (int row = 0; row < rs->getRowCount(); row++) + container->addHardpoint(createHardpoint(rs,row)); + } + // TODO: Create Items; Not 0.3.0 @@ -141,8 +145,7 @@ void MapObjectFactory::createContainer(char **columnValue) void MapObjectFactory::createNonPlayerCharacter(char **columnValue) { Database* db = Database::getInstance(); - char*** table; - int* rowCount; + RowSet* rs; // MapObject Req'd Members int wc_x; @@ -155,14 +158,22 @@ void MapObjectFactory::createNonPlayerCharacter(char **columnValue) if (npc != NULL) { // Create Hardpoints - table = db->loadHardpoints(atoi(columnValue[NON_PLAYER_CHARACTER_COLUMN_MAP_OBJECT_ID]),rowCount); - for (int row = 0; row < *rowCount; row++) - npc->addHardpoint(createHardpoint(table[row])); + rs = db->loadHardpoints(atoi(columnValue[NON_PLAYER_CHARACTER_COLUMN_MAP_OBJECT_ID])); + + if (rs != NULL) + { + for (int row = 0; row < rs->getRowCount(); row++) + npc->addHardpoint(createHardpoint(rs,row)); + } // Create NonPlayerCharacterPath - table = db->loadNonPlayerCharacterPath(atoi(columnValue[NON_PLAYER_CHARACTER_COLUMN_MAP_OBJECT_ID]),rowCount); - for (int row = 0; row < *rowCount; row++) - npc->addCoordinateToPath(createNonPlayerCharacterPathPoint(table[row])); + rs = db->loadNonPlayerCharacterPath(atoi(columnValue[NON_PLAYER_CHARACTER_COLUMN_MAP_OBJECT_ID])); + + if (rs != NULL) + { + for (int row = 0; row < rs->getRowCount(); row++) + npc->addCoordinateToPath(createNonPlayerCharacterPathPoint(rs,row)); + } wc_x = atoi(columnValue[NON_PLAYER_CHARACTER_COLUMN_WC_X]); wc_y = atoi(columnValue[NON_PLAYER_CHARACTER_COLUMN_WC_Y]); @@ -185,8 +196,7 @@ void MapObjectFactory::createNonPlayerCharacter(char **columnValue) void MapObjectFactory::createStaticMapObject(char **columnValue) { Database* db = Database::getInstance(); - char*** table; - int* rowCount; + RowSet* rs; // MapObject Req'd Members int wc_x; @@ -199,10 +209,14 @@ void MapObjectFactory::createStaticMapObject(char **columnValue) if (staticMapObject != NULL) { // Create Hardpoints - table = db->loadHardpoints(atoi(columnValue[CONTAINER_COLUMN_MAP_OBJECT_ID]),rowCount); - for (int row = 0; row < *rowCount; row++) - staticMapObject->addHardpoint(createHardpoint(table[row])); - + rs = db->loadHardpoints(atoi(columnValue[STATIC_MAP_OBJECT_COLUMN_MAP_OBJECT_ID])); + + if (rs != NULL) + { + for (int row = 0; row < rs->getRowCount(); row++) + staticMapObject->addHardpoint(createHardpoint(rs,row)); + } + wc_x = atoi(columnValue[STATIC_MAP_OBJECT_COLUMN_WC_X]); wc_y = atoi(columnValue[STATIC_MAP_OBJECT_COLUMN_WC_Y]); width = atoi(columnValue[STATIC_MAP_OBJECT_COLUMN_WIDTH]); @@ -222,7 +236,7 @@ void MapObjectFactory::createStaticMapObject(char **columnValue) } -Hardpoint* MapObjectFactory::createHardpoint(char **columnValue) +Hardpoint* MapObjectFactory::createHardpoint(RowSet* rs, int row) { int x = 0; int y = 0; @@ -232,22 +246,22 @@ Hardpoint* MapObjectFactory::createHardpoint(char **columnValue) int type = 0; // Rect and Circ Hardpoints need these. - type = atoi(columnValue[HARDPOINT_COLUMN_HARDPOINT_TYPE]); - x = atoi(columnValue[HARDPOINT_COLUMN_RELATIVE_X]); - y = atoi(columnValue[HARDPOINT_COLUMN_RELATIVE_Y]); + type = atoi(rs->getColumnValue(row,HARDPOINT_COLUMN_HARDPOINT_TYPE)); + x = atoi(rs->getColumnValue(row,HARDPOINT_COLUMN_RELATIVE_X)); + y = atoi(rs->getColumnValue(row,HARDPOINT_COLUMN_RELATIVE_Y)); // Only RectHardpoints if (type == HARDPOINT_TYPE_RECT) { - height = atoi(columnValue[HARDPOINT_COLUMN_WIDTH]); - width = atoi(columnValue[HARDPOINT_COLUMN_HEIGHT]); + height = atoi(rs->getColumnValue(row,HARDPOINT_COLUMN_WIDTH)); + width = atoi(rs->getColumnValue(row,HARDPOINT_COLUMN_HEIGHT)); return new RectHardpoint(x,y,height,width); } // Only CircHardpoints else if (type == HARDPOINT_TYPE_CIRC) { - r = atof(columnValue[HARDPOINT_COLUMN_RADIUS]); - return new RectHardpoint(x,y,height,width); + r = atof(rs->getColumnValue(row,HARDPOINT_COLUMN_RADIUS)); + return new CircHardpoint(x,y,type); } // Default else @@ -257,13 +271,13 @@ Hardpoint* MapObjectFactory::createHardpoint(char **columnValue) } -Coordinate* MapObjectFactory::createNonPlayerCharacterPathPoint(char **columnValue) +Coordinate* MapObjectFactory::createNonPlayerCharacterPathPoint(RowSet* rs, int row) { int wc_x = 0; int wc_y = 0; - wc_x = atoi(columnValue[NON_PLAYER_CHARACTER_PATH_COLUMN_WC_X]); - wc_y = atoi(columnValue[NON_PLAYER_CHARACTER_PATH_COLUMN_WC_Y]); + wc_x = atoi(rs->getColumnValue(row,NON_PLAYER_CHARACTER_PATH_COLUMN_WC_X)); + wc_y = atoi(rs->getColumnValue(row,NON_PLAYER_CHARACTER_PATH_COLUMN_WC_Y)); return new Coordinate(wc_x, wc_y); } diff --git a/src/MapObjectFactory.h b/src/MapObjectFactory.h index 955f1f8..6ea385a 100644 --- a/src/MapObjectFactory.h +++ b/src/MapObjectFactory.h @@ -21,6 +21,7 @@ #define MAP_OBJECT_FACTORY_H #include "Hardpoint.h" +#include "RowSet.h" class MapObjectFactory { @@ -29,8 +30,8 @@ class MapObjectFactory static void createContainer(char **columnValue); static void createNonPlayerCharacter(char **columnValue); static void createStaticMapObject(char **columnValue); - static Hardpoint* createHardpoint(char **columnValue); - static Coordinate* createNonPlayerCharacterPathPoint(char **columnValue); + static Hardpoint* createHardpoint(RowSet* rs, int row); + static Coordinate* createNonPlayerCharacterPathPoint(RowSet* rs, int row); public: static int processRow(void *mapObjectType, int columnCount, char **columnValue, char **columnName); diff --git a/src/QueryGenerator.cpp b/src/QueryGenerator.cpp index 0fb359e..4a03b99 100644 --- a/src/QueryGenerator.cpp +++ b/src/QueryGenerator.cpp @@ -25,6 +25,7 @@ char* QueryGenerator::staticMapObject(int boundingBoxId) { std::stringstream queryStream; std::string query; + char* cStr = new char[2048]; queryStream << "select "; queryStream << "mo.MapObjectId, "; @@ -32,19 +33,31 @@ char* QueryGenerator::staticMapObject(int boundingBoxId) queryStream << "mo.WC_Y, "; queryStream << "mo.Height, "; queryStream << "mo.Width "; - queryStream << "from MapObject mo "; - queryStream << "inner join BoundingBox bb on bb.BoundingBoxId = mo.BoundingBoxId "; - queryStream << "where mo.BoundingBoxId = " << boundingBoxId << "; "; + queryStream << "from BoundingBox bb "; + queryStream << "inner join MapObject mo on mo.BoundingBoxId = bb.BoundingBoxId "; + queryStream << "where mo.BoundingBoxId = " << boundingBoxId << " "; + + // TODO: + // This is not ideal. + // Instantiation of StaticMapObjects will need to be addressed. + queryStream << " and mo.MapObjectId not in "; + queryStream << " (select MapObjectId from Container) "; + queryStream << " and mo.MapObjectId not in "; + queryStream << " (select MapObjectId from NonPlayerCharacter) "; + queryStream << " and mo.MapObjectId not in "; + queryStream << " (select MapObjectId from Tiles);"; + query = queryStream.str(); - - return const_cast(query.c_str()); + strcpy(cStr,query.c_str()); + return cStr; } char* QueryGenerator::nonPlayerCharacter(int boundingBoxId) { std::stringstream queryStream; std::string query; + char* cStr = new char[2048]; queryStream << "select "; queryStream << "mo.MapObjectId, "; @@ -54,19 +67,22 @@ char* QueryGenerator::nonPlayerCharacter(int boundingBoxId) queryStream << "mo.Width, "; queryStream << "npc.Speed, "; queryStream << "mo.BoundingBoxId "; - queryStream << "from NonPlayerCharacter npc, MapObject mo "; - queryStream << "inner join BoundingBox bb on bb.BoundingBoxId = mo.BoundingBoxId "; + queryStream << "from BoundingBox bb "; + queryStream << "inner join MapObject mo on mo.BoundingBoxId = bb.BoundingBoxId "; + queryStream << "inner join NonPlayerCharacter npc on npc.MapObjectId = mo.MapObjectId "; queryStream << "where mo.BoundingBoxId = " << boundingBoxId << ";"; query = queryStream.str(); - return const_cast(query.c_str()); + strcpy(cStr,query.c_str()); + return cStr; } char* QueryGenerator::nonPlayerCharacterPath(int mapObjectId) { std::stringstream queryStream; std::string query; + char* cStr = new char[2048]; queryStream << "select "; queryStream << "npcp.MapObjectId, "; @@ -78,13 +94,15 @@ char* QueryGenerator::nonPlayerCharacterPath(int mapObjectId) query = queryStream.str(); - return const_cast(query.c_str()); + strcpy(cStr,query.c_str()); + return cStr; } char* QueryGenerator::container(int boundingBoxId) { std::stringstream queryStream; std::string query; + char* cStr = new char[2048]; queryStream << "select "; queryStream << "mo.MapObjectId, "; @@ -107,20 +125,22 @@ char* QueryGenerator::container(int boundingBoxId) queryStream << "c.item12, "; queryStream << "c.item13, "; queryStream << "c.item14 "; - queryStream << "from Container c, BoundingBox bb "; - queryStream << "inner join MapObject mo on mo.MapObjectId = c.MapObjectId "; - queryStream << "on mo.BoundingBoxId = bb.BoundingBoxId "; + queryStream << "from BoundingBox bb "; + queryStream << "inner join MapObject mo on mo.BoundingBoxId = bb.BoundingBoxId "; + queryStream << "inner join Container c on c.MapObjectId = mo.MapObjectId "; queryStream << "where bb.BoundingBoxId = " << boundingBoxId << ";"; query = queryStream.str(); - return const_cast(query.c_str()); + strcpy(cStr,query.c_str()); + return cStr; } char* QueryGenerator::tile(int boundingBoxId) { std::stringstream queryStream; std::string query; + char* cStr = new char[2048]; queryStream << "select "; queryStream << "mo.MapObjectId, "; @@ -129,19 +149,22 @@ char* QueryGenerator::tile(int boundingBoxId) queryStream << "mo.Height, "; queryStream << "mo.Width, "; queryStream << "t.tileType "; - queryStream << "from MapObject mo, BoundingBox bb "; + queryStream << "from BoundingBox bb "; + queryStream << "inner join MapObject mo on mo.BoundingBoxId = bb.BoundingBoxId "; queryStream << "inner join Tiles t on mo.MapObjectId = t.MapObjectId "; queryStream << "where bb.BoundingBoxId = " << boundingBoxId << ";"; query = queryStream.str(); - return const_cast(query.c_str()); + strcpy(cStr,query.c_str()); + return cStr; } char* QueryGenerator::hardpoint(int mapObjectId) { std::stringstream queryStream; std::string query; + char* cStr = new char[2048]; queryStream << "select "; queryStream << "mo.MapObjectId, "; @@ -151,11 +174,13 @@ char* QueryGenerator::hardpoint(int mapObjectId) queryStream << "h.Width, "; queryStream << "h.Height, "; queryStream << "h.Radius "; - queryStream << "from MapObject mo, Hardpoints h "; + queryStream << "from MapObject mo "; + queryStream << "inner join Hardpoints h on h.MapObjectId = mo.MapObjectId "; queryStream << "where mo.MapObjectId = " << mapObjectId << ";"; query = queryStream.str(); - return const_cast(query.c_str()); + strcpy(cStr,query.c_str()); + return cStr; } diff --git a/src/QueryGenerator.h b/src/QueryGenerator.h index a8b233c..9c6726e 100644 --- a/src/QueryGenerator.h +++ b/src/QueryGenerator.h @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2006 Russ Adams, Sean Eubanks, Asgard Contributors + * Copyright (c) 2007 Russ Adams, Sean Eubanks, Asgard Contributors * This file is part of Asgard. * * Asgard is free software; you can redistribute it and/or modify diff --git a/src/Database.h b/src/RowSet.cpp similarity index 50% copy from src/Database.h copy to src/RowSet.cpp index 42904a7..37e32da 100644 --- a/src/Database.h +++ b/src/RowSet.cpp @@ -16,31 +16,79 @@ * along with Asgard; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ****************************************************************************/ - -#ifndef DATABASE_H -#define DATABASE_H +#include "RowSet.h" #include -#include "Coordinate.h" - -#define ASGARD_DATABASE "asgard.db3" - -class Database + +RowSet::RowSet() +{ + table = NULL; + rowCount = 0; + colCount = 0; + errorMsg = ""; +} + + +int RowSet::select(sqlite3 * db, const char* query) +{ + char queryCpy[2048]; + int rc; + //char* error; + + strcpy(queryCpy,query); + + rc = sqlite3_get_table( + db, + queryCpy, + &(this->table), + &(this->rowCount), + &(this->colCount), + 0); + //&error); + + //this->errorMsg = error; + + return rc; +} + + +const char* RowSet::getColumnValue(int row, int column) +{ + char* columnValue; + + columnValue = table[(row + 1) * colCount + column]; + + return columnValue; + +} + + +int RowSet::getRowCount() +{ + return this->rowCount; +} + + +int RowSet::getColCount() +{ + return this->colCount; + +} + + +std::string RowSet::getError() { - private: - Database(); - ~Database(); - sqlite3 *asgardDb; - static Database* instance; - - public: - static Database* getInstance(); - void determineVisibleBoxes(Coordinate currentPosition, int *visibleBoxes, int numVisibleBoxes); - bool loadBoundingBox(int boxId); - char*** loadHardpoints(int smoId, int *rowCount); - char*** loadNonPlayerCharacterPath(int npcId, int *rowCount); - -}; - -#endif //DATABASE_H + std::string * error = new std::string(this->errorMsg); + + return *error; +} + + +RowSet::~RowSet() +{ + if (table != NULL) + { + sqlite3_free(table); + } +} diff --git a/src/main.cpp b/src/RowSet.h similarity index 68% copy from src/main.cpp copy to src/RowSet.h index 209e355..ce238d6 100644 --- a/src/main.cpp +++ b/src/RowSet.h @@ -17,12 +17,30 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ****************************************************************************/ -#include "GameEngine.h" +#ifndef ROWSET_H +#define ROWSET_H -int main() +#include +#include + + +class RowSet { - GameEngine* asgard = GameEngine::getInstance(); - asgard->loadVisibleBoxes(); + private: + char** table; + int rowCount; + int colCount; + std::string errorMsg; + + public: + RowSet(); + ~RowSet(); + int select(sqlite3 * db, const char* query); + const char* getColumnValue(int row, int column); + int getRowCount(); + int getColCount(); + std::string getError(); + +}; - return 0; -} +#endif // ROWSET_H diff --git a/src/main.cpp b/src/main.cpp index 209e355..831b3cc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,11 +18,16 @@ ****************************************************************************/ #include "GameEngine.h" +#include int main() { + std::cout << "Creating Asgard Instance." << std::endl; GameEngine* asgard = GameEngine::getInstance(); + + std::cout << "Loading Bounding Boxes." << std::endl; asgard->loadVisibleBoxes(); + std::cout << "Done." << std::endl; return 0; } -- 2.11.4.GIT