本文整理汇总了C++中content_error函数的典型用法代码示例。如果您正苦于以下问题:C++ content_error函数的具体用法?C++ content_error怎么用?C++ content_error使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了content_error函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: main
int main(int argc, char* argv[])
{
Threading::SetMainThread();
try {
spring_clock::PushTickRate();
// initialize start time (can safely be done before SDL_Init
// since we are not using SDL_GetTicks as our clock anymore)
spring_time::setstarttime(spring_time::gettime(true));
CLogOutput::LogSystemInfo();
std::string scriptName;
std::string scriptText;
std::string binaryName = argv[0];
gflags::SetUsageMessage("Usage: " + binaryName + " [options] path_to_script.txt");
gflags::SetVersionString(SpringVersion::GetFull());
gflags::ParseCommandLineFlags(&argc, &argv, true);
ParseCmdLine(argc, argv, scriptName);
GlobalConfig::Instantiate();
FileSystemInitializer::InitializeLogOutput();
FileSystemInitializer::Initialize();
// Initialize crash reporting
CrashHandler::Install();
LOG("report any errors to Mantis or the forums.");
LOG("loading script from file: %s", scriptName.c_str());
// server will take ownership of these
std::shared_ptr<ClientSetup> dsClientSetup(new ClientSetup());
std::shared_ptr<GameData> dsGameData(new GameData());
std::shared_ptr<CGameSetup> dsGameSetup(new CGameSetup());
CFileHandler fh(scriptName);
if (!fh.FileExists())
throw content_error("script does not exist in given location: " + scriptName);
if (!fh.LoadStringData(scriptText))
throw content_error("script cannot be read: " + scriptName);
dsClientSetup->LoadFromStartScript(scriptText);
if (!dsGameSetup->Init(scriptText)) {
// read the script provided by cmdline
LOG_L(L_ERROR, "failed to load script %s", scriptName.c_str());
return 1;
}
// Create the server, it will run in a separate thread
CGlobalUnsyncedRNG rng;
const unsigned sleepTime = FLAGS_sleeptime;
const unsigned randSeed = time(nullptr) % ((spring_gettime().toNanoSecsi() + 1) * 9007);
rng.Seed(randSeed);
dsGameData->SetRandomSeed(rng.NextInt());
// Use script provided hashes if they exist
if (dsGameSetup->mapHash != 0) {
dsGameData->SetMapChecksum(dsGameSetup->mapHash);
dsGameSetup->LoadStartPositions(false); // reduced mode
} else {
dsGameData->SetMapChecksum(archiveScanner->GetArchiveCompleteChecksum(dsGameSetup->mapName));
CFileHandler f("maps/" + dsGameSetup->mapName);
if (!f.FileExists())
vfsHandler->AddArchiveWithDeps(dsGameSetup->mapName, false);
dsGameSetup->LoadStartPositions(); // full mode
}
if (dsGameSetup->modHash != 0) {
dsGameData->SetModChecksum(dsGameSetup->modHash);
} else {
const std::string& modArchive = archiveScanner->ArchiveFromName(dsGameSetup->modName);
const unsigned int modCheckSum = archiveScanner->GetArchiveCompleteChecksum(modArchive);
dsGameData->SetModChecksum(modCheckSum);
}
LOG("starting server...");
{
dsGameData->SetSetupText(dsGameSetup->setupText);
CGameServer server(dsClientSetup, dsGameData, dsGameSetup);
while (!server.HasGameID()) {
// wait until gameID has been generated or
// a timeout occurs (if no clients connect)
if (server.HasFinished())
break;
spring_sleep(spring_secs(sleepTime));
}
while (!server.HasFinished()) {
static bool printData = (server.GetDemoRecorder() != nullptr);
//.........这里部分代码省略.........
开发者ID:nixtux,项目名称:spring,代码行数:101,代码来源:main.cpp
示例2: getenv
//.........这里部分代码省略.........
}
#endif // defined(WIN32), defined(MACOSX_BUNDLE), else
// Construct the list of dataDirs from various sources.
dataDirs.clear();
// The first dir added will be the writeable data dir.
if (isolationMode) {
AddCwdOrParentDir(dd_curWorkDir, true); // "./" or "../"
} else {
// same on all platforms
AddDirs(dd_env); // ENV{SPRING_DATADIR}
// user defined in spring config handler
// (Linux: ~/.springrc, Windows: .\springsettings.cfg)
AddDirs(SubstEnvVars(configHandler->GetString("SpringData")));
#ifdef WIN32
// All MS Windows variants
AddCwdOrParentDir(dd_curWorkDir); // "./" or "../"
AddDirs(dd_myDocsMyGames); // "C:/.../My Documents/My Games/Spring/"
AddDirs(dd_myDocs); // "C:/.../My Documents/Spring/"
AddDirs(dd_appData); // "C:/.../All Users/Applications/Spring/"
#elif defined(MACOSX_BUNDLE)
// Mac OS X Application Bundle (*.app) - single file install
// directory structure (Apple standard):
// Spring.app/Contents/MacOS/springlobby
// Spring.app/Contents/Resources/bin/spring
// Spring.app/Contents/Resources/lib/unitsync.dylib
// Spring.app/Contents/Resources/share/games/spring/base/
// This corresponds to Spring.app/Contents/Resources/
const std::string bundleResourceDir = FileSystem::GetParent(dd_curWorkDir);
// This has to correspond with the value in the build-script
const std::string dd_curWorkDirData = bundleResourceDir + "/share/games/spring";
// we need this as default writeable dir, because the Bundle.pp dir
// might not be writeable by the user starting the game
AddDirs(SubstEnvVars("$HOME/.spring")); // "~/.spring/"
AddDirs(dd_curWorkDirData); // "Spring.app/Contents/Resources/share/games/spring"
AddDirs(dd_etc); // from /etc/spring/datadir
#else
// Linux, FreeBSD, Solaris, Apple non-bundle
AddCwdOrParentDir(dd_curWorkDir); // "./" or "../"
AddDirs(SubstEnvVars("$HOME/.spring")); // "~/.spring/"
AddDirs(dd_etc); // from /etc/spring/datadir
#endif
#ifdef SPRING_DATADIR
AddDirs(SubstEnvVars(SPRING_DATADIR)); // from -DSPRING_DATADIR
#endif
}
// Figure out permissions of all dataDirs
DeterminePermissions();
if (!writeDir) {
// bail out
const std::string errstr = "Not a single writable data directory found!\n\n"
"Configure a writable data directory using either:\n"
"- the SPRING_DATADIR environment variable,\n"
#ifdef WIN32
"- a SpringData=C:/path/to/data declaration in spring's config file ./springsettings.cfg\n"
"- by giving you write access to the installation directory";
#else
"- a SpringData=/path/to/data declaration in ~/.springrc or\n"
"- the configuration file /etc/spring/datadir";
#endif
throw content_error(errstr);
}
// for now, chdir to the data directory as a safety measure:
// Not only safety anymore, it's just easier if other code can safely assume that
// writeDir == current working directory
FileSystem::ChDir(GetWriteDir()->path.c_str());
// Initialize the log. Only after this moment log will be written to file.
logOutput.Initialize();
// Logging MAY NOT start before the chdir, otherwise the logfile ends up
// in the wrong directory.
// Update: now it actually may start before, log has preInitLog.
for (std::vector<DataDir>::const_iterator d = dataDirs.begin(); d != dataDirs.end(); ++d) {
if (d->writable) {
LOG("Using read-write data directory: %s", d->path.c_str());
// tag the cache dir
const std::string cacheDir = d->path + "cache";
if (FileSystem::CreateDirectory(cacheDir)) {
CacheDir::SetCacheDir(cacheDir, true);
}
} else {
LOG("Using read-only data directory: %s", d->path.c_str());
}
}
}
开发者ID:lordelven,项目名称:spring,代码行数:101,代码来源:DataDirLocater.cpp
示例3: option_parseOption
static void option_parseOption(const LuaTable& root, int index, Option& opt,
std::set<string>& optionsSet) {
const LuaTable& optTbl = root.SubTable(index);
if (!optTbl.IsValid()) {
throw content_error("parseOption: subtable " + IntToString(index) + " is invalid");
}
// common options properties
opt.key = optTbl.GetString("key", "");
if (opt.key.empty()
|| (opt.key.find_first_of(Option_badKeyChars) != string::npos)) {
throw content_error("parseOption: (key=\"" + opt.key + "\") empty key or key contains bad characters (\"" + Option_badKeyChars + "\")");
}
opt.key = StringToLower(opt.key);
opt.scope = optTbl.GetString("scope", "scope");
if (opt.scope.find_first_of(Option_badKeyChars) != string::npos) {
throw content_error("parseOption: (key=" + opt.key + ") scope contains bad characters (\"" + Option_badKeyChars + "\"): \"" + opt.scope + "\"");
}
opt.scope = StringToLower(opt.scope);
if (optionsSet.find(opt.key) != optionsSet.end()) {
throw content_error("parseOption: key \"" + opt.key + "\" exists already");
}
opt.name = optTbl.GetString("name", opt.key);
if (opt.name.empty()) {
throw content_error("parseOption: (key=" + opt.key + ") empty name");
}
opt.desc = optTbl.GetString("desc", opt.name);
opt.section = optTbl.GetString("section", "");
opt.style = optTbl.GetString("style", "");
opt.type = optTbl.GetString("type", "");
opt.type = StringToLower(opt.type);
// option type specific properties
if (opt.type == "bool") {
opt.typeCode = opt_bool;
opt.boolDef = optTbl.GetBool("def", false);
}
else if (opt.type == "number") {
opt.typeCode = opt_number;
opt.numberDef = optTbl.GetFloat("def", 0.0f);
opt.numberMin = optTbl.GetFloat("min", -1.0e30f);
opt.numberMax = optTbl.GetFloat("max", +1.0e30f);
opt.numberStep = optTbl.GetFloat("step", 0.0f);
}
else if (opt.type == "string") {
opt.typeCode = opt_string;
opt.stringDef = optTbl.GetString("def", "");
opt.stringMaxLen = optTbl.GetInt("maxlen", 0);
}
else if (opt.type == "list") {
opt.typeCode = opt_list;
const LuaTable& listTbl = optTbl.SubTable("items");
if (!listTbl.IsValid()) {
throw content_error("parseOption: (key=" + opt.key + ") subtables: items invalid");
}
for (int i = 1; listTbl.KeyExists(i); i++) {
OptionListItem item;
// string format
item.key = listTbl.GetString(i, "");
if (!item.key.empty() &&
(item.key.find_first_of(Option_badKeyChars) == string::npos)) {
item.name = item.key;
item.desc = item.name;
opt.list.push_back(item);
continue;
}
// table format (name & desc)
const LuaTable& itemTbl = listTbl.SubTable(i);
if (!itemTbl.IsValid()) {
throw content_error("parseOption: (key=" + opt.key + ") subtables: subtable " + IntToString(i) + " contains invalid items");
}
item.key = itemTbl.GetString("key", "");
if (item.key.empty() || (item.key.find_first_of(Option_badKeyChars) != string::npos)) {
throw content_error("parseOption: (key=" + opt.key + ") subtables: (key=\"" + item.key + "\") empty key or key contains bad characters (\"" + Option_badKeyChars + "\")");
}
item.key = StringToLower(item.key);
item.name = itemTbl.GetString("name", item.key);
if (item.name.empty()) {
throw content_error("parseOption: (key=" + opt.key + ") subtables: (key=" + item.key + ") empty name");
}
item.desc = itemTbl.GetString("desc", item.name);
opt.list.push_back(item);
}
if (opt.list.size() <= 0) {
throw content_error("parseOption: (key=" + opt.key + ") subtables: empty list");
}
opt.listDef = optTbl.GetString("def", opt.list[0].name);
}
else if (opt.type == "section") {
//.........这里部分代码省略.........
开发者ID:DarksidedStudios,项目名称:spring,代码行数:101,代码来源:Option.cpp
示例4: content_error
CAdvWater::CAdvWater(bool loadShader)
{
if (!FBO::IsSupported()) {
throw content_error("Water Error: missing FBO support");
}
glGenTextures(1, &reflectTexture);
unsigned char* scrap = new unsigned char[512 * 512 * 4];
glBindTexture(GL_TEXTURE_2D, reflectTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, scrap);
glGenTextures(1, &bumpTexture);
glBindTexture(GL_TEXTURE_2D, bumpTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, scrap);
glGenTextures(4, rawBumpTexture);
for (int y = 0; y < 64; ++y) {
for (int x = 0; x < 64; ++x) {
scrap[(y*64 + x)*4 + 0] = 128;
scrap[(y*64 + x)*4 + 1] = (unsigned char)(sin(y*PI*2.0f/64.0f)*128 + 128);
scrap[(y*64 + x)*4 + 2] = 0;
scrap[(y*64 + x)*4 + 3] = 255;
}
}
glBindTexture(GL_TEXTURE_2D, rawBumpTexture[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, scrap);
for (int y = 0; y < 64; ++y) {
for (int x = 0; x < 64; ++x) {
const float ang = 26.5f*PI/180.0f;
const float pos = y*2+x;
scrap[(y*64 + x)*4 + 0] = (unsigned char)((sin(pos*PI*2.0f/64.0f))*128*sin(ang)) + 128;
scrap[(y*64 + x)*4 + 1] = (unsigned char)((sin(pos*PI*2.0f/64.0f))*128*cos(ang)) + 128;
}
}
glBindTexture(GL_TEXTURE_2D, rawBumpTexture[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, scrap);
for (int y = 0; y < 64; ++y) {
for (int x = 0; x < 64; ++x) {
const float ang = -19*PI/180.0f;
const float pos = 3*y - x;
scrap[(y*64 + x)*4 + 0] = (unsigned char)((sin(pos*PI*2.0f/64.0f))*128*sin(ang)) + 128;
scrap[(y*64 + x)*4 + 1] = (unsigned char)((sin(pos*PI*2.0f/64.0f))*128*cos(ang)) + 128;
}
}
glBindTexture(GL_TEXTURE_2D, rawBumpTexture[2]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, scrap);
delete[] scrap;
if (loadShader) {
waterFP = LoadFragmentProgram("ARB/water.fp");
}
waterSurfaceColor = mapInfo->water.surfaceColor;
reflectFBO.Bind();
reflectFBO.AttachTexture(reflectTexture, GL_TEXTURE_2D, GL_COLOR_ATTACHMENT0_EXT);
reflectFBO.CreateRenderBuffer(GL_DEPTH_ATTACHMENT_EXT, GL_DEPTH_COMPONENT32, 512, 512);
bumpFBO.Bind();
bumpFBO.AttachTexture(bumpTexture, GL_TEXTURE_2D, GL_COLOR_ATTACHMENT0_EXT);
FBO::Unbind();
if (!bumpFBO.IsValid()) {
throw content_error("Water Error: Invalid FBO");
}
}
开发者ID:lordelven,项目名称:spring,代码行数:82,代码来源:AdvWater.cpp
示例5: if
void CCustomExplosionGenerator::ParseExplosionCode(
CCustomExplosionGenerator::ProjectileSpawnInfo* psi,
int offset, boost::shared_ptr<creg::IType> type, const string& script, string& code)
{
string::size_type end = script.find(';', 0);
string vastr = script.substr(0, end);
if (vastr == "dir") { // first see if we can match any keywords
// if the user uses a keyword assume he knows that it is put on the right datatype for now
code += OP_DIR;
boost::uint16_t ofs = offset;
code.append((char*) &ofs, (char*) &ofs + 2);
}
else if (dynamic_cast<creg::BasicType*>(type.get())) {
creg::BasicType *bt = (creg::BasicType*)type.get();
if (bt->id != creg::crInt && bt->id != creg::crFloat && bt->id != creg::crUChar && bt->id != creg::crBool) {
throw content_error("Projectile properties other than int, float and uchar, are not supported (" + script + ")");
return;
}
int p = 0;
while (p < script.length()) {
char opcode;
char c;
do { c = script[p++]; } while (c == ' ');
bool useInt = false;
if (c == 'i') opcode = OP_INDEX;
else if (c == 'r') opcode = OP_RAND;
else if (c == 'd') opcode = OP_DAMAGE;
else if (c == 'm') opcode = OP_SAWTOOTH;
else if (c == 'k') opcode = OP_DISCRETE;
else if (c == 's') opcode = OP_SINE;
else if (c == 'y') {opcode = OP_YANK; useInt = true;}
else if (c == 'x') {opcode = OP_MULTIPLY; useInt = true;}
else if (c == 'a') {opcode = OP_ADDBUFF; useInt = true;}
else if (c == 'p') opcode = OP_POW;
else if (c == 'q') {opcode = OP_POWBUFF; useInt = true;}
else if (isdigit(c) || c == '.' || c == '-') { opcode = OP_ADD; p--; }
else {
logOutput.Print("[CCEG::ParseExplosionCode] WARNING: unknown op-code \"" + string(1, c) + "\" in \"" + script + "\"");
continue;
}
char* endp;
if (!useInt) {
const float v = (float)strtod(&script[p], &endp);
p += endp - &script[p];
code += opcode;
code.append((char*) &v, ((char*) &v) + 4);
} else {
const int v = std::max(0, std::min(16, (int)strtol(&script[p], &endp, 10)));
p += endp - &script[p];
code += opcode;
code.append((char*) &v, ((char*) &v) + 4);
}
}
switch (bt->id) {
case creg::crInt: code.push_back(OP_STOREI); break;
case creg::crBool: code.push_back(OP_STOREI); break;
case creg::crFloat: code.push_back(OP_STOREF); break;
case creg::crUChar: code.push_back(OP_STOREC); break;
default:
throw content_error("Explosion script variable is of unsupported type. "
"Contact the Spring team to fix this.");
break;
}
boost::uint16_t ofs = offset;
code.append((char*)&ofs, (char*)&ofs + 2);
}
else if (dynamic_cast<creg::ObjectInstanceType*>(type.get())) {
creg::ObjectInstanceType *oit = (creg::ObjectInstanceType *)type.get();
string::size_type start = 0;
for (creg::Class* c = oit->objectClass; c; c=c->base) {
for (int a = 0; a < c->members.size(); a++) {
string::size_type end = script.find(',', start+1);
ParseExplosionCode(psi, offset + c->members [a]->offset, c->members[a]->type, script.substr(start,end-start), code);
start = end+1;
if (start >= script.length()) { break; }
}
if (start >= script.length()) { break; }
}
}
else if (dynamic_cast<creg::StaticArrayBaseType*>(type.get())) {
creg::StaticArrayBaseType *sat = (creg::StaticArrayBaseType*)type.get();
string::size_type start = 0;
for (unsigned int i=0; i < sat->size; i++) {
string::size_type end = script.find(',', start+1);
ParseExplosionCode(psi, offset + sat->elemSize * i, sat->elemType, script.substr(start, end-start), code);
start = end+1;
if (start >= script.length()) { break; }
//.........这里部分代码省略.........
开发者ID:BrainDamage,项目名称:spring,代码行数:101,代码来源:ExplosionGenerator.cpp
示例6: if
void CCustomExplosionGenerator::ParseExplosionCode(
CCustomExplosionGenerator::ProjectileSpawnInfo* psi,
const int offset,
const boost::shared_ptr<creg::IType> type,
const string& script,
string& code)
{
// strtod&co expect C-style strings with NULLs,
// c_str() is guaranteed to be NULL-terminated
// (whether .data() == .c_str() depends on the
// implementation of std::string)
const char* scriptStr = script.c_str();
string::size_type end = script.find(';', 0);
string vastr = script.substr(0, end);
if (vastr == "dir") { // first see if we can match any keywords
// if the user uses a keyword assume he knows that it is put on the right datatype for now
code += OP_DIR;
boost::uint16_t ofs = offset;
code.append((char*) &ofs, (char*) &ofs + 2);
}
else if (dynamic_cast<creg::BasicType*>(type.get())) {
const creg::BasicType* basicType = (creg::BasicType*) type.get();
const bool legalType =
(basicType->id == creg::crInt ) ||
(basicType->id == creg::crFloat) ||
(basicType->id == creg::crUChar) ||
(basicType->id == creg::crBool );
if (!legalType) {
throw content_error("[CCEG::ParseExplosionCode] projectile type-properties other than int, float, uchar, or bool are not supported (" + script + ")");
return;
}
int p = 0;
while (p < script.length()) {
char opcode = OP_END;
char c = script[p++];
// consume whitespace
if (c == ' ')
continue;
bool useInt = false;
if (c == 'i') opcode = OP_INDEX;
else if (c == 'r') opcode = OP_RAND;
else if (c == 'd') opcode = OP_DAMAGE;
else if (c == 'm') opcode = OP_SAWTOOTH;
else if (c == 'k') opcode = OP_DISCRETE;
else if (c == 's') opcode = OP_SINE;
else if (c == 'p') opcode = OP_POW;
else if (c == 'y') { opcode = OP_YANK; useInt = true; }
else if (c == 'x') { opcode = OP_MULTIPLY; useInt = true; }
else if (c == 'a') { opcode = OP_ADDBUFF; useInt = true; }
else if (c == 'q') { opcode = OP_POWBUFF; useInt = true; }
else if (isdigit(c) || c == '.' || c == '-') { opcode = OP_ADD; p--; }
else {
const char* fmt = "[CCEG::ParseExplosionCode] unknown op-code \"%c\" in \"%s\" at index %d";
LOG_L(L_WARNING, fmt, c, scriptStr, p);
continue;
}
// be sure to exit cleanly if there are no more operators or operands
if (p >= script.size())
continue;
char* endp = NULL;
if (!useInt) {
const float v = (float)strtod(&scriptStr[p], &endp);
p += (endp - &scriptStr[p]);
code += opcode;
code.append((char*) &v, ((char*) &v) + 4);
} else {
const int v = std::max(0, std::min(16, (int)strtol(&scriptStr[p], &endp, 10)));
p += (endp - &scriptStr[p]);
code += opcode;
code.append((char*) &v, ((char*) &v) + 4);
}
}
switch (basicType->id) {
case creg::crInt: code.push_back(OP_STOREI); break;
case creg::crBool: code.push_back(OP_STOREI); break;
case creg::crFloat: code.push_back(OP_STOREF); break;
case creg::crUChar: code.push_back(OP_STOREC); break;
default: break;
}
boost::uint16_t ofs = offset;
code.append((char*)&ofs, (char*)&ofs + 2);
}
else if (dynamic_cast<creg::ObjectInstanceType*>(type.get())) {
creg::ObjectInstanceType *oit = (creg::ObjectInstanceType *)type.get();
//.........这里部分代码省略.........
开发者ID:Arkazon,项目名称:spring,代码行数:101,代码来源:ExplosionGenerator.cpp
示例7: CEventClient
CProjectileDrawer::CProjectileDrawer(): CEventClient("[CProjectileDrawer]", 123456, false) {
eventHandler.AddClient(this);
loadscreen->SetLoadMessage("Creating Projectile Textures");
textureAtlas = new CTextureAtlas(2048, 2048);
groundFXAtlas = new CTextureAtlas(2048, 2048);
LuaParser resourcesParser("gamedata/resources.lua", SPRING_VFS_MOD_BASE, SPRING_VFS_ZIP);
LuaParser mapResParser("gamedata/resources_map.lua", SPRING_VFS_MOD_BASE, SPRING_VFS_ZIP);
resourcesParser.Execute();
const LuaTable& resTable = resourcesParser.GetRoot();
const LuaTable& resGraphicsTable = resTable.SubTable("graphics");
const LuaTable& resProjTexturesTable = resGraphicsTable.SubTable("projectileTextures");
const LuaTable& resSmokeTexturesTable = resGraphicsTable.SubTable("smoke");
const LuaTable& resGroundFXTexturesTable = resGraphicsTable.SubTable("groundfx");
// used to block resources_map.* from overriding any of
// resources.lua:{projectile, smoke, groundfx}textures,
// as well as various defaults (repulsegfxtexture, etc)
std::set<std::string> blockedTexNames;
ParseAtlasTextures(true, resProjTexturesTable, blockedTexNames, textureAtlas);
ParseAtlasTextures(true, resGroundFXTexturesTable, blockedTexNames, groundFXAtlas);
int smokeTexCount = -1;
{
// get the smoke textures, hold the count in 'smokeTexCount'
if (resSmokeTexturesTable.IsValid()) {
for (smokeTexCount = 0; true; smokeTexCount++) {
const std::string& tex = resSmokeTexturesTable.GetString(smokeTexCount + 1, "");
if (tex.empty()) {
break;
}
const std::string texName = "bitmaps/" + tex;
const std::string smokeName = "ismoke" + IntToString(smokeTexCount, "%02i");
textureAtlas->AddTexFromFile(smokeName, texName);
blockedTexNames.insert(StringToLower(smokeName));
}
} else {
// setup the defaults
for (smokeTexCount = 0; smokeTexCount < 12; smokeTexCount++) {
const std::string smokeNum = IntToString(smokeTexCount, "%02i");
const std::string smokeName = "ismoke" + smokeNum;
const std::string texName = "bitmaps/smoke/smoke" + smokeNum + ".tga";
textureAtlas->AddTexFromFile(smokeName, texName);
blockedTexNames.insert(StringToLower(smokeName));
}
}
if (smokeTexCount <= 0) {
// this needs to be an exception, other code
// assumes at least one smoke-texture exists
throw content_error("missing smoke textures");
}
}
{
// shield-texture memory
char perlinTexMem[128][128][4];
for (int y = 0; y < 128; y++) {
for (int x = 0; x < 128; x++) {
perlinTexMem[y][x][0] = 70;
perlinTexMem[y][x][1] = 70;
perlinTexMem[y][x][2] = 70;
perlinTexMem[y][x][3] = 70;
}
}
textureAtlas->AddTexFromMem("perlintex", 128, 128, CTextureAtlas::RGBA32, perlinTexMem);
}
blockedTexNames.insert("perlintex");
blockedTexNames.insert("flare");
blockedTexNames.insert("explo");
blockedTexNames.insert("explofade");
blockedTexNames.insert("heatcloud");
blockedTexNames.insert("laserend");
blockedTexNames.insert("laserfalloff");
blockedTexNames.insert("randdots");
blockedTexNames.insert("smoketrail");
blockedTexNames.insert("wake");
blockedTexNames.insert("perlintex");
blockedTexNames.insert("flame");
blockedTexNames.insert("sbtrailtexture");
blockedTexNames.insert("missiletrailtexture");
blockedTexNames.insert("muzzleflametexture");
blockedTexNames.insert("repulsetexture");
blockedTexNames.insert("dguntexture");
blockedTexNames.insert("flareprojectiletexture");
blockedTexNames.insert("sbflaretexture");
blockedTexNames.insert("missileflaretexture");
blockedTexNames.insert("beamlaserflaretexture");
blockedTexNames.insert("bubbletexture");
//.........这里部分代码省略.........
开发者ID:DarksidedStudios,项目名称:spring,代码行数:101,代码来源:ProjectileDrawer.cpp
示例8: content_error
void CUnitDefHandler::ParseUnitDefTable(const LuaTable& udTable, const string& unitName, int id)
{
UnitDef& ud = unitDefs[id];
// allocate and fill ud->unitImage
ud.buildPicName = udTable.GetString("buildPic", "");
ud.humanName = udTable.GetString("name", "");
if (ud.humanName.empty()) {
const string errmsg = "missing 'name' parameter for the " + unitName + " unitdef";
throw content_error(errmsg);
}
ud.filename = udTable.GetString("filename", "");
if (ud.filename.empty()) {
const string errmsg = "missing 'filename' parameter for the" + unitName + " unitdef";
throw content_error(errmsg);
}
ud.tooltip = udTable.GetString("description", ud.name);
const string decoy = udTable.GetString("decoyFor", "");
if (!decoy.empty()) {
decoyNameMap[ud.name] = StringToLower(decoy);
}
ud.gaia = udTable.GetString("gaia", "");
ud.isCommander = udTable.GetBool("commander", false);
if (ud.isCommander && gameSetup) {
ud.metalStorage = udTable.GetFloat("metalStorage", gameSetup->startMetal);
ud.energyStorage = udTable.GetFloat("energyStorage", gameSetup->startEnergy);
} else {
ud.metalStorage = udTable.GetFloat("metalStorage", 0.0f);
ud.energyStorage = udTable.GetFloat("energyStorage", 0.0f);
}
ud.extractsMetal = udTable.GetFloat("extractsMetal", 0.0f);
ud.windGenerator = udTable.GetFloat("windGenerator", 0.0f);
ud.tidalGenerator = udTable.GetFloat("tidalGenerator", 0.0f);
ud.metalUpkeep = udTable.GetFloat("metalUse", 0.0f);
ud.energyUpkeep = udTable.GetFloat("energyUse", 0.0f);
ud.metalMake = udTable.GetFloat("metalMake", 0.0f);
ud.makesMetal = udTable.GetFloat("makesMetal", 0.0f);
ud.energyMake = udTable.GetFloat("energyMake", 0.0f);
ud.health = udTable.GetFloat("maxDamage", 0.0f);
ud.autoHeal = udTable.GetFloat("autoHeal", 0.0f) * (16.0f / GAME_SPEED);
ud.idleAutoHeal = udTable.GetFloat("idleAutoHeal", 10.0f) * (16.0f / GAME_SPEED);
ud.idleTime = udTable.GetInt("idleTime", 600);
ud.buildangle = udTable.GetInt("buildAngle", 0);
ud.isMetalMaker = (ud.makesMetal >= 1 && ud.energyUpkeep > ud.makesMetal * 40);
ud.controlRadius = 32;
ud.losHeight = 20;
ud.metalCost = udTable.GetFloat("buildCostMetal", 0.0f);
if (ud.metalCost < 1.0f) {
ud.metalCost = 1.0f; //avoid some nasty divide by 0 etc
}
ud.mass = udTable.GetFloat("mass", 0.0f);
if (ud.mass <= 0.0f) {
ud.mass=ud.metalCost;
}
ud.energyCost = udTable.GetFloat("buildCostEnergy", 0.0f);
ud.buildTime = udTable.GetFloat("buildTime", 0.0f);
if (ud.buildTime < 1.0f) {
ud.buildTime = 1.0f; //avoid some nasty divide by 0 etc
}
ud.aihint = id; // FIXME? (as noted in SelectedUnits.cpp, aihint is ignored)
ud.cobID = udTable.GetInt("cobID", -1);
ud.losRadius = udTable.GetFloat("sightDistance", 0.0f) * modInfo.losMul / (SQUARE_SIZE * (1 << modInfo.losMipLevel));
ud.airLosRadius = udTable.GetFloat("airSightDistance", -1.0f);
if (ud.airLosRadius == -1.0f) {
ud.airLosRadius=udTable.GetFloat("sightDistance", 0.0f) * modInfo.airLosMul * 1.5f / (SQUARE_SIZE * (1 << modInfo.airMipLevel));
} else {
ud.airLosRadius = ud.airLosRadius * modInfo.airLosMul / (SQUARE_SIZE * (1 << modInfo.airMipLevel));
}
ud.canSubmerge = udTable.GetBool("canSubmerge", false);
ud.canfly = udTable.GetBool("canFly", false);
ud.canmove = udTable.GetBool("canMove", false);
ud.reclaimable = udTable.GetBool("reclaimable", true);
ud.capturable = udTable.GetBool("capturable", true);
ud.repairable = udTable.GetBool("repairable", true);
ud.canAttack = udTable.GetBool("canAttack", true);
ud.canFight = udTable.GetBool("canFight", true);
ud.canPatrol = udTable.GetBool("canPatrol", true);
ud.canGuard = udTable.GetBool("canGuard", true);
ud.canRepeat = udTable.GetBool("canRepeat", true);
ud.builder = udTable.GetBool("builder", true);
ud.canRestore = udTable.GetBool("canRestore", ud.builder);
ud.canRepair = udTable.GetBool("canRepair", ud.builder);
ud.canReclaim = udTable.GetBool("canReclaim", ud.builder);
//.........这里部分代码省略.........
开发者ID:Dmytry,项目名称:spring,代码行数:101,代码来源:UnitDefHandler.cpp
示例9: noCost
CUnitDefHandler::CUnitDefHandler(void) : noCost(false)
{
weaponDefHandler = new CWeaponDefHandler();
PrintLoadMsg("Loading unit definitions");
const LuaTable rootTable = game->defsParser->GetRoot().SubTable("UnitDefs");
if (!rootTable.IsValid()) {
throw content_error("Error loading UnitDefs");
}
vector<string> unitDefNames;
rootTable.GetKeys(unitDefNames);
numUnitDefs = unitDefNames.size();
/*
// ?? "restricted" does not automatically mean "cannot be built
// at all, so we don't need the unitdef for this unit" -- Kloot
numUnitDefs -= gameSetup->restrictedUnits.size();
*/
// This could be wasteful if there is a lot of restricted units, but that is not that likely
unitDefs = new UnitDef[numUnitDefs + 1];
// start at unitdef id 1
unsigned int id = 1;
for (unsigned int a = 0; a < unitDefNames.size(); ++a) {
const string unitName = unitDefNames[a];
/*
// Restrictions may tell us not to use this unit at all
// FIXME: causes mod errors when a unit is restricted to
// 0, since GetUnitByName() will return NULL if its UnitDef
// has not been loaded -- Kloot
const std::map<std::string, int>& resUnits = gameSetup->restrictedUnits;
if ((resUnits.find(unitName) != resUnits.end()) &&
(resUnits.find(unitName)->second == 0)) {
continue;
}
*/
// Seems ok, load it
unitDefs[id].valid = false;
unitDefs[id].name = unitName;
unitDefs[id].id = id;
unitDefs[id].buildangle = 0;
unitDefs[id].buildPic = NULL;
unitDefs[id].decoyDef = NULL;
unitDefs[id].techLevel = -1;
unitDefs[id].collisionVolume = NULL;
unitID[unitName] = id;
for (int ym = 0; ym < 4; ym++) {
unitDefs[id].yardmaps[ym] = 0;
}
// parse the unitdef data (but don't load buildpics, etc...)
LuaTable udTable = rootTable.SubTable(unitName);
ParseUnitDef(udTable, unitName, id);
// Increase index for next unit
id++;
}
// set the real number of unitdefs
numUnitDefs = (id - 1);
CleanBuildOptions();
FindStartUnits();
ProcessDecoys();
AssignTechLevels();
}
开发者ID:Dmytry,项目名称:spring,代码行数:74,代码来源:UnitDefHandler.cpp
示例10: name
UnitDef::UnitDef(const LuaTable& udTable, const std::string& unitName, int id)
: name(unitName)
, id(id)
, collisionVolume(NULL)
, decoyDef(NULL)
, techLevel(-1)
, buildPic(NULL)
, buildangle(0)
{
humanName = udTable.GetString("name", "");
if (humanName.empty()) {
const string errmsg = "missing 'name' parameter for the " + unitName + " unitdef";
throw content_error(errmsg);
}
filename = udTable.GetString("filename", "");
if (filename.empty()) {
const string errmsg = "missing 'filename' parameter for the" + unitName + " unitdef";
throw content_error(errmsg);
}
tooltip = udTable.GetString("description", name);
buildPicName = udTable.GetString("buildPic", "");
decoyName = udTable.GetString("decoyFor", "");
gaia = udTable.GetString("gaia", "");
isCommander = udTable.GetBool("commander", false);
metalStorage = udTable.GetFloat("metalStorage", 0.0f);
energyStorage = udTable.GetFloat("energyStorage", 0.0f);
extractsMetal = udTable.GetFloat("extractsMetal", 0.0f);
windGenerator = udTable.GetFloat("windGenerator", 0.0f);
tidalGenerator = udTable.GetFloat("tidalGenerator", 0.0f);
metalUpkeep = udTable.GetFloat("metalUse", 0.0f);
energyUpkeep = udTable.GetFloat("energyUse", 0.0f);
metalMake = udTable.GetFloat("metalMake", 0.0f);
makesMetal = udTable.GetFloat("makesMetal", 0.0f);
energyMake = udTable.GetFloat("energyMake", 0.0f);
health = udTable.GetFloat("maxDamage", 0.0f);
autoHeal = udTable.GetFloat("autoHeal", 0.0f) * (16.0f / GAME_SPEED);
idleAutoHeal = udTable.GetFloat("idleAutoHeal", 10.0f) * (16.0f / GAME_SPEED);
idleTime = udTable.GetInt("idleTime", 600);
buildangle = udTable.GetInt("buildAngle", 0);
losHeight = 20;
metalCost = udTable.GetFloat("buildCostMetal", 0.0f);
if (metalCost < 1.0f) {
metalCost = 1.0f; //avoid some nasty divide by 0 etc
}
mass = udTable.GetFloat("mass", 0.0f);
if (mass <= 0.0f) {
mass = metalCost;
}
energyCost = udTable.GetFloat("buildCostEnergy", 0.0f);
buildTime = udTable.GetFloat("buildTime", 0.0f);
if (buildTime < 1.0f) {
buildTime = 1.0f; //avoid some nasty divide by 0 etc
}
aihint = id; // FIXME? (as noted in SelectedUnits.cpp, aihint is ignored)
cobID = udTable.GetInt("cobID", -1);
losRadius = udTable.GetFloat("sightDistance", 0.0f) * modInfo.losMul / (SQUARE_SIZE * (1 << modInfo.losMipLevel));
airLosRadius = udTable.GetFloat("airSightDistance", -1.0f);
if (airLosRadius == -1.0f) {
airLosRadius = udTable.GetFloat("sightDistance", 0.0f) * modInfo.airLosMul * 1.5f / (SQUARE_SIZE * (1 << modInfo.airMipLevel));
} else {
airLosRadius = airLosRadius * modInfo.airLosMul / (SQUARE_SIZE * (1 << modInfo.airMipLevel));
}
canSubmerge = udTable.GetBool("canSubmerge", false);
canfly = udTable.GetBool("canFly", false);
canmove = udTable.GetBool("canMove", false);
reclaimable = udTable.GetBool("reclaimable", true);
capturable = udTable.GetBool("capturable", true);
repairable = udTable.GetBool("repairable", true);
canAttack = udTable.GetBool("canAttack", true);
canFight = udTable.GetBool("canFight", true);
canPatrol = udTable.GetBool("canPatrol", true);
canGuard = udTable.GetBool("canGuard", true);
canRepeat = udTable.GetBool("canRepeat", true);
builder = udTable.GetBool("builder", false);
canRestore = udTable.GetBool("canRestore", builder);
canRepair = udTable.GetBool("canRepair", builder);
canReclaim = udTable.GetBool("canReclaim", builder);
canAssist = udTable.GetBool("canAssist", builder);
canBeAssisted = udTable.GetBool("canBeAssisted", true);
canSelfRepair = udTable.GetBool("canSelfRepair", false);
fullHealthFactory = udTable.GetBool("fullHealthFactory", false);
factoryHeadingTakeoff = udTable.GetBool("factoryHeadingTakeoff", true);
upright = udTable.GetBool("upright", false);
collide = udTable.GetBool("collide", true);
onoffable = udTable.GetBool("onoffable", false);
//.........这里部分代码省略.........
开发者ID:lunixbochs,项目名称:spring,代码行数:101,代码来源:UnitDef.cpp
示例11: main
int main(int argc, char *argv[])
{
#ifdef _WIN32
try {
#endif
std::cout << "If you find any errors, report them to mantis or the forums." << std::endl << std::endl;
ConfigHandler::Instantiate("");
FileSystemHandler::Cleanup();
FileSystemHandler::Initialize(false);
CGameServer* server = 0;
CGameSetup* gameSetup = 0;
if (argc > 1)
{
const std::string script(argv[1]);
std::cout << "Loading script from file: " << script << std::endl;
ClientSetup settings;
CFileHandler fh(argv[1]);
if (!fh.FileExists())
throw content_error("Setupscript doesn't exists in given location: "+script);
std::string buf;
if (!fh.LoadStringData(buf))
throw content_error("Setupscript cannot be read: "+script);
settings.Init(buf);
gameSetup = new CGameSetup(); // to store the gamedata inside
if (!gameSetup->Init(buf)) // read the script provided by cmdline
{
std::cout << "Failed to load script" << std::endl;
return 1;
}
std::cout << "Starting server..." << std::endl;
// Create the server, it will run in a separate thread
GameData* data = new GameData();
UnsyncedRNG rng;
rng.Seed(gameSetup->gameSetupText.length());
rng.Seed(script.length());
data->SetRandomSeed(rng.RandInt());
// Use script provided hashes if they exist
if (gameSetup->mapHash != 0)
{
data->SetMapChecksum(gameSetup->mapHash);
gameSetup->LoadStartPositions(false); // reduced mode
}
else
{
data->SetMapChecksum(archiveScanner->GetMapChecksum(gameSetup->mapName));
CFileHandler* f = new CFileHandler("maps/" + gameSetup->mapName);
if (!f->FileExists()) {
std::vector<std::string> ars = archiveScanner->GetArchivesForMap(gameSetup->mapName);
if (ars.empty()) {
throw content_error("Couldn't find any archives for map '" + gameSetup->mapName + "'.");
}
for (std::vector<std::string>::iterator i = ars.begin(); i != ars.end(); ++i) {
if (!vfsHandler->AddArchive(*i, false)) {
throw content_error("Couldn't load archive '" + *i + "' for map '" + gameSetup->mapName + "'.");
}
}
}
delete f;
gameSetup->LoadStartPositions(); // full mode
}
if (gameSetup->modHash != 0) {
data->SetModChecksum(gameSetup->modHash);
} else {
const std::string modArchive = archiveScanner->ModNameToModArchive(gameSetup->modName);
data->SetModChecksum(archiveScanner->GetModChecksum(modArchive));
}
data->SetSetup(gameSetup->gameSetupText);
server = new CGameServer(&settings, false, data, gameSetup);
while (!server->HasFinished()) // check if still running
#ifdef _WIN32
Sleep(1000);
#else
sleep(1); // if so, wait 1 second
#endif
delete server; // delete the server after usage
}
else
{
std::cout << "usage: spring-dedicated <full_path_to_script>" << std::endl;
}
FileSystemHandler::Cleanup();
#ifdef _WIN32
}
catch (const std::exception& err)
{
std::cout << "Exception raised: " << err.what() << std::endl;
return 1;
}
//.........这里部分代码省略.........
开发者ID:javaphoon,项目名称:spring,代码行数:101,代码来源:main.cpp
示例12: teamTexFile
C3DOTextureHandler::C3DOTextureHandler()
{
CFileHandler teamTexFile("unittextures/tatex/teamtex.txt");
CFileHandler paletteFile("unittextures/tatex/palette.pal");
CSimpleParser parser(teamTexFile);
std::set<std::string> teamTexes;
while (!parser.Eof()) {
teamTexes.insert(StringToLower(parser.GetCleanLine()));
}
TexFile* texfiles[10000];
int numfiles = 0;
int totalSize = 0;
const std::vector<std::string>& filesBMP = CFileHandler::FindFiles("unittextures/tatex/", "*.bmp");
std::vector<std::string> files = CFileHandler::FindFiles("unittextures/tatex/", "*.tga");
files.insert(files.end(), filesBMP.begin(), filesBMP.end());
std::set<string> usedNames;
for (std::vector<std::string>::iterator fi = files.begin(); fi != files.end(); ++fi) {
const std::string& s = *fi;
const std::string s2 = StringToLower(FileSystem::GetBasename(s));
// avoid duplicate names and give tga images priority
if (usedNames.find(s2) != usedNames.end()) {
continue;
}
usedNames.insert(s2);
if(teamTexes.find(s2) == teamTexes.end()){
TexFile* tex = CreateTex(s, s2, false);
texfiles[numfiles++] = tex;
totalSize += tex->tex.xsize * tex->tex.ysize;
} else {
TexFile* tex = CreateTex(s, s2, true);
texfiles[numfiles++] = tex;
totalSize += tex->tex.xsize * tex->tex.ysize;
}
}
if (paletteFile.FileExists()) {
palette.Init(paletteFile);
}
for (unsigned a = 0; a < CTAPalette::NUM_PALETTE_ENTRIES; ++a) {
const std::string name = "ta_color" + IntToString(a, "%i");
TexFile* tex = new TexFile;
tex->name = name;
tex->tex.Alloc(1, 1);
tex->tex.mem[0] = palette[a][0];
tex->tex.mem[1] = palette[a][1];
tex->tex.mem[2] = palette[a][2];
tex->tex.mem[3] = 0; // teamcolor
tex->tex2.Alloc(1, 1);
tex->tex2.mem[0] = 0; // self illum
tex->tex2.mem[1] = 30; // reflectivity
tex->tex2.mem[2] = 0;
tex->tex2.mem[3] = 255;
texfiles[numfiles++] = tex;
totalSize += tex->tex.xsize * tex->tex.ysize;
}
// pessimistic guess about how much space will be wasted
totalSize = (int)(totalSize * 1.2f);
if (totalSize < 1024*1024) {
bigTexX = 1024;
bigTexY = 1024;
} else if (totalSize < 1024*2048) {
bigTexX = 1024;
bigTexY = 2048;
} else if (totalSize < 2048*2048) {
bigTexX = 2048;
bigTexY = 2048;
} else {
bigTexX = 2048;
bigTexY = 2048;
throw content_error("Too many/large texture in 3do texture-atlas to fit in 2048*2048");
}
qsort(texfiles,numfiles,sizeof(TexFile*), CompareTatex2);
unsigned char* bigtex1 = new unsigned char[bigTexX * bigTexY * 4];
unsigned char* bigtex2 = new unsigned char[bigTexX * bigTexY * 4];
for (int a = 0; a < (bigTexX * bigTexY); ++a) {
bigtex1[a*4 + 0] = 128;
bigtex1[a*4 + 1] = 128;
bigtex1[a*4 + 2] = 128;
bigtex1[a*4 + 3] = 0;
bigtex2[a*4 + 0] = 0;
bigtex2[a*4 + 1] = 128;
bigtex2[a*4 + 2] = 0;
bigtex2[a*4 + 3] = 255;
//.........这里部分代码省略.........
开发者ID:Arkazon,项目名称:spring,代码行数:101,代码来源:3DOTextureHandler.cpp
示例13: content_error
CMoveInfo::CMoveInfo()
{
const LuaTable rootTable = game->defsParser->GetRoot().SubTable("MoveDefs");
if (!rootTable.IsValid()) {
throw content_error("Error loading movement definitions");
}
groundMoveMath = new CGroundMoveMath();
hoverMoveMath = new CHoverMoveMath();
seaMoveMath = new CShipMoveMath();
CRC crc;
for (int tt = 0; tt < CMapInfo::NUM_TERRAIN_TYPES; ++tt) {
const CMapInfo::TerrainType& terrType = mapInfo->terrainTypes[tt];
crc << terrType.tankSpeed << terrType.kbotSpeed;
crc << terrType.hoverSpeed << terrType.shipSpeed;
}
for (size_t num = 1; /* no test */; num++) {
const LuaTable moveTable = rootTable.SubTable(num);
if (!moveTable.IsValid()) {
break;
}
MoveData* md = new MoveData(NULL);
md->name = StringToLower(moveTable.GetString("name", ""));
md->pathType = (num - 1);
md->crushStrength = moveTable.GetFloat("crushStrength", 10.0f);
const float minWaterDepth = moveTable.GetFloat("minWaterDepth", 10.0f);
const float maxWaterDepth = moveTable.GetFloat("maxWaterDepth", 0.0f);
if ((md->name.find("boat") != string::npos) ||
(md->name.find("ship") != string::npos)) {
md->moveType = MoveData::Ship_Move;
md->depth = minWaterDepth;
md->moveFamily = MoveDat
|
请发表评论