On 17/09/13 23:59, Vadim Peretokin wrote: > Yeah I agree. We should be able to create rooms, not have to place them > into an area - setup their properties and then add it to one. > Ah, I recently was adding some rooms to an old map to test some mapping code. I had an empty area and although through the LUA interface all the rooms seem to be in that area, the map drawing code was treating some as being out of the area and not drawing exits/routes between them properly when I added them later - the problem did not seem to be fixed until after the map was saved and reloaded. I'd like to know what was wrong (if anything). At a wild guess I'd say that some structures are not being amended with new data as rooms are added. I vaguely recall that some of the mapping data (the levels or "ebenung"? tables) may not be being updated as rooms are inserted/deleted. I added into my code a LUA function to create a room (with the next available RoomID) in an area with given areaID, coordinates and room name but am I missing something in the room creation process? Also, do we not have an area with ID = 0 that always exists - would it be safe to use that as an implicitly unnamed or default area (perhaps it should have a fixed name of something like "_unnamed" so that it always(?) is the first area in the mapper area selection list?) I can't recall whether that area is actually displayable as a map anyway? If it was would this still be problematic for inexperienced users starting out building a fresh map and then wanting to name the first area they created if they tried to rename such a default (un-renameable) area rather than using the GUI or LUA code to move their rooms en-block to a new area? I must check also whether it is allowed to add a room to an area without giving any coordinates - I guess if it *is* you get a load of rooms piling up at (0,0,0) which can be awkward to sort out later... 8-) Possible all-in-one room creation LUA function: (Header file and LUA function registration not shown): // createRoom( AreaID, RoomName, x, y, z ) // Returns new room ID, or nil on failure // Convenience function to make a NEW room in a given area int TLuaInterpreter::createRoom( lua_State *L ) { int areaId, x, y, z; Host * pHost = TLuaInterpreter::luaInterpreterMap[L]; string name; TArea * pA; if(! pHost || ! pHost->mpMap || ! pHost->mpMap->mpRoomDB) { lua_pushstring( L, "createRoom: internal failure" ); lua_error( L ); return 1; } if( lua_isnumber( L, 1 ) ) { areaId = lua_tonumber( L, 1 ); pA = pHost->mpMap->mpRoomDB->getArea( areaId ); if( !pA ) { lua_pushstring( L, "createRoom: invalid areaId value" ); lua_error( L ); return 1; } } else { lua_pushstring( L, "createRoom: wrong argument(1) type" ); lua_error( L ); return 1; } if( lua_isstring( L, 2 ) ) { name = lua_tostring( L, 2 ); } else { lua_pushstring( L, "createRoom: wrong argument(2) type" ); lua_error( L ); return 1; } if( lua_isnumber( L, 3 ) ) { x = lua_tonumber( L, 3); } else { lua_pushstring( L, "createRoom: wrong argument(3) type" ); lua_error( L ); return 1; } if( lua_isnumber( L, 4 ) ) { y = lua_tonumber( L, 4); } else { lua_pushstring( L, "createRoom: wrong argument(4) type" ); lua_error( L ); return 1; } if( lua_isnumber( L, 5 ) ) { z = lua_tonumber( L, 5); } else { lua_pushstring( L, "createRoom: wrong argument(5) type" ); lua_error( L ); return 1; } int id = pHost->mpMap->createNewRoomID(); if( pHost->mpMap->addRoom( id ) ) { TRoom * pR = pHost->mpMap->mpRoomDB->getRoom(id); if( pR ) { pR->name = name.c_str(); pHost->mpMap->setRoomCoordinates( id, x, y, z ); pA->addRoom( id ); lua_pushnumber( L, id ); pA->calcSpan(); // Need to update this for 3D map at least if a new z value has been used... pHost->mpMap->mMapGraphNeedsUpdate = true; } else { lua_pushstring( L, "createRoom: failed to create new room" ); lua_error( L ); } } else { lua_pushstring( L, "createRoom: failed to create new roomID" ); lua_error( L ); } return 1; }