diff --git a/Aquaria/Continuity.cpp b/Aquaria/Continuity.cpp index 71ac4e4..8902916 100644 --- a/Aquaria/Continuity.cpp +++ b/Aquaria/Continuity.cpp @@ -168,6 +168,15 @@ IngredientType Continuity::getIngredientTypeFromName(const std::string &name) co return IT_NONE; } +std::string Continuity::getIngredientDisplayName(const std::string& name) const +{ + IngredientNameMap::const_iterator it = ingredientDisplayNames.find(name); + if (it != ingredientDisplayNames.end()) + return it->second; + + return splitCamelCase(name); +} + IngredientData *Continuity::getIngredientHeldByIndex(int idx) const { if (idx < 0 || idx >= ingredients.size()) return 0; @@ -191,6 +200,7 @@ void Recipe::clear() types.clear(); names.clear(); result = ""; + resultDisplayName = ""; known = false; } @@ -857,13 +867,6 @@ std::string Continuity::getIngredientAffectsString(IngredientData *data) return getAllIEString(data); } -std::string Continuity::getIngredientDescription(IngredientEffectType type) -{ - int t = (int)type; - if (t < 0 || t >= ingredientDescriptions.size()) return ""; - return ingredientDescriptions[t].text; -} - void Continuity::loadTreasureData() { treasureData.clear(); @@ -900,20 +903,6 @@ void Continuity::loadIngredientData(const std::string &file) { std::string line, name, gfx, type, effects; - ingredientDescriptions.clear(); - - /* - int num; - InStream in2("data/ingredientdescriptions.txt"); - while (std::getline(in2, line)) - { - IngredientDescription desc; - std::istringstream inLine(line); - inLine >> num >> desc.text; - ingredientDescriptions.push_back(desc); - } - */ - clearIngredientData(); recipes.clear(); @@ -1060,7 +1049,6 @@ void Continuity::loadIngredientData(const std::string &file) Recipe r; while (in >> name) { - r.result = name; if (name == "+") { continue; @@ -1073,10 +1061,13 @@ void Continuity::loadIngredientData(const std::string &file) else { if (quitNext) + { r.result = name; + r.resultDisplayName = getIngredientDisplayName(name); + } else { - IngredientType it = dsq->continuity.getIngredientTypeFromName(name); + IngredientType it = getIngredientTypeFromName(name); if (it == IT_NONE) { r.addName(name); @@ -1101,6 +1092,24 @@ void Continuity::loadIngredientData(const std::string &file) in.close(); } +void Continuity::loadIngredientDisplayNames(const std::string& file) +{ + InStream in(file); + if (!in) + return; + + std::string line, name, text; + while (std::getline(in, line)) + { + size_t pos = line.find(' '); + if (pos == std::string::npos) + continue; + name = line.substr(0, pos); + text = line.substr(pos + 1); + ingredientDisplayNames[name] = text; + } +} + void Continuity::learnFormUpgrade(FormUpgradeType form) { formUpgrades[form] = true; @@ -1200,11 +1209,11 @@ void Continuity::loadSongBank() songSlotNames.clear(); songBank.clear(); - loadIntoSongBank(dsq->user.localisePath("data/songs.xml")); + loadIntoSongBank(localisePath("data/songs.xml")); if (dsq->mod.isActive()) { - loadIntoSongBank(dsq->user.localisePath(dsq->mod.getPath() + "scripts/songs.xml", dsq->mod.getPath())); + loadIntoSongBank(localisePath(dsq->mod.getPath() + "scripts/songs.xml", dsq->mod.getPath())); } } @@ -2534,6 +2543,7 @@ void Continuity::loadFile(int slot) { dsq->user.save(); this->reset(); + knowsSong.clear(); // Adds shield song by default, which interferes with mods that don't start with it TiXmlDocument doc; loadFileData(slot, doc); @@ -2897,7 +2907,9 @@ void Continuity::loadFile(int slot) //dsq->game->transitionToScene(); } + // Possibly mod-specific data the the continuity reset didn't catch loadSongBank(); + this->worldMap.load(); } void Continuity::setNaijaModel(std::string model) @@ -3231,23 +3243,32 @@ void Continuity::reset() //load ingredients + ingredientDisplayNames.clear(); + + loadIngredientDisplayNames("data/ingredientnames.txt"); + + std::string fname = localisePath("data/ingredientnames.txt"); + loadIngredientDisplayNames(fname); + + if(dsq->mod.isActive()) + { + fname = localisePath(dsq->mod.getPath() + "ingredientnames.txt", dsq->mod.getPath()); + loadIngredientDisplayNames(fname); + } + ingredientDescriptions.clear(); ingredientData.clear(); recipes.clear(); - std::string fname; - if(dsq->mod.isActive()) { //load mod ingredients - fname = dsq->user.localisePath(dsq->mod.getPath() + "ingredients.txt", dsq->mod.getPath()); - loadIngredientData(fname); + loadIngredientData(dsq->mod.getPath() + "ingredients.txt"); } //load ingredients for the main game if(ingredientData.empty() && recipes.empty()) { - fname = dsq->user.localisePath("data/ingredients.txt"); - loadIngredientData(fname); + loadIngredientData("data/ingredients.txt"); } loadPetData(); diff --git a/Aquaria/DSQ.cpp b/Aquaria/DSQ.cpp index 9b7c873..61a8bbf 100644 --- a/Aquaria/DSQ.cpp +++ b/Aquaria/DSQ.cpp @@ -485,33 +485,38 @@ void DSQ::loadFonts() destroyFonts(); - font.load("data/font-small.glf", 1, false); + std::string file = localisePath("data/font-small.glf"); + + font.load(file, 1, false); font.fontTopColor = Vector(0.9,0.9,1); font.fontBtmColor = Vector(0.5,0.8,1); font.overrideTexture = core->addTexture("font"); - smallFont.load("data/font-small.glf", 0.6, false); + smallFont.load(file, 0.6, false); smallFont.fontTopColor = Vector(0.9,0.9,1); smallFont.fontBtmColor = Vector(0.5,0.8,1); smallFont.overrideTexture = core->addTexture("font"); - smallFontRed.load("data/font-small.glf", 0.6, false); + smallFontRed.load(file, 0.6, false); smallFontRed.fontTopColor = Vector(1,0.9,0.9); smallFontRed.fontBtmColor = Vector(1,0.8,0.5); smallFontRed.overrideTexture = core->addTexture("font"); - subsFont.load("data/font-small.glf", 0.5, false); + subsFont.load(file, 0.5, false); subsFont.fontTopColor = Vector(1,1,1); subsFont.fontBtmColor = Vector(0.5,0.8,1); subsFont.overrideTexture = core->addTexture("font"); - goldFont.load("data/font-small.glf", 1, false); + goldFont.load(file, 1, false); goldFont.fontTopColor = Vector(1,0.9,0.5); goldFont.fontBtmColor = Vector(0.6,0.5,0.25); goldFont.overrideTexture = core->addTexture("font"); + + file = localisePath("data/font.ttf"); + debugLog("ttf..."); - arialFontData = (unsigned char *)readFile("data/font.ttf", &arialFontDataSize); + arialFontData = (unsigned char *)readFile(file, &arialFontDataSize); if (arialFontData) { fontArialSmall .create(arialFontData, arialFontDataSize, 12); @@ -2162,9 +2167,7 @@ void DSQ::applyPatches() vfs.MountExternalPath(mod.getBaseModPath().c_str(), "_mods"); } - // user wants mods, but not yet loaded - if(activePatches.size() && modEntries.empty()) - loadMods(); + loadMods(); for (std::set::iterator it = activePatches.begin(); it != activePatches.end(); ++it) for(int i = 0; i < modEntries.size(); ++i) diff --git a/Aquaria/DSQ.h b/Aquaria/DSQ.h index a5305b5..1787b83 100644 --- a/Aquaria/DSQ.h +++ b/Aquaria/DSQ.h @@ -696,10 +696,10 @@ struct IngredientEffect class IngredientData { public: - IngredientData(const std::string &name, const std::string &gfx, IngredientType type) - : name(name), gfx(gfx), amount(0), held(0), type(type), marked(0), sorted(false) {} + IngredientData(const std::string &name, const std::string &gfx, IngredientType type); int getIndex() const; const std::string name, gfx; + std::string displayName; const IngredientType type; int amount; int held; @@ -747,6 +747,7 @@ public: std::vector types; std::vector names; std::string result; + std::string resultDisplayName; int index; @@ -1079,9 +1080,11 @@ public: void applyIngredientEffects(IngredientData *data); void loadIngredientData(const std::string &file); + void loadIngredientDisplayNames(const std::string& file); bool hasIngredients() const { return !ingredients.empty(); } IngredientDatas::size_type ingredientCount() const { return ingredients.size(); } IngredientType getIngredientTypeFromName(const std::string &name) const; + std::string getIngredientDisplayName(const std::string& name) const; void removeEmptyIngredients(); void spawnAllIngredients(const Vector &position); @@ -1130,7 +1133,6 @@ public: IngredientDescriptions ingredientDescriptions; std::string getIngredientAffectsString(IngredientData *data); - std::string getIngredientDescription(IngredientEffectType type); WorldMap worldMap; @@ -1176,6 +1178,9 @@ private: IngredientDatas ingredients; // held ingredients IngredientDatas ingredientData; // all possible ingredients + + typedef std::map IngredientNameMap; + IngredientNameMap ingredientDisplayNames; }; class Profile diff --git a/Aquaria/Game.cpp b/Aquaria/Game.cpp index fe662f8..03a732c 100644 --- a/Aquaria/Game.cpp +++ b/Aquaria/Game.cpp @@ -635,7 +635,7 @@ void FoodSlot::onUpdate(float dt) if ((core->mouse.position - getWorldPosition()).isLength2DIn(16)) //if (isCursorIn()) { - dsq->game->foodLabel->setText(splitCamelCase(ingredient->name)); + dsq->game->foodLabel->setText(ingredient->displayName); dsq->game->foodLabel->alpha.interpolateTo(1, 0.2); dsq->game->foodDescription->setText(dsq->continuity.getIngredientAffectsString(ingredient)); @@ -1971,30 +1971,13 @@ void Game::fillGridFromQuad(Quad *q, ObsType obsType, bool trim) h2/=TILE_SIZE; tpos.x -= w2; tpos.y -= h2; - GLuint id = q->texture->textures[0]; + int w = 0, h = 0; - glBindTexture(GL_TEXTURE_2D, id); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h); - //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPONENTS, &c);// assume 4 - unsigned int size = w*h*4; - if (!size || w <= 0 || h <= 0) - return; - unsigned char *data = (unsigned char*)malloc(size + 6); - memcpy(data + size, "SAFE", 5); + unsigned int size = 0; + unsigned char *data = q->texture->getBufferAndSize(&w, &h, &size); if (!data) { - errorLog("Game::fillGridFromQuad allocation failure"); - return; - } - glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); - glBindTexture(GL_TEXTURE_2D, 0); - - // Not sure but this might be the case with nouveau drivers on linux... still investigating. -- fg - if(memcmp(data + size, "SAFE", 5)) - { - errorLog("Game::fillGridFromQuad(): Broken graphics driver! Wrote past end of buffer!"); - free(data); // in case we are here, this will most likely cause a crash. + debugLog("Failed to get buffer in Game::fillGridFromQuad()"); return; } @@ -2041,16 +2024,13 @@ void Game::fillGridFromQuad(Quad *q, ObsType obsType, bool trim) } } - if (data) - { - free(data); - data = 0; - } + free(data); if (trim) { - std::vector obsCopy = obs; - obs.clear(); + std::vector obsCopy; + obsCopy.swap(obs); + // obs now empty int sides = 0; for (int i = 0; i < obsCopy.size(); i++) @@ -2803,25 +2783,15 @@ void Game::generateCollisionMask(Quad *q, int overrideCollideRadius) h2/=TILE_SIZE; tpos.x -= w2; tpos.y -= h2; - GLuint id = q->texture->textures[0]; + int w = 0, h = 0; - glBindTexture(GL_TEXTURE_2D, id); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h); - //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPONENTS, &c);// assume 4 - - unsigned int size = w*h*4; - if (!size || w <= 0 || h <= 0) - return; - - unsigned char *data = (unsigned char*)malloc(size); - + unsigned int size = 0; + unsigned char *data = q->texture->getBufferAndSize(&w, &h, &size); if (!data) { - debugLog("Could not malloc in Game::generateCollisionMask"); + debugLog("Failed to get buffer in Game::generateCollisionMask()"); return; } - glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); q->collisionMaskRadius = 0; @@ -2865,6 +2835,10 @@ void Game::generateCollisionMask(Quad *q, int overrideCollideRadius) } } + q->collisionMaskRadius = 512; + + free(data); + /* for (int i = 0; i < q->collisionMask.size(); i++) @@ -2887,10 +2861,7 @@ void Game::generateCollisionMask(Quad *q, int overrideCollideRadius) q->collisionMaskRadius = h2*2; */ //q->collisionMaskRadius = sqrtf(sqr(w2)+sqr(h2)); - q->collisionMaskRadius = 512; - glBindTexture(GL_TEXTURE_2D, 0); - free(data); /* int rot = rotation.z; while (rot > 360) @@ -7948,34 +7919,34 @@ void Game::toggleHelpScreen(bool on, const std::string &label) // These say "Mac" but we use them on Linux, too. #if defined(BBGE_BUILD_UNIX) - std::string fname = dsq->user.localisePath("data/help_header_mac.txt"); + std::string fname = localisePath("data/help_header_mac.txt"); appendFileToString(data, fname); #else - std::string fname = dsq->user.localisePath("data/help_header.txt"); + std::string fname = localisePath("data/help_header.txt"); appendFileToString(data, fname); #endif if (dsq->continuity.hasSong(SONG_BIND)) { - fname = dsq->user.localisePath("data/help_bindsong.txt"); + fname = localisePath("data/help_bindsong.txt"); appendFileToString(data, fname); } if (dsq->continuity.hasSong(SONG_ENERGYFORM)) { - fname = dsq->user.localisePath("data/help_energyform.txt"); + fname = localisePath("data/help_energyform.txt"); appendFileToString(data, fname); } - fname = dsq->user.localisePath("data/help_start.txt"); + fname = localisePath("data/help_start.txt"); appendFileToString(data, fname); // These say "Mac" but we use them on Linux, too. #if defined(BBGE_BUILD_UNIX) - fname = dsq->user.localisePath("data/help_end_mac.txt"); + fname = localisePath("data/help_end_mac.txt"); appendFileToString(data, fname); #else - fname = dsq->user.localisePath("data/help_end.txt"); + fname = localisePath("data/help_end.txt"); appendFileToString(data, fname); #endif // !!! FIXME: this is such a hack. - data += "\n\n[Achievements]\n\n"; + data += "\n\n" + dsq->continuity.stringBank.get(2032) + "\n\n"; dsq->continuity.statsAndAchievements->appendStringData(data); helpBG = new Quad; @@ -11211,7 +11182,7 @@ void Game::learnedRecipe(Recipe *r, bool effects) if (nocasecmp(dsq->getTopStateData()->name,"Game")==0 && !applyingState) { std::ostringstream os; - os << dsq->continuity.stringBank.get(23) << " " << splitCamelCase(r->result) << " " << dsq->continuity.stringBank.get(24); + os << dsq->continuity.stringBank.get(23) << " " << r->resultDisplayName << " " << dsq->continuity.stringBank.get(24); IngredientData *data = dsq->continuity.getIngredientDataByName(r->result); if (data) { diff --git a/Aquaria/Ingredient.cpp b/Aquaria/Ingredient.cpp index 8647b9e..d31d980 100644 --- a/Aquaria/Ingredient.cpp +++ b/Aquaria/Ingredient.cpp @@ -21,6 +21,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Game.h" #include "Avatar.h" +IngredientData::IngredientData(const std::string &name, const std::string &gfx, IngredientType type) +: name(name), gfx(gfx), amount(0), held(0), type(type), marked(0), sorted(false) +, displayName(dsq->continuity.getIngredientDisplayName(name)) +{ +} int IngredientData::getIndex() const { diff --git a/Aquaria/RecipeMenuEntry.cpp b/Aquaria/RecipeMenuEntry.cpp index 5b42238..b3efa88 100644 --- a/Aquaria/RecipeMenuEntry.cpp +++ b/Aquaria/RecipeMenuEntry.cpp @@ -26,8 +26,7 @@ namespace RecipeMenuNamespace std::string processFoodName(std::string name) { - name = splitCamelCase(name); - int p = name.find(' '); + size_t p = name.find(' '); if (p != std::string::npos) { name[p] = '\n'; @@ -62,7 +61,7 @@ RecipeMenuEntry::RecipeMenuEntry(Recipe *recipe) : RenderObject(), recipe(recipe text->color = 0; text->position = result->position + Vector(0, 18); - text->setText(processFoodName(data->name)); + text->setText(processFoodName(data->displayName)); addChild(text, PM_POINTER); } @@ -99,7 +98,7 @@ RecipeMenuEntry::RecipeMenuEntry(Recipe *recipe) : RenderObject(), recipe(recipe text->scale = Vector(0.7, 0.7); text->color = 0; text->position = ing[c]->position + Vector(0, 18); - text->setText(processFoodName(data->name)); + text->setText(processFoodName(data->displayName)); addChild(text, PM_POINTER); if (c < size) @@ -130,17 +129,10 @@ RecipeMenuEntry::RecipeMenuEntry(Recipe *recipe) : RenderObject(), recipe(recipe text->scale = Vector(0.8, 0.8); text->position = Vector(100*c, 0); //-20 - std::string typeName = recipe->types[i].typeName; + std::string typeName = dsq->continuity.getIngredientDisplayName(recipe->types[i].typeName); - int loc = typeName.find("Type"); - if (loc != std::string::npos) - { - typeName = typeName.substr(0, loc) + typeName.substr(loc+4, typeName.size()); - } - - - if (typeName != "Anything") - typeName = std::string("Any\n") + typeName; + if (recipe->types[i].type != IT_ANYTHING) + typeName = dsq->continuity.stringBank.get(2031) + "\n" + typeName; else typeName = std::string("\n") + typeName; diff --git a/Aquaria/ScriptInterface.cpp b/Aquaria/ScriptInterface.cpp index 673348e..974ffe5 100644 --- a/Aquaria/ScriptInterface.cpp +++ b/Aquaria/ScriptInterface.cpp @@ -988,6 +988,14 @@ luaFunc(obj_setTexture) luaReturnNil(); } +luaFunc(obj_getTexture) +{ + RenderObject *r = robj(L); + if (r && r->texture) + luaReturnStr(r->texture->name.c_str()); + luaReturnStr(""); +} + luaFunc(obj_delete) { RenderObject *r = robj(L); @@ -1490,6 +1498,7 @@ luaFunc(quad_setHeight) RO_FUNC(getter, prefix, internalOffset ) \ RO_FUNC(getter, prefix, getInternalOffset) \ RO_FUNC(getter, prefix, getPosition ) \ + RO_FUNC(getter, prefix, getTexture ) \ RO_FUNC(getter, prefix, x ) \ RO_FUNC(getter, prefix, y ) \ RO_FUNC(getter, prefix, setBlendType ) \ @@ -5755,6 +5764,33 @@ luaFunc(entity_pullEntities) luaReturnNil(); } +// Note that this overrides the generic obj_delete function for entities. +// (It's registered as "entity_delete" to Lua) +// There is at least one known case where this is necessary: +// Avatar::pullTarget does a life check to drop the pointer; +// If it's instantly deleted, this will cause a crash. +luaFunc(entity_delete_override) +{ + Entity *e = entity(L); + if (e) + { + float time = lua_tonumber(L, 2); + if (time == 0) + { + e->alpha = 0; + e->setLife(0); + e->setDecayRate(1); + } + else + { + e->fadeAlphaWithLife = true; + e->setLife(1); + e->setDecayRate(1.0f/time); + } + } + luaReturnInt(0); +} + luaFunc(entity_isRidingOnEntity) { Entity *e = entity(L); @@ -8047,6 +8083,7 @@ static const struct { // -- overrides / special cases-- {"bone_getPosition", l_bone_getWorldPosition}, + { "entity_delete", l_entity_delete_override }, // -- deprecated/compatibility related functions below here -- diff --git a/Aquaria/StatsAndAchievements.cpp b/Aquaria/StatsAndAchievements.cpp index cb39565..67bb01e 100644 --- a/Aquaria/StatsAndAchievements.cpp +++ b/Aquaria/StatsAndAchievements.cpp @@ -174,7 +174,7 @@ void StatsAndAchievements::RunFrame() VFILE *io = NULL; // Get generic achievement data... - std::string fname = dsq->user.localisePath("data/achievements.txt"); + std::string fname = localisePath("data/achievements.txt"); io = vfopen(fname.c_str(), "r"); char line[1024]; for (size_t i = 0; i < max_achievements; i++) diff --git a/Aquaria/StringBank.cpp b/Aquaria/StringBank.cpp index 42f5e10..7fe20d9 100644 --- a/Aquaria/StringBank.cpp +++ b/Aquaria/StringBank.cpp @@ -28,11 +28,17 @@ void StringBank::load() { stringMap.clear(); - std::string fname = dsq->user.localisePath("data/stringbank.txt"); + // First, load the default string banks + _load("data/stringbank.txt"); + if (dsq->mod.isActive()) + _load(dsq->mod.getPath() + "stringbank.txt"); + + // Then, load localized ones. If some entries in these are missing, the default for each is taken. + std::string fname = localisePath("data/stringbank.txt"); _load(fname); if (dsq->mod.isActive()) { - fname = dsq->user.localisePath(dsq->mod.getPath() + "stringbank.txt", dsq->mod.getPath()); + fname = localisePath(dsq->mod.getPath() + "stringbank.txt", dsq->mod.getPath()); _load(fname); } } diff --git a/Aquaria/SubtitlePlayer.cpp b/Aquaria/SubtitlePlayer.cpp index c6469b6..6a5f89e 100644 --- a/Aquaria/SubtitlePlayer.cpp +++ b/Aquaria/SubtitlePlayer.cpp @@ -46,7 +46,7 @@ void SubtitlePlayer::go(const std::string &subs) if (dsq->mod.isActive()) { f = dsq->mod.getPath() + "audio/" + subs + ".txt"; - f = dsq->user.localisePath(f, dsq->mod.getPath()); + f = localisePath(f, dsq->mod.getPath()); f = core->adjustFilenameCase(f); if (exists(f)) checkAfter = false; @@ -55,7 +55,7 @@ void SubtitlePlayer::go(const std::string &subs) if (checkAfter) { f = "scripts/vox/" + subs + ".txt"; - f = dsq->user.localisePath(f); + f = localisePath(f); f = core->adjustFilenameCase(f); if (!exists(f)) { diff --git a/Aquaria/UserSettings.cpp b/Aquaria/UserSettings.cpp index a846737..f90af3c 100644 --- a/Aquaria/UserSettings.cpp +++ b/Aquaria/UserSettings.cpp @@ -28,31 +28,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "../ExternalLibs/tinyxml.h" #endif -#ifdef BBGE_BUILD_WINDOWS - #define WIN32_LEAN_AND_MEAN - #include -#endif - -#ifdef BBGE_BUILD_UNIX - #include - #include - #include -#endif - -#ifdef BBGE_BUILD_MACOSX - #include - #include - #include - -// veeery clunky. -static std::string _CFToStdString(CFStringRef cs) -{ - char buf[1024]; - CFStringGetCString(cs, &buf[0], 2048, kCFStringEncodingUTF8); - return &buf[0]; -} - -#endif void UserSettings::save() { @@ -74,13 +49,11 @@ void UserSettings::save() } xml_system.InsertEndChild(xml_debugLog); - if (!system.isSystemLocale) { - TiXmlElement xml_locale("Locale"); - { - xml_locale.SetAttribute("name", system.locale); - } - xml_system.InsertEndChild(xml_locale); + TiXmlElement xml_locale("Locale"); + { + xml_locale.SetAttribute("name", system.locale); } + xml_system.InsertEndChild(xml_locale); } doc.InsertEndChild(xml_system); @@ -555,14 +528,11 @@ void UserSettings::load(bool doApply, const std::string &overrideFile) TiXmlElement *xml_net = doc.FirstChildElement("Network"); if (xml_net) { - network.masterServer = xml_net->Attribute("masterServer"); + const char *serv = xml_net->Attribute("masterServer"); + if (serv) + network.masterServer = serv; } - if (system.locale.empty()) - getSystemLocale(); - else - debugLog("use user config locale: " + system.locale); - //clearInputCodeMap(); if (doApply) @@ -603,93 +573,19 @@ void UserSettings::apply() dsq->bindInput(); core->settings.prebufferSounds = audio.prebuffer; -#endif -} -std::string UserSettings::localisePath(const std::string &path, const std::string &modpath) -{ if (system.locale.empty()) - return path; - - const std::string fname = path.substr(modpath.length()); - - /* we first try with complete locale name, i.e "locales/en_US/" */ - std::string localisedPath = modpath + "locales/" + system.locale + "/" + fname; - - if (exists(localisedPath.c_str())) - return localisedPath; - - /* ok didn't work, let's retry with only language part of locale name, i.e "locales/en/" */ - const size_t found = system.locale.find('_'); - - /* hmm, seems like we didn't have a full locale name anyway, use original path */ - if (found == string::npos) - return path; - - localisedPath = modpath + "locales/" + system.locale.substr(0,found) + "/" + fname; - - /* hooray we found a file! */ - if (exists(localisedPath.c_str())) - return localisedPath; - - /* seems like we don't have a localized version of the file available, use original path */ - return path; -} - -void UserSettings::getSystemLocale() -{ - system.isSystemLocale = true; - -#ifdef BBGE_BUILD_WINDOWS - LCID lcid = GetThreadLocale(); - - char buf[100]; - char ctry[100]; - - if (GetLocaleInfo(lcid, LOCALE_SISO639LANGNAME, buf, sizeof buf) != 0) { - system.locale = buf; - - if (GetLocaleInfo(lcid, LOCALE_SISO3166CTRYNAME, ctry, sizeof ctry) != 0) - { - system.locale += "_"; - system.locale += ctry; - } + std::string loc = getSystemLocale(); + debugLog("Using autodetected system locale: " + loc); + setUsedLocale(loc); } -#elif BBGE_BUILD_MACOSX - CFLocaleRef locale = CFLocaleCopyCurrent(); - CFStringRef buf; - - if ((buf = (CFStringRef)CFLocaleGetValue(locale, kCFLocaleLanguageCode)) != NULL) - { - system.locale = _CFToStdString(buf); - CFRelease(buf); - - if ((buf = (CFStringRef)CFLocaleGetValue(locale, kCFLocaleCountryCode)) != NULL) - { - system.locale += "_"; - system.locale += _CFToStdString(buf); - CFRelease(buf); - } - } - - CFRelease(locale); - -#else - const char *lang = (const char *)getenv("LANG"); - - if (lang && *lang) - { - system.locale = lang; - - size_t found = system.locale.find('.'); - - if (found != string::npos) - system.locale.resize(found); - } -#endif - if (system.locale.empty()) - debugLog("could not establish system locale"); else - debugLog("use system locale: " + system.locale); + { + debugLog("Using user config locale: " + system.locale); + setUsedLocale(system.locale); + } + +#endif } + diff --git a/Aquaria/UserSettings.h b/Aquaria/UserSettings.h index 6be8e60..e152033 100644 --- a/Aquaria/UserSettings.h +++ b/Aquaria/UserSettings.h @@ -77,9 +77,8 @@ class UserSettings public: struct System { - System() { debugLogOn = 0; isSystemLocale = false; } + System() { debugLogOn = 0; } int debugLogOn; - bool isSystemLocale; std::string locale; } system; @@ -182,8 +181,4 @@ public: void load(bool doApply=true, const std::string &overrideFile=""); void save(); void apply(); - std::string localisePath(const std::string &path, const std::string &modpath=""); - -private: - void getSystemLocale(); }; diff --git a/BBGE/Base.cpp b/BBGE/Base.cpp index 7d2d4e6..29ac097 100644 --- a/BBGE/Base.cpp +++ b/BBGE/Base.cpp @@ -141,7 +141,7 @@ unsigned hash(const std::string &string) unsigned hash = 5381; for (int i = 0; i < string.size(); i++) - hash = ((hash << 5) + hash) + string[i]; + hash = ((hash << 5) + hash) + (unsigned char)string[i]; return hash; } @@ -197,26 +197,32 @@ bool isVectorInRect(const Vector &vec, const Vector &coord1, const Vector &coord return (vec.x > coord1.x && vec.x < coord2.x && vec.y > coord1.y && vec.y < coord2.y); } +static char charToUpper(char c) +{ + if (c >= 'a' && c <= 'z') c = c - 'a' + 'A'; + if ((unsigned char)c >= 0xE0 && (unsigned char)c <= 0xFF) + c = c - 0xE0 + 0xC0; + return c; +} + +static char charToLower(char c) +{ + if (c >= 'A' && c <= 'Z') c = c-'A' + 'a'; + if ((unsigned char)c >= 0xC0 && (unsigned char)c <= 0xDF) + c = c-0xC0+0xE0; + return c; +} + void stringToUpper(std::string &s) { for (int i = 0; i < s.size(); i++) - { - if (s[i] >= 'a' && s[i] <= 'z') - { - s[i] = s[i]-'a' + 'A'; - } - } + s[i] = charToUpper(s[i]); } void stringToLower(std::string &s) { for (int i = 0; i < s.size(); i++) - { - if (s[i] >= 'A' && s[i] <= 'Z') - { - s[i] = s[i]-'A' + 'a'; - } - } + s[i] = charToLower(s[i]); } void stringToLowerUserData(std::string &s) @@ -246,9 +252,9 @@ int nocasecmp(const std::string &s1, const std::string &s2) //stop when either string's end has been reached while ( (it1!=s1.end()) && (it2!=s2.end()) ) { - if(::toupper(*it1) != ::toupper(*it2)) //letters differ? + if(charToUpper(*it1) != charToUpper(*it2)) //letters differ? // return -1 to indicate smaller than, 1 otherwise - return (::toupper(*it1) < ::toupper(*it2)) ? -1 : 1; + return (charToUpper(*it1) < charToUpper(*it2)) ? -1 : 1; //proceed to the next character in each string ++it1; ++it2; @@ -261,18 +267,6 @@ int nocasecmp(const std::string &s1, const std::string &s2) } #endif // #if !HAVE_STRCASECMP -std::string upperCase(const std::string &s1) -{ - std::string ret; - std::string::const_iterator it1=s1.begin(); - while (it1 != s1.end()) - { - ret += ::toupper(*it1); - ++it1; - } - return ret; -} - bool exists(const std::string &f, bool makeFatal, bool skipVFS) { bool e = false; diff --git a/BBGE/Base.h b/BBGE/Base.h index 5a09f74..345065c 100644 --- a/BBGE/Base.h +++ b/BBGE/Base.h @@ -139,6 +139,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "math.h" #include "FileAPI.h" +#ifdef BBGE_BUILD_LINUX +# include +# include +#endif + // dumb win32 includes/defines cleanup #undef GetCharWidth @@ -220,7 +225,6 @@ static inline int nocasecmp(const char *s1, const char *s2) #else int nocasecmp(const std::string &s1, const std::string &s2); #endif -std::string upperCase(const std::string &s1); Vector getNearestPointOnLine(Vector start, Vector end, Vector point); bool isTouchingLine(Vector lineStart, Vector lineEnd, Vector point, int radius=1, Vector* closest=0); void sizePowerOf2Texture(int &v); diff --git a/BBGE/Core.cpp b/BBGE/Core.cpp index ccf67f5..68d7c4f 100644 --- a/BBGE/Core.cpp +++ b/BBGE/Core.cpp @@ -1903,6 +1903,7 @@ bool Core::initGraphicsLibrary(int width, int height, bool fullscreen, int vsync // putenv(), which takes a (char *), and freaks out newer GCC releases // when you try to pass a (const!) string literal here... --ryan. SDL_putenv((char *) "SDL_VIDEO_CENTERED=1"); + SDL_putenv((char *) "LIBGL_DEBUG=verbose"); // temp, to track errors on linux with nouveau drivers. if (recreate) { diff --git a/BBGE/Core.h b/BBGE/Core.h index 79e0d1a..2d62bda 100644 --- a/BBGE/Core.h +++ b/BBGE/Core.h @@ -39,6 +39,7 @@ BUILD_LINUX #include "Flags.h" //#include "Scripting.h" #include "Effects.h" +#include "Localization.h" #include "DarkLayer.h" diff --git a/BBGE/Joystick.cpp b/BBGE/Joystick.cpp index 1958713..f4e6e01 100644 --- a/BBGE/Joystick.cpp +++ b/BBGE/Joystick.cpp @@ -18,6 +18,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + #include "Core.h" #if defined(BBGE_BUILD_WINDOWS) && defined(BBGE_BUILD_XINPUT) @@ -68,6 +69,8 @@ bool tryXInput() #ifdef __LINUX__ #include +#include +#include #include #include #include diff --git a/BBGE/Localization.cpp b/BBGE/Localization.cpp new file mode 100644 index 0000000..5558e3b --- /dev/null +++ b/BBGE/Localization.cpp @@ -0,0 +1,120 @@ +#include "Localization.h" + +#ifdef BBGE_BUILD_WINDOWS +#define WIN32_LEAN_AND_MEAN +#include +#endif + +#ifdef BBGE_BUILD_UNIX +#include +#include +#include +#endif + +#ifdef BBGE_BUILD_MACOSX +#include +#include +#include + +// veeery clunky. +static std::string _CFToStdString(CFStringRef cs) +{ + char buf[1024]; + CFStringGetCString(cs, &buf[0], 1024, kCFStringEncodingUTF8); + return &buf[0]; +} +#endif + +static std::string s_locale; + +void setUsedLocale(const std::string& s) +{ + s_locale = s; +} + +std::string localisePath(const std::string &path, const std::string &modpath /* = "" */) +{ + if (s_locale.empty()) + return path; + + const std::string fname = path.substr(modpath.length()); + + /* we first try with complete locale name, i.e "locales/en_US/" */ + std::string localisedPath = modpath + "locales/" + s_locale + "/" + fname; + + if (exists(localisedPath.c_str())) + return localisedPath; + + /* ok didn't work, let's retry with only language part of locale name, i.e "locales/en/" */ + const size_t found = s_locale.find('_'); + + /* hmm, seems like we didn't have a full locale name anyway, use original path */ + if (found == std::string::npos) + return path; + + localisedPath = modpath + "locales/" + s_locale.substr(0,found) + "/" + fname; + + /* hooray we found a file! */ + if (exists(localisedPath.c_str())) + return localisedPath; + + /* seems like we don't have a localized version of the file available, use original path */ + return path; +} + +std::string getSystemLocale() +{ + std::string localeStr; + +#ifdef BBGE_BUILD_WINDOWS + LCID lcid = GetThreadLocale(); + + char buf[100]; + char ctry[100]; + + if (GetLocaleInfo(lcid, LOCALE_SISO639LANGNAME, buf, sizeof buf) != 0) + { + localeStr = buf; + + if (GetLocaleInfo(lcid, LOCALE_SISO3166CTRYNAME, ctry, sizeof ctry) != 0) + { + localeStr += "_"; + localeStr += ctry; + } + } +#elif BBGE_BUILD_MACOSX + CFLocaleRef locale = CFLocaleCopyCurrent(); + CFStringRef buf; + + if ((buf = (CFStringRef)CFLocaleGetValue(locale, kCFLocaleLanguageCode)) != NULL) + { + localeStr = _CFToStdString(buf); + CFRelease(buf); + + if ((buf = (CFStringRef)CFLocaleGetValue(locale, kCFLocaleCountryCode)) != NULL) + { + localeStr += "_"; + localeStr += _CFToStdString(buf); + CFRelease(buf); + } + } + + CFRelease(locale); + +#else + const char *lang = (const char *)getenv("LANG"); + + if (lang && *lang) + { + localeStr = lang; + + size_t found = localeStr.find('.'); + + if (found != string::npos) + localeStr.resize(found); + } +#endif + + return localeStr; +} + diff --git a/BBGE/Localization.h b/BBGE/Localization.h new file mode 100644 index 0000000..0b67301 --- /dev/null +++ b/BBGE/Localization.h @@ -0,0 +1,10 @@ +#ifndef LOCALIZATION_H +#define LOCALIZATION_H + +#include "Base.h" + +void setUsedLocale(const std::string& s); +std::string localisePath(const std::string &path, const std::string &modpath = ""); +std::string getSystemLocale(); + +#endif diff --git a/BBGE/SoundManager.cpp b/BBGE/SoundManager.cpp index b5a5ae8..e35c419 100644 --- a/BBGE/SoundManager.cpp +++ b/BBGE/SoundManager.cpp @@ -18,8 +18,9 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "SoundManager.h" + #include "Core.h" +#include "SoundManager.h" #include "Base.h" #include "PackRead.h" diff --git a/BBGE/Texture.cpp b/BBGE/Texture.cpp index 7951a40..bb74f46 100644 --- a/BBGE/Texture.cpp +++ b/BBGE/Texture.cpp @@ -195,22 +195,10 @@ int Texture::getPixelWidth() { #ifdef BBGE_BUILD_OPENGL int w = 0, h = 0; - glBindTexture(GL_TEXTURE_2D, textures[0]); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h); - //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPONENTS, &c);// assume 4 - unsigned int size = w*h*4; - if (!size || w <= 0 || h <= 0) - return 0; - - unsigned char *data = (unsigned char*)malloc(size*sizeof(char)); + unsigned int size = 0; + unsigned char *data = getBufferAndSize(&w, &h, &size); if (!data) - { - debugLog("Texture::getPixelWidth() malloc failed"); return 0; - } - - glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); int smallestx = -1, largestx = -1; for (unsigned int x = 0; x < unsigned(w); x++) @@ -227,7 +215,6 @@ int Texture::getPixelWidth() } } } - glBindTexture(GL_TEXTURE_2D, 0); free(data); return largestx - smallestx; #elif defined(BBGE_BUILD_DIRECTX) @@ -239,20 +226,11 @@ int Texture::getPixelHeight() { #ifdef BBGE_BUILD_OPENGL int w = 0, h = 0; - glBindTexture(GL_TEXTURE_2D, textures[0]); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h); - //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPONENTS, &c);// assume 4 - unsigned int size = w*h*4; - if (!size || w <= 0 || h <= 0) - return 0; - unsigned char *data = (unsigned char*)malloc(size*sizeof(char)); + unsigned int size = 0; + unsigned char *data = getBufferAndSize(&w, &h, &size); if (!data) - { - debugLog("Texture::getPixelHeight() malloc failed"); return 0; - } - glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + int smallesty = -1, largesty = -1; for (unsigned int x = 0; x < unsigned(w); x++) { @@ -268,7 +246,6 @@ int Texture::getPixelHeight() } } } - glBindTexture(GL_TEXTURE_2D, 0); free(data); return largesty - smallesty; #elif defined(BBGE_BUILD_DIRECTX) @@ -304,9 +281,6 @@ void Texture::load(std::string file) return; } - stringToLowerUserData(file); - file = core->adjustFilenameCase(file); - loadName = file; repeating = false; @@ -321,26 +295,28 @@ void Texture::load(std::string file) pos = std::string::npos; } - if (core->debugLogTextures) + /*if (core->debugLogTextures) { std::ostringstream os; os << "pos [" << pos << "], file :" << file; debugLog(os.str()); + }*/ + + bool found = exists(file); + + if(!found && exists(file + ".png")) + { + found = true; + file += ".png"; } - bool found = exists(file); - - if(!found && exists(file + ".png")) - { - found = true; - file += ".png"; - } - - // .tga/.zga are never used as game graphics anywhere except save slot thumbnails. - // if so, their file names are passed exact, not with a missing extension + // .tga/.zga are never used as game graphics anywhere except save slot thumbnails. + // if so, their file names are passed exact, not with a missing extension if (found) { + file = localisePath(file); + /* std::ostringstream os; os << "Loading texture [" << file << "]"; @@ -827,3 +803,86 @@ ImageTGA *Texture::TGAloadMem(void *mem, int size) return pImageData; } +// ceil to next power of 2 +static unsigned int clp2(unsigned int x) +{ + --x; + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x + 1; +} + +unsigned char * Texture::getBufferAndSize(int *wparam, int *hparam, unsigned int *sizeparam) +{ + unsigned char *data = NULL; + unsigned int size = 0; + int tw = 0, th = 0; + int w = 0, h = 0; + + // This can't happen. If it does we're doomed. + if(width <= 0 || height <= 0) + goto fail; + + glBindTexture(GL_TEXTURE_2D, textures[0]); + + // As returned by graphics driver + + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h); + + // As we know it - but round to nearest power of 2 - OpenGL does this internally anyways. + tw = clp2(width); // known to be > 0. + th = clp2(height); + + if (w != tw || h != th) + { + std::ostringstream os; + os << "Texture::getBufferAndSize() WARNING: width/height disagree: "; + os << "Driver says (" << w << ", " << h << "); "; + os << "Texture says (" << width << ", " << height << "); "; + os << "Rounded to (" << tw << ", " << th << ")"; + debugLog(os.str()); + // choose max. for size calculation + w = w > tw ? w : tw; + h = h > th ? h : th; + } + + size = w * h * 4; + if (!size) + goto fail; + + data = (unsigned char*)malloc(size + 32); + if (!data) + { + std::ostringstream os; + os << "Game::fillGridFromQuad allocation failure, size = " << size; + errorLog(os.str()); + goto fail; + } + memcpy(data + size, "SAFE", 5); + glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + glBindTexture(GL_TEXTURE_2D, 0); + + // Not sure but this might be the case with nouveau drivers on linux... still investigating. -- fg + if(memcmp(data + size, "SAFE", 5)) + { + errorLog("Texture::getBufferAndSize(): Broken graphics driver! Wrote past end of buffer!"); + free(data); // in case we are here, this will most likely cause a crash. + goto fail; + } + + *wparam = w; + *hparam = h; + *sizeparam = size; + return data; + + +fail: + *wparam = 0; + *hparam = 0; + *sizeparam = 0; + return NULL; +} diff --git a/BBGE/Texture.h b/BBGE/Texture.h index c2de4bd..68b43fc 100644 --- a/BBGE/Texture.h +++ b/BBGE/Texture.h @@ -80,6 +80,9 @@ public: void write(int tx, int ty, int w, int h, const unsigned char *pixels); void read(int tx, int ty, int w, int h, unsigned char *pixels); + + unsigned char *getBufferAndSize(int *w, int *h, unsigned int *size); // returned memory must be free()'d + protected: std::string loadName; diff --git a/CMakeLists.txt b/CMakeLists.txt index 986363a..aba0839 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -386,6 +386,7 @@ SET(BBGE_SRCS ${BBGEDIR}/Interpolator.cpp ${BBGEDIR}/Joystick.cpp ${BBGEDIR}/LensFlare.cpp + ${BBGEDIR}/Localization.cpp ${BBGEDIR}/Math.cpp ${BBGEDIR}/MT.cpp ${BBGEDIR}/ParticleEffect.cpp diff --git a/ExternalLibs/ByteBuffer.h b/ExternalLibs/ByteBuffer.h index e5b6ed6..377eede 100644 --- a/ExternalLibs/ByteBuffer.h +++ b/ExternalLibs/ByteBuffer.h @@ -240,7 +240,6 @@ public: BB_MAKE_WRITE_OP(uint64); BB_MAKE_WRITE_OP(float); BB_MAKE_WRITE_OP(double); - BB_MAKE_WRITE_OP(int); ByteBuffer &operator<<(bool value) { @@ -271,7 +270,6 @@ public: BB_MAKE_READ_OP(uint64); BB_MAKE_READ_OP(float); BB_MAKE_READ_OP(double); - BB_MAKE_READ_OP(int); ByteBuffer &operator>>(bool &value) { diff --git a/ExternalLibs/glfont2/glfont2.cpp b/ExternalLibs/glfont2/glfont2.cpp index 6c59e26..56b5abe 100644 --- a/ExternalLibs/glfont2/glfont2.cpp +++ b/ExternalLibs/glfont2/glfont2.cpp @@ -47,7 +47,7 @@ GLFont::~GLFont () //******************************************************************* bool GLFont::Create (const char *file_name, int tex, bool loadTexture) { - int num_chars, num_tex_bytes; + ByteBuffer::uint32 num_chars, num_tex_bytes; char *tex_bytes; //Destroy the old font if there was one, just to be safe @@ -74,16 +74,14 @@ bool GLFont::Create (const char *file_name, int tex, bool loadTexture) vfclose(fh); #endif - int dummy; - // Read the header from file header.tex = tex; - bb >> dummy; // skip tex field - bb >> header.tex_width; - bb >> header.tex_height; - bb >> header.start_char; - bb >> header.end_char; - bb >> dummy; // skip chars field + bb.skipRead(4); // skip tex field + header.tex_width = bb.read(); + header.tex_height = bb.read(); + header.start_char = bb.read(); + header.end_char = bb.read(); + bb.skipRead(4); // skip chars field //Allocate space for character array num_chars = header.end_char - header.start_char + 1; @@ -91,7 +89,7 @@ bool GLFont::Create (const char *file_name, int tex, bool loadTexture) return false; //Read character array - for (int i = 0; i < num_chars; i++) + for (unsigned int i = 0; i < num_chars; i++) { bb >> header.chars[i].dx; bb >> header.chars[i].dy; @@ -104,8 +102,8 @@ bool GLFont::Create (const char *file_name, int tex, bool loadTexture) //Read texture pixel data num_tex_bytes = header.tex_width * header.tex_height * 2; tex_bytes = new char[num_tex_bytes]; - //input.read(tex_bytes, num_tex_bytes); - bb.read(tex_bytes, num_tex_bytes); + // HACK: Aquaria uses override textures, so we can live with the truncation. + bb.read(tex_bytes, std::min(num_tex_bytes, bb.readable())); //Build2DMipmaps(3, header.tex_width, header.tex_height, GL_UNSIGNED_BYTE, tex_bytes, 1); @@ -197,7 +195,7 @@ int GLFont::GetEndChar (void) return header.end_char; } //******************************************************************* -void GLFont::GetCharSize (int c, std::pair *size) +void GLFont::GetCharSize (unsigned int c, std::pair *size) { //Make sure character is in range if (c < header.start_char || c > header.end_char) @@ -218,7 +216,7 @@ void GLFont::GetCharSize (int c, std::pair *size) } } //******************************************************************* -int GLFont::GetCharWidth (int c) +int GLFont::GetCharWidth (unsigned int c) { //Make sure in range if (c < header.start_char || c > header.end_char) @@ -242,7 +240,7 @@ int GLFont::GetCharWidth (int c) } } //******************************************************************* -int GLFont::GetCharHeight (int c) +int GLFont::GetCharHeight (unsigned int c) { //Make sure in range if (c < header.start_char || c > header.end_char) @@ -268,7 +266,7 @@ void GLFont::Begin (void) void GLFont::GetStringSize (const std::string &text, std::pair *size) { unsigned int i; - char c; + unsigned char c; GLFontChar *glfont_char; float width; @@ -282,7 +280,7 @@ void GLFont::GetStringSize (const std::string &text, std::pair *size) for (i = 0; i < text.size(); i++) { //Make sure character is in range - c = (char)text[i]; + c = (unsigned char)text[i]; if (c < header.start_char || c > header.end_char) continue; diff --git a/ExternalLibs/glfont2/glfont2.h b/ExternalLibs/glfont2/glfont2.h index c56fb5c..b2dc491 100644 --- a/ExternalLibs/glfont2/glfont2.h +++ b/ExternalLibs/glfont2/glfont2.h @@ -36,9 +36,9 @@ private: //glFont header structure struct { - int tex; - int tex_width, tex_height; - int start_char, end_char; + unsigned int tex; + unsigned int tex_width, tex_height; + unsigned int start_char, end_char; GLFontChar *chars; } header; @@ -70,9 +70,9 @@ public: int GetEndChar (void); //Character size retrieval methods - void GetCharSize (int c, std::pair *size); - int GetCharWidth (int c); - int GetCharHeight (int c); + void GetCharSize (unsigned int c, std::pair *size); + int GetCharWidth (unsigned int c); + int GetCharHeight (unsigned int c); void GetStringSize (const std::string &text, std::pair *size); diff --git a/ExternalLibs/minihttp.h b/ExternalLibs/minihttp.h index 443ef4b..4232d2a 100644 --- a/ExternalLibs/minihttp.h +++ b/ExternalLibs/minihttp.h @@ -14,9 +14,12 @@ // ------------------------- - #include +#ifndef _WIN32 +# include +#endif + namespace minihttp { diff --git a/files/data/ingredientnames.txt b/files/data/ingredientnames.txt new file mode 100644 index 0000000..0a95a37 --- /dev/null +++ b/files/data/ingredientnames.txt @@ -0,0 +1,89 @@ +Anything Anything +ArcanePoultice Arcane Poultice +Berry Berry +BerryIceCream Berry Ice Cream +Bulb Bulb +ButterySeaLoaf Buttery Sea Loaf +Cake Cake +ColdBorscht Cold Borscht +ColdSoup Cold Soup +CrabCake Crab Cake +CrabMeat Crab Meat +DivineSoup Divine Soup +DumboIceCream Dumbo Ice Cream +EelOil Eel Oil +Egg Egg +FishMeat Fish Meat +FishOil Fish Oil +GlowingEgg Glowing Egg +HandRoll Hand Roll +HealingPoultice Healing Poultice +HeartySoup Hearty Soup +HotBorscht Hot Borscht +HotSoup Hot Soup +IceChunk Ice Chunk +IceCream Ice Cream +JellyOil Jelly Oil +LeadershipRoll Leadership Roll +Leaf Leaf +LeafPoultice Leaf Poultice +LeechingPoultice Leeching Poultice +LegendaryCake Legendary Cake +Loaf Loaf +LoafOfLife Loaf Of Life +LongLifeSoup Long Life Soup +MagicSoup Magic Soup +Meat Meat +Mushroom Mushroom +Oil Oil +Part Part +Perogi Perogi +PerogiType Perogi +PlantBulb Plant Bulb +PlantLeaf Plant Leaf +PlumpPerogi Plump Perogi +PoisonLoaf Poison Loaf +PoisonSoup Poison Soup +Poultice Poultice +RainbowMushroom Rainbow Mushroom +RainbowSoup Rainbow Soup +RedBerry Red Berry +RedBulb Red Bulb +Roll Roll +RottenCake Rotten Cake +RottenLoaf Rotten Loaf +RottenMeat Rotten Meat +RoyalSoup Royal Soup +RubberyMeat Rubbery Meat +RukhEgg Rukh Egg +SeaCake Sea Cake +SeaLoaf Sea Loaf +SharkFin Shark Fin +SharkFinSoup Shark Fin Soup +SightPoultice Sight Poultice +SmallBone Small Bone +SmallEgg Small Egg +SmallEye Small Eye +SmallTentacle Small Tentacle +Soup Soup +SpecialBulb Special Bulb +SpecialCake Special Cake +SpicyMeat Spicy Meat +SpicyRoll Spicy Roll +SpicySoup Spicy Soup +SpiderEgg Spider Egg +SpiderRoll Spider Roll +SwampCake Swamp Cake +SwordfishSteak Swordfish Steak +TastyCake Tasty Cake +TastyRoll Tasty Roll +ToughCake Tough Cake +TurtleMeat Turtle Meat +TurtleSoup Turtle Soup +Vedha'sCure-All Vedha's Cure- All +VedhaSeaCrisp Vedha Sea Crisp +VeggieCake Veggie Cake +VeggieIceCream Veggie Ice Cream +VeggieSoup Veggie Soup +VolcanoRoll Volcano Roll +Zuuna'sPerogi Zuuna's Perogi diff --git a/files/data/stringbank.txt b/files/data/stringbank.txt index 4000185..21df031 100644 --- a/files/data/stringbank.txt +++ b/files/data/stringbank.txt @@ -204,3 +204,5 @@ 2028 |Browse & enable/disable installed patches 2029 |Browse mods online 2030 |Return to title +2031 Any +2032 [Achievements] \ No newline at end of file diff --git a/files/locales/ru/data/font-small.glf b/files/locales/ru/data/font-small.glf new file mode 100644 index 0000000..c1a60df Binary files /dev/null and b/files/locales/ru/data/font-small.glf differ diff --git a/files/locales/ru/data/font.ttf b/files/locales/ru/data/font.ttf new file mode 100644 index 0000000..fba0082 Binary files /dev/null and b/files/locales/ru/data/font.ttf differ diff --git a/files/locales/ru/data/help_bindsong.txt b/files/locales/ru/data/help_bindsong.txt new file mode 100644 index 0000000..1a8de16 --- /dev/null +++ b/files/locales/ru/data/help_bindsong.txt @@ -0,0 +1,2 @@ +[Связующая песня] +Эта песня позволяет Найе поднимать и двигать округлые предметы, например камни. Спойте эту песню рядом с подходящим предметом, и он будет следовать за Найей, куда бы она ни отправилась. \ No newline at end of file diff --git a/files/locales/ru/data/help_end.txt b/files/locales/ru/data/help_end.txt new file mode 100644 index 0000000..391a07b --- /dev/null +++ b/files/locales/ru/data/help_end.txt @@ -0,0 +1,4 @@ +[Дополнительная помощь] +Если вы окончательно запутались и не знаете, что делать дальше, загляните на форум aquaria.su и попросите совета у других игроков. :-) + +~ Это все советы, которые могут вам пригодиться на данный момент. Удачи! ~ diff --git a/files/locales/ru/data/help_end_mac.txt b/files/locales/ru/data/help_end_mac.txt new file mode 100644 index 0000000..71f4780 --- /dev/null +++ b/files/locales/ru/data/help_end_mac.txt @@ -0,0 +1,4 @@ +[Дополнительная помощь] +Если вы окончательно запутались и не знаете, что делать дальше, загляните на форум игры по адресу http://www.snowball.ru/forums/ или http://ambrosiasw.com/forums/ и попросите совета у других игроков. :-) + +~ Это все советы, которые могут вам пригодиться на данный момент. Удачи! ~ \ No newline at end of file diff --git a/files/locales/ru/data/help_energyform.txt b/files/locales/ru/data/help_energyform.txt new file mode 100644 index 0000000..83059e8 --- /dev/null +++ b/files/locales/ru/data/help_energyform.txt @@ -0,0 +1,5 @@ +[Форма силы] +В форме силы Найя может атаковать своих врагов. Щелкните правой кнопки мыши, и Найя поразит врага разрядом молнии, но если нажать и держать правую кнопку мыши, Найя одновременно выпустит несколько очень мощных разрядов. Есть и другие формы для атаки, попробуйте их разыскать! + +[Возвращение в естественный облик] +Чтобы Найя приняла свое естественное обличье, нажмите левую и правую кнопки мыши одновременно - или нажмите клавишу X. diff --git a/files/locales/ru/data/help_header.txt b/files/locales/ru/data/help_header.txt new file mode 100644 index 0000000..936a267 --- /dev/null +++ b/files/locales/ru/data/help_header.txt @@ -0,0 +1,3 @@ +~ Аквария: руководство и помощь ~ + +Примечание: нажмите F1, чтобы вызвать этот экран. Вы можете воспользоваться помощью в любое время, когда вы можете управлять персонажем. diff --git a/files/locales/ru/data/help_header_mac.txt b/files/locales/ru/data/help_header_mac.txt new file mode 100644 index 0000000..be76bbb --- /dev/null +++ b/files/locales/ru/data/help_header_mac.txt @@ -0,0 +1,3 @@ +~ Аквария: руководство и помощь ~ + +Примечание: нажмите {ToggleHelp:k0}, чтобы вызвать этот экран. Вы можете воспользоваться помощью в любое время, когда вы можете управлять персонажем. diff --git a/files/locales/ru/data/help_other.txt b/files/locales/ru/data/help_other.txt new file mode 100644 index 0000000..f929206 --- /dev/null +++ b/files/locales/ru/data/help_other.txt @@ -0,0 +1,2 @@ +[Другие песни и обличья] +В водах Акварии вы найдете множество песен и новых обличий. Вам придется узнавать об их возможностях самостоятельно. diff --git a/files/locales/ru/data/help_start.txt b/files/locales/ru/data/help_start.txt new file mode 100644 index 0000000..563e730 --- /dev/null +++ b/files/locales/ru/data/help_start.txt @@ -0,0 +1,56 @@ +[Управление] +Все действия в игре "Аквария" можно выполнить при помощи мыши. + +На клавиатуре левой кнопке мыши по умолчанию соответствует клавиша "Пробел", а правой - клавиша "Ctrl". + +[Движение] +Нажмите и держите левую кнопку мыши, чтобы плыть. Вы также можете использовать клавиши A-S-D-W или клавиши со стрелками. + +Нажмите и задержите левую кнопку мыши, отведя курсор от Найи, чтобы она сделала рывок вперед. Так Найя сможет ускользнуть от любого преследователя. Если вы играете с клавиатуры, чтобы выполнить рывок, нажмите пробел. + +Если вы нажмете кнопку мыши сразу после рывка, Найя сделает кувырок. + +Если во время рывка на пути у Найи окажется стена, то Найя ухватится за нее. Делая рывок со стены, Найя разгоняется еще сильнее. + +Зажмите левую кнопку мыши и проведите курсором вокруг Найи, и она закружится. Это не только притянет к ней легкие предметы, оказавшиеся рядом, но и создаст волну, которая тоже оказывает некоторое воздействие на окружающих. Чтобы кружиться, также можно нажать клавишу R. + +[Пение] +Нажмите и держите правую кнопку мыши или клавишу Ctrl, чтобы начать песню. + +Когда Найя поет, вокруг нее появляются восемь нот. Наведите курсор на ноту, чтобы Найя ее спела. Разные существа Акварии реагируют на пение по-разному. + +[Песни] +Во время странствий Найя найдет несколько песен. Выученные песни можно послушать в любой момент в меню игры. Песня - это определенная последовательность нот, которую надо повторять каждый раз, чтобы получить желаемый эффект. Каждая песня по-своему влияет на Найю и окружающий ее мир. + +[Взаимодействие] +С некоторыми предметами в мире Акварии Найя может взаимодействовать. При наведении на такой предмет курсор начинает светиться. Нажмите правую кнопку мыши, чтобы с таким предметом что-нибудь сделать. Среди таких предметов кухонный стол Найи, ее постель, камни, на которых Найя может сидеть, а также кристаллы для сохранения игры. + +[Сохранение игры] +Щелкните правой кнопкой мыши по красному кристаллу, чтобы вызвать меню сохраненных игр. Выберите ячейку, в которой следует сохранить ваши достижения. + +[Мини-карта] +Мини-карта отображает мир, окружающий Найю. Золотым кружком отмечена пещера, в которой живет ваша героиня. Красные кружки показывают, где находятся кристаллы сохранения. + +[Карта мира] +Двойной щелчок по мини-карте откроет карту мира. Здесь отмечены все зоны, которые вам уже известны. Щелкнув по зоне, вы увидите, какие ее части вы уже исследовали, а в каких вам еще предстоит побывать. + +Щелкнув по пирамидке в правой части экрана, вы можете поместить на карту собственную отметку. Чтобы убрать отметку, щелкните по ней правой кнопкой мыши. + +Большие круги, которые появляются на карте мира, называются маяками. Они показывают Найе новые места, которые ей предстоит посетить. Если вы запутались и не знаете, куда вам плыть дальше, попытайтесь отыскать на карте мира значок маяка. + +[Еда] +Найя может создавать вкусные блюда из самых разных ингредиентов или из уже готовых блюд. Откройте экран кулинарии, перетащите по крайней мере два ингредиента на тарелочки в правой части экрана и щелкните по кнопке "Приготовить". Вы можете в любой момент посмотреть, из чего готовится то или иное блюдо, щелкнув по кнопке "Рецепты". + +Маленькая кнопочка в верхнем левом углу экрана кулинарии позволит вам отсортировать найденные продукты. + +Чтобы съесть блюдо, дважды щелкните по нему левой кнопкой мыши или поднесите его ко рту Найи. Перетащив еду на тарелку с крестиком, вы можете выбросить ее. + +[Питомцы] +Вы можете выбрать питомца, который будет сопровождать вас, щелкнув по его икринке на экране питомцев. Если вы хотите путешествовать в одиночестве, щелкните по икринке выбранного питомца еще раз. Каждый из питомцев обладает уникальными способностями. + +[Сокровища] +Редкие и необычные предметы, которые привлекают внимание Найи, она называет сокровищами. Отыскав такой предмет, просто прикоснитесь к нему, и он окажется в коллекции Найи. Полный список находок можно в любой момент просмотреть на экране сокровищ. Щелкните по стрелочкам над сокровищами, чтобы перейти к следующей странице. + +Щелкнув по изображению сокровища, вы увидите его описание. Некоторые сокровища можно использовать. Для этого щелкните по соответствующей кнопке на этом же экране. + +В мире Акварии спрятано немало сокровищ. Постарайтесь разыскать их все! diff --git a/files/locales/ru/data/ingredientnames.txt b/files/locales/ru/data/ingredientnames.txt new file mode 100644 index 0000000..d9df17d --- /dev/null +++ b/files/locales/ru/data/ingredientnames.txt @@ -0,0 +1,88 @@ +Anything Что угодно +ArcanePoultice Тайная припарка +Berry Ягода +BerryIceCream Ягодное мороженое +Bulb Клубень +ButterySeaLoaf Масляный морской хлеб +ColdBorscht Холодный борщ +ColdSoup Холодный суп +Cake Кекс +CrabCake Крабовый кекс +CrabMeat Крабовое мясо +DivineSoup Божественный суп +DumboIceCream Мороженое Дамбо +EelOil Жир угря +Egg Яйцо +FishMeat Мясо рыбы +FishOil Рыбий жир +GlowingEgg Светящаяся икринка +HandRoll Ручной рулет +HealingPoultice Целебная припарка +HeartySoup Суп здоровья +HotBorscht Горячий борщ +HotSoup Горячий суп +IceChunk Осколок льда +IceCream Мороженое +JellyOil Желе медузы +LeadershipRoll Рулет лидерства +Leaf Лист +LeafPoultice Припарка +LeechingPoultice Припарка высасывания +LegendaryCake Легендарный кекс +Loaf Хлеб +LoafOfLife Хлеб жизни +LongLifeSoup Суп долголетия +MagicSoup Волшебный суп +Meat Мясо +Mushroom Гриб +Oil Жир +Part Часть +Perogi Пирог +PlantBulb Клубень растения +PlantLeaf Лист растения +PlumpPerogi Пухлый пирог +PoisonLoaf Ядовитый хлеб +PoisonSoup Ядовитый суп +Poultice Припарка +RainbowMushroom Радужный гриб +RainbowSoup Радужный суп +RedBerry Красная ягода +RedBulb Красный клубень +Roll Рулет +RottenCake Гнилой кекс +RottenLoaf Гнилой хлеб +RottenMeat Тухлое мясо +RoyalSoup Королевский суп +RubberyMeat Жесткое мясо +RukhEgg Яйцо птицы Рух +SeaCake Морской кекс +SeaLoaf Морской хлеб +SharkFin Акулий плавник +SharkFinSoup Суп из акульего плавника +SightPoultice Припарка зрения +SmallBone Маленькая кость +SmallEgg Икра +SmallEye Маленький глаз +SmallTentacle Маленькое щупальце +Soup Суп +SpecialBulb Особый клубень +SpecialCake Особый кекс +SpicyMeat Пряное мясо +SpicyRoll Пряный рулет +SpicySoup Пряный суп +SpiderEgg Паучье яйцо +SpiderRoll Паучий рулет +SwampCake Болотный кекс +SwordfishSteak Стейк рыбы-меч +TastyCake Вкусный кекс +TastyRoll Вкусный рулет +ToughCake Черствый кекс +TurtleMeat Черепашье мясо +TurtleSoup Черепаший суп +Vedha'sCure-All Всеисцеляющая припарка Веды +VedhaSeaCrisp Морские чипсы Веды +VeggieCake Овощной кекс +VeggieIceCream Овощное мороженое +VeggieSoup Овощной суп +VolcanoRoll Вулканический рулет +Zuuna'sPerogi Пирог Зууны diff --git a/files/locales/ru/data/stringbank.txt b/files/locales/ru/data/stringbank.txt new file mode 100644 index 0000000..444a55f --- /dev/null +++ b/files/locales/ru/data/stringbank.txt @@ -0,0 +1,207 @@ +0 Дважды щелкните по блюду или поднесите его ко рту Найи, чтобы съесть. +1 Перетащите два или три ингредиента на тарелки и нажмите кнопку "Приготовить", чтобы создать новое блюдо. Перетащите предмет на тарелку со знаком "Х", чтобы выбросить его. Если вы готовите на кухне, то можете использовать три ингредиента вместо двух. +2 Используйте мини-карту в углу экрана, чтобы не заблудиться. Белые кружки отмечают новые зоны. Дом Найи отмечен на карте золотистым кружком. +3 Приняв облик зверя и выполнив рывок в сторону противника, вы можете укусить его. +4 Вы отыскали подсказку! Дважды щелкните по находящейся в углу экрана мини-карте, чтобы открыть карту мира. +6 Теперь вы знаете песню Ли. Спойте ее, чтобы подозвать его, если он начнет отставать. Щелкните по его водолазному шлему, чтобы оставить его здесь. +7 Спойте песню Ли, когда он находится рядом, чтобы попросить его атаковать врага. +8 Поздравляем! Вы прошли демонстрационную версию игры "Аквария". Вы сможете продолжить игру, приобретя полную версию. +9 Собирайте синие растения, чтобы восстановить здоровье Найи. +11 Найя умеет готовить вкусные блюда из найденных на дне моря ингредиентов. +12 Съев некоторых врагов, вы ненадолго получите их силу... +13 Щелкните по Найе, чтобы разжать руки, щелкните на расстоянии от нее, чтобы отпрыгнуть. +14 Здесь показаны все песни, которые выучила Найя. Наведите курсор на знак песни, чтобы увидеть, как она поется. Щелкните по знаку, чтобы услышать ее описание. +15 Щелкните по этим значкам, чтобы перевернуть страницу. +16 Сейчас на этой странице ничего нет. Может быть, позже? +17 Здесь показаны питомцы Найи. Щелкните по любому из них, чтобы он сопровождал вас. +19 НЕ ИСПОЛЬЗУЕТСЯ +20 Примите форму силы, чтобы преодолеть это препятствие +21 Чтобы открыть цветок, спойте ноту того же цвета +22 Чтобы расколоть яйцо, спойте ноту того же цвета +23 Вы выучили новый рецепт: +24 ! +26 Теперь в любом месте вы можете готовить еду на трех тарелках +27 Слишком много +28 Обведите Найю курсором, чтобы сменить ее облик в дуальной форме +29 Убивая врагов, Ли заряжает разрушительную атаку Найи +30 Вы нашли икринку Бластера! +31 Вы нашли икринку Пираньи! +32 Вы нашли икринку осьминога Неуклюжки! +33 Вы нашли икринку Наутилуса! +34 Связующая песня может снимать панцири с морских обитателей +35 Песня-щит - нажмите Esc, чтобы открыть экран песен +36 Вы выучили связующую песню +37 Вы выучили песню силы +38 Вы выучили песню зверя +39 Вы выучили песню рыбы +40 Вы выучили древесную песню +41 Вы выучили песню солнца +42 Вы выучили песню Ли +43 Вы выучили песню двойной формы +44 Вы выучили песню духа +50 Связующей песнью можно двигать камни и вытягивать растения +51 Неподвижных тритонов можно убирать связующей песнью +60 ===WINDOWS/LINUX HINTS START=== +61 Удерживайте левую кнопку мыши или нажмите пробел, чтобы плыть +62 Щелкните по Найе правой кнопкой мыши и держите ее, чтобы запеть +63 В форме силы щелкните правой кнопкой по врагу, чтобы прицелиться. +64 Зажмите правую кнопку, чтобы создавать семена в древесном облике +65 Для водоворота зажмите левую кнопку, вращая курсор вокруг Найи +66 Щелкните левой и правой кнопками по Найе, чтобы пройти +67 Зажмите среднюю кнопку мыши или кнопку E, чтобы осмотреться +68 Чтобы что-то сделать с предметом, щелкните правой кнопкой мыши +69 В форме силы зажмите правую кнопку, чтобы нанести мощный удар +70 В форме силы щелкните правой кнопкой мыши, чтобы атаковать +71 Щелкните левой кнопкой мыши вдалеке от Найи и удерживайте ее. +80 ===MAC HINTS START=== +81 Удерживайте левую кнопку мыши или нажмите пробел, чтобы плыть +82 Нажмите Ctrl, наведя курсор на Найю, чтобы запеть +83 В форме силы нажмите Ctrl и щелкните по врагу, чтобы прицелиться +84 Зажмите Ctrl, чтобы создавать семена в древесном облике +85 Для водоворота зажмите левую кнопку и вращайте курсор вокруг Найи +86 Щелкните обеими кнопками по Найе или нажмите X, чтобы пройти +87 Зажмите среднюю кнопку мыши или левый Shft, чтобы осмотреться +88 Нажмите Ctrl, чтобы взаимодействовать с предметами +89 В форме силы нажмите и держите Ctrl, чтобы нанести сильный удар +90 Нажмите Ctrl, чтобы атаковать врага в форме силы +91 Щелкните левой кнопкой мыши вдали от Найи и удерживайте ее. +100 + +101 - +200 Лечит +201 Полностью вылечивает +202 Защита + +203 Секунд +204 Скорость + +205 в течение +206 Регенерация x +207 Радуга +208 Атака в звериной форме +209 Сильный укус +210 Неуязвимость +211 Выстрел + +212 Лечит слепоту +213 Лечит отравление +214 Отравление +215 Вкусно! +216 Питомец становится сильнее +217 Стрелять ядом в форме рыбы +218 Лечит все болезни +219 Паутина +220 Сияние становится более ярким +221 ??? +222 Вы нашли сокровище! В водах Акварии можно отыскать немало редких и удивительных предметов. Каждый из них украсит собой дом Найи, если вы сумеете их отыскать. +223 Сокровище заняло свое место в вашей пещере. +224 Вы нашли новый костюм! Чтобы надеть его, откройте экран сокровищ. +225 Вам надо найти еще одну древнюю черепаху, чтобы путешествовать с их помощью. +226 Древние черепахи помогут вам быстро перемещаться по Акварии. +227 Ли съест +500 [Медузий маяк] [Это странное растение так привлекало крошечных медуз, что они вились вокруг него стайками.] +501 [Броня кротитов] [В одной из потайных комнат Храма силы я отыскала эту древнюю броню - когда-то ее надевали воины кротитов.] +502 [Идол силы] [В этой небольшой статуэтке пылала неукротимая воля народа кротитов к жизни.] +503 [Клык] [Опьяненная победой, я взяла один из клыков поверженного бога силы. Я решила оставить его на память...] +504 [Большое семя] [Я нашла это огромное семя в моем убежище. Когда я посадила его у себя дома, оно проклюнулось и превратилось в чудесный сад.] +505 [Броня краба] [Я смастерила эту броню из панциря гигантского краба. Она отлично защищала меня в путешествиях.] +506 [Светящееся растение] [Его свет привлекал медуз из глубин моря.] +507 [Амфора Миталаса] [В этой амфоре никогда не кончалось мясо для моей кухни.] +508 [Броня Арнасси] [Я выиграла эту броню, пройдя все препятствия Арнасси за рекордно короткое время. В ней мне гораздо легче управляться с морскими коньками.] +509 [Странный сосуд] [Меня позабавили воздушные пузырьки внутри этого странного сосуда.] +510 [Штандарт Миталаса] [Я взяла с собой этот флаг, чтобы он напоминал мне о времени, которое я провела в стенах древнего города.] +511 [Кукла из Миталаса] [Судя по всему, эта кукла принадлежала маленькой девочке, которая жила в Миталасе задолго до его гибели.] +512 [Детеныш ходунца] [Быть может, когда-нибудь он вырастет таким же высоким и красивым, как и его родители в лесу водорослей?] +513 [Мешочек с семенами] [Я посадила эти семена на песчаном дне моей пещеры. Очень скоро там проклюнулись первые листочки.] +514 [Статуя Арнасси] [Эту статую я разыскала в руинах уничтоженной цивилизации.] +515 [Шестерня] [Я подумала, что было бы забавно поставить у себя дома такую штуку.] +516 [Солнечный ключ] [Странный блестящий предмет… Я не знаю, для чего он нужен, но пусть будет.] +517 [Костюм морского ежа] [Этот шипастый костюм я смастерила из раковин морских ежей. Его иголки кололи любого, кто пытался приблизиться ко мне.] +518 [Купальник-бикини] [Он очень мне идет.] +519 [Костюм мутанта] [Почему они были так похожи на меня...] +520 [Костюм медузы] [Этот костюм я получила после победы над королем медуз. Он смягчал боль и лечил мои раны, когда я чувствовала себя совсем плохо.] +521 [Платье из Миталаса] [Церемониальное одеяние, которое носила принцесса Миталаса.] +522 [Семечко анемоны] [Когда я посадила его в моей пещере, очень скоро в ней распустились яркие подводные цветы.] +523 [Светящееся семечко] [Из этого семечка в моей пещере выросли чудесные светящиеся растения.] +524 [Черепашье яйцо] [Я нашла это яйцо в Пещере черепах] +525 [Череп короля] [Интересно, как он угодил в такое место?] +526 [Трезубец принца] [Это оружие прежде принадлежало принцу Миталаса.] +527 [Поющая спора] [Споры этого растения отзывались на музыку моей песни.] +528 [Икринка медузы] [Икринка странной перевернутой медузы.] +529 [Каменная голова] [Я не могла понять, было ли это лицо создано природой, или его высекли чьи-то руки?] +530 [Золотая звезда] [Особенная морская звезда, наполненная теплыми лучами солнца.] +531 [Черная жемчужина] [Прекрасная черная жемчужина, которую я нашла в глубокой пещере.] +532 [Колыбелька] [Одного взгляда на этот предмет хватило, чтобы на меня накатила волна ярких воспоминаний.] +600 Питомцы +601 [Наутилус] [Изо всех сил врезается во врагов.] +602 [Неуклюжка] [Светится и помогает не заблудиться в темноте] +603 [Бластер] [Стреляет по ближайшим врагам] +604 [Пиранья] [Больно кусает врагов, подплывших близко] +799 Загадочная ошибка +800 Найдено одно воспоминание Найи +801 Найдены два воспоминания Найи +802 Найдены все воспоминания Найи - новый эпилог +850 Конец демонстрационной версии +851 Неверный путь! +852 Круг +853 пройден! +860 Введите описание метки: +1000 Бойлерная +1001 Кит +1002 Замерзшая грань +1003 Воздушная пещера +1004 Храм силы +1005 Дом Найи +1006 Пещера Песни +1007 Пещера песен +1008 Знакомые воды +1009 Открытые воды +1010 Лес водорослей +1011 Миталас +1012 Собор Миталаса +1013 Храм солнца +1014 Грань +1015 Бездна +1016 Затонувший город +1017 Пещера рыбок +1018 Пещера осьминогов +1019 Ледяная пещера +1020 ??? +1021 Тело +1022 +1023 Тайный ход +1024 Пещера мермогов +1025 Пещера лесных нимф +1026 Пещера рыбок +1027 Пещера черепах +1028 Руины Арнасси +1029 Пещера Ли +1030 Пещера короля медуз +2000 Сохранить игру +2001 Загрузить игру +2002 Слот +2003 Пусто +2004 ~Пауза~ +2005 'S' - пропустить +2006 Стр. +2007 Рецепты +2008 error +2009 No Description +2010 Stopped Recording +2011 Stopped Playback +2013 health +2014 Enter Flag to Set +2015 Enter Value to Set Flag To +2016 Entity data not found! Aborting... +2017 Variables data not found! Aborting... +2018 Particle Name: +2019 Saved worldmap data to +2020 Unable to save worldmap to +2021 Unable to retrieve online mod list.|Check your connection and try again. +2022 Server error!|Bad XML, please contact server admin.|URL: +2023 Finished downloading mod +2024 Download update? +2025 Mod already exists. Re-download? +2026 This mod was installed manually,|not messing with it. +2027 |Browse installed mods +2028 |Browse & enable/disable installed patches +2029 |Browse mods online +2030 |Return to title +2031 Что +2032 [Achievements] \ No newline at end of file diff --git a/files/locales/ru/gfx/font.png b/files/locales/ru/gfx/font.png new file mode 100644 index 0000000..e9372b1 Binary files /dev/null and b/files/locales/ru/gfx/font.png differ diff --git a/game_scripts/scripts/entities/entities.txt b/game_scripts/scripts/entities/entities.txt new file mode 100644 index 0000000..204eb5c --- /dev/null +++ b/game_scripts/scripts/entities/entities.txt @@ -0,0 +1,431 @@ +0 Crotoid Crotoid 1 +86 Seal-King Seal-King +87 Seal-Queen Seal-Queen +88 Seal-Prince Seal-Prince +90 HealthUpgrade0 HealthUpgrade/Whole +91 HealthUpgrade1 HealthUpgrade/Whole +92 HealthUpgrade2 HealthUpgrade/Whole +93 HealthUpgrade3 HealthUpgrade/Whole +94 HealthUpgrade4 HealthUpgrade/Whole +110 SporeChildFlowerRed SporeChildFlower/Red1 +120 Ekkrit Ekkrit/Head +121 Flea Flea +122 GreenSeaDragon GreenSeaDragon/Head +123 Blazer Blazer +124 Seahorse SeaHorse/Seahorse-0001 +125 Moloch moloch +126 Loper Loper +127 Splitter1 Splitter1/Core +128 Splitter2 Splitter2/Core +129 Rotfish-blob Rotfish-blob +130 Rotfish Rotfish +131 Rotworm Rotworm/Head +132 Gear Gear/Gear +133 CrystalHolder LightCrystal/Holder +134 LightCrystal LightCrystal/Crystal +135 Shark Shark/Body +136 Monkey Monkey/Head +137 Simon Simon/Body +138 TransTurtle TransTurtle/Head +139 FormUpgradeEnergy1 EnergyOrb +140 FormUpgradeEnergy2 FormUpgrades/EnergyIdol +141 FormUpgradeBeast EnergyOrb +142 EvilJelly EvilJelly +143 KingJelly KingJelly/Core +144 SunkenDad SunkenDad/Head +145 SunkenMom SunkenMom/Head +146 DeepUrchin DeepUrchin/Body +147 AnglerFish AnglerFish/Body +148 Plasmaworm Plasmaworm/Body +149 PredatoryTunicate PredatoryTunicate/Body +150 Octomun Octomun/Body +151 ClockworkFish ClockworkFish/Head +152 ClockworkCrab ClockworkCrab/Shell +153 CrawPappy CrawPappy/Body +156 LightCrystalCharged LightCrystal/Crystal +157 SpikeyEggDown SpikeyEgg +158 Scavenger Scavenger/Head +159 CC_LostInCave CC/Body +160 CC_Mother CC_Mother/Body +161 CC_MissingMom CC/Body +162 CC_GF CC_GF/Body +163 SporeSeed Seed +164 Vine Vine +165 CC_WantGF CC/Body +166 CC_Cat CC_Cat/Body +167 CC_Kid CC_Kid/Body +168 CC_GetRocked CC/Body +169 13_MainArea 13/Face +170 SpiderCrab SpiderCrab/Body +171 SpikyBall SpikyBall/Body +172 CC_StatueHead MissingImage +173 MossHead MossHead/Head +174 NatureFormFlowers Naija/Flowers +175 NudiBranch0 NudiBranch/NudiBranch0 +176 NudiBranch1 NudiBranch/NudiBranch1 +177 NudiBranch2 NudiBranch/NudiBranch2 +178 NudiBranch3 NudiBranch/NudiBranch3 +180 Dandelion Dandelion/Head +181 UberVine Naija/Ubervine-Stalk +182 SporeChildFlowerPortal TubeFlower/Body1 +183 Zygote Zygote/Head +184 MomEyes SunkenMom/MomEyes +185 CreatorShadow creator-shadow +186 CathedralDoor CathedralDoor/Body +187 SunkenDoor SunkenDoor/Body +188 LiHelmet Li/Helmet +189 Parrot Parrot/Head +190 CaveFish1 CaveFish +191 CaveFish2 CaveFish +192 CaveFish3 CaveFish +193 CaveFish4 CaveFish +194 OriginalRaspberry OriginalRaspberry +195 Skeeter Skeeter/Body +196 Wisker Wisker/Wisker +197 RedNautilus RedNautilus +198 Toad Toad/Head +199 SpikeyEggUp SpikeyEgg +201 CC_EndDemo CC/Body +202 BigMouth BigMouth/Body +203 BigMouthParasite BigMouth/Parasite +204 FlatFish FlatFish/Body +205 MetaRay MetaRay/Body +206 Clam Clam/Top +207 Tabar Tabar/Body +208 HorseShoe HorseShoe/Body +209 PufferFish PufferFish/PufferSmall +210 Tabar Tabar/Body +211 Swordfish Swordfish/Body +212 SpinyCrab SpinyCrab/Body +213 DeepEel DeepEel/Tail +214 AbyssSpikes Abyss-Spikes +215 Wisp Wisp +216 Triffle Triffle/Body +217 BabyDeepShrimp BabyDeepShrimp +218 ThermalVent thermalvent +219 SlenderEel SlenderEel +220 DeepJelly DeepJelly/Bulb +221 Mermog Mermog/Body +222 RotBaby-Form1 RotBaby/Form1 +223 RotBaby-Form2 RotBaby/Form2 +224 RotBaby-Form3 RotBaby/Form3-Body +225 Orbiter Orbiter/Body +226 Piranha Piranha +227 UpsideDownJelly UpsideDownJelly/Body +228 Kappa Kappa/Head +229 Seahorse2 Seahorse/Seahorse-0002 +230 Seahorse3 Seahorse/Seahorse-0003 +231 Seahorse4 Seahorse/Seahorse-0004 +232 DarkJelly DarkJelly/Front +233 SnailGear SnailGear/Shell +234 Seahorse5 Seahorse/Seahorse-0005 +235 CC_SunkenCity CC/Body +236 AbyssOctopus AbyssOctopus/Head +237 Mutilus Mutilus/Mutilus +238 Horror Horror/Body +239 StressTest missingImage +240 Abaddon Abaddon/Face +241 Bevy Bevy/Body +242 Huggy Huggy/Head +243 Krill Krill/Krill +244 KrillEggs Krill/KrillEggs +245 Starmie1 Starmie/Body +246 Chomper Chomper/Head +247 Armapillar Armapillar/Body +248 Duoeye Duoeye-head +249 ekko ekko/Body +250 SeaTurtleBig SeaTurtle/Head +251 Rukh Rukh/Head +252 Starmie2 Starmie2/Body +253 JellyNew Jelly +254 SeedFlower SeedFlower +255 SeedUberVine SeedUberVine +256 GroundShocker GroundShocker/Core +257 GroundShockerShell GroundShocker/Shell +258 Spookfish Spookfish/Body +259 Mutileye Mutileye/Head +260 GroundShockerAttackL GroundShocker/Shell +261 GroundShockerAttackR GroundShocker/Shell +262 SeaTurtleSmall SeaTurtle/Head +263 JellyZap JellyZap/Head +264 BiteyMouth BiteyMouth/Teeth +265 SeaTurtleBaby BabyTurtle/Head +266 IceChunkLarge IceChunk/Large +267 IceChunkMedium IceChunk/Medium +268 IceChunkSmall IceChunk/Small +269 GrabbyArm GrabbyArm/Front +270 IceCrab IceCrab/Body +271 Walker Walker/Head +272 CreepyFace CreepyFace/Face +273 cc_father cc_father/body +274 SeaTurtleBaby-Special1 babyturtle-special/shell +275 SeaTurtleBaby-Special2 babyturtle-special/shell2 +276 SeaTurtleBaby-Special3 babyturtle-special/shell3 +277 ancient-plant ancient-plant/stem +278 ancient-bulb ancient-plant/bulb +75 CurrentSwitchOff CurrentSwitch +76 CurrentSwitchOn CurrentSwitch +81 SacrificeButton SacrificeButton-bg +82 ForestGod ForestGod/bg +83 SunWorm SunWorm/Head +84 ForestGodSeed SporeChildSeed +85 ForestGodCrab KingCrab-Head 1 +77 Altar Altar/Grate-Front +78 RotCore RotCore/Body +79 SacrificeVictim EnergyOrb +70 MermanThin MermanThin/Head +71 SporeFungus0001 SporeFungus0001 +72 Fan Fan +73 Priest Priest/Head +74 Li Li/Head +80 HellBeast HellBeast/Head +57 RockHead Fish-RockHead 1 +1 Raspberry wallshooter 0.75 +2 Squiddy squiddy 1.0 +3 Nautilus nautilus 0.7 +4 Moneye moneye-head 0.4 +5 Anemone Anemone 1 +60 Anemone2 Anemone-0002 1 +61 Anemone3 Anemone-0003 1 +62 Anemone4 Anemone-0004 1 +6 Blaster Blaster/Core 1 +7 Leach Leach 1 +8 JellySmall JellySmallShell 1 +9 MoneyeBreeder MoneyeBreeder 1 +10 KingCrab KingCrab-Head 1 +11 SeaSlug missingImage 1 +12 Trillious trillious-head 1 +13 Scooter Scooter 1 +14 Lumite missingImage 1 +15 Empty missingImage 1 +16 RoodShrimp RoodShrimp 1 +17 Shocker Shocker-Body 1 +18 Turret Turret-Body 1 +19 Jelly Jelly 1 +20 NewtBlaster NewtBlasterHead 1 +21 Maul maul 1 +22 SpikeBall spikeball 1 +23 AggroHopper AggroHopper-Head 0.5 +24 Froog Froog-Head 0.5 +25 LesserWurm LesserWurm-Head 1.0 +26 Squeezer Squeezer-Head 1.0 +30 OrbHolder OrbHolder 1 +31 EnergyOrb EnergyOrb 1 +32 EnergyDoor EnergyDoor 1 +33 EnergyBarrierFlicker EnergyBarrier 1 +34 MetalObject MetalObject 1 +35 EnergyBarrierSolid EnergyBarrier 1 +36 Tromulo Tromulo 1 +37 Eel eel-0001 1 +38 EnergyOrbCracked EnergyOrbCracked 1 +39 EnergyBarrierOff EnergyBarrier 1 +40 HydraWurm Wurm-Head 1 +41 Turtle Turtle-Body 1 +42 Nudi Nudi-Shell 1 +43 Shrimp Shrimp 1 +50 Rock0001 rock0001 1 +63 Rock0002 rock0002 1 +64 Rock0003 rock0003 1 +65 Rock0004 rock0004 1 +66 Rock0005 rock0005 1 +67 Rock0006 rock0006 1 +52 SongSpore SongSpore-Shell 1 +53 SongStalk SongStalk-Body 1 +54 Phonograph Phonograph 1 +55 JellyShock JellyShock 1 +56 HealthPlant HealthPlant 1 +102 ErulianGhost ErulianGhost-Body 1 +103 TempleStatue temple-statue-0001 1 +300 TurtleNoShell EnergyOrb 1 +301 NudiNoShell Nudi-Body 1 +302 ClayStatue Clay/Head +303 Clay Clay/Clay +304 CreatorForm1SunkenCity Creator/Form1/Head +305 CC_Final CC/Head +306 CC_EndOfGame CC/Head +307 Drask-Final Drask/Head +308 Krotite-Final Krotite/Head +309 Erulian-Final Erulian/Head +310 Druniad-Final Druniad/Head +311 FinalDoor Final-Door +312 FinalTongue Final-Tongue +313 Moray Moray +314 BigBlaster BigBlaster/Core +315 DarkJellyFG DarkJelly/Front +316 GearSlow Gear/Gear +317 GearMed Gear/Gear +318 GearFast Gear/Gear +319 YoungLi YoungLi/Head +320 NaijaChild NaijaChild/Head +321 StrangeCreature StrangeCreature/Head +322 SongLamp3 Particles/Glow +323 SongLamp4 Particles/Glow +324 SongLamp5 Particles/Glow +325 SongLamp6 Particles/Glow +326 SongLamp7 Particles/Glow +327 SongLamp0 Particles/Glow +328 SongLamp1 Particles/Glow +329 SongLamp2 Particles/Glow +330 MithalasUrn Breakable/Urn +331 BrokenPiece Breakable/Urn-0001 +332 NaijaBabyGhost NaijaBabyGhost/naija-baby-ghost +333 MiaGhost MiaGhost/Head +334 NaijaChildGhost NaijaChildGhost/Head +335 Mia Mia/Head +336 ForestGodVine ForestGod/Vine +337 ForestGodVineHead ForestGod/Vine-Head +338 MutantNaija Naija/Mutant-Head +339 DeepWhale DeepWhale/Eye +340 LiCage LiCage/Glass-0001 +341 TitleTextLeft Title/TextLeft +342 TitleTextCenter Title/TextCenter +343 CursorSwarmer MissingImage +344 KrotiteWorshipper Krotite/Head +345 KrotiteErulianBattle01 Krotite/Head +346 KrotiteOnTheWay Krotite/Head +347 KrotiteVsKrotite Krotite/Head +348 Guardian Guardian/Head +349 ForestSprite ForestSprite/Head +350 Fatso Test/Kurtz +351 Druniad Druniad/Head +352 Drask Drask/Head +353 PriestNormal PriestNormal/Head +354 DraskPriestBattle PriestNormal/Head +355 PullPlantNormal Ingredients/plant-leaf +356 Ompo Ompo/Body +357 Architect Lumerean/Head +358 cf6-shot missingimage +359 SunDoor sun-door-0001 +360 EnergyGodSpirit particles/lines +361 Minnow title/minnow +362 camopus camopus/head +363 singbulb singbulb/base-0001 +364 seawolf seawolf/head +365 grouper grouper/body +366 poisonberry wallshooter +367 bloodcell-red cell/red-cell +368 bloodcell-white cell/white-cell +369 crawlvirus crawlvirus/body +370 roundvirus roundvirus/body +371 floating-city intro/floating-city +372 eric_13 missingImage +373 eric_energyboss missingImage +374 eric_mithala missingImage +375 eric_sunkenmom missingImage +376 eric_mutantnaija missingImage +377 eric_forestgod missingImage +378 eric_erulian missingImage +379 lucien lucien/lucien-head +380 airship airship/airship-body +381 lucien-baby lucien-baby/head +382 gateway gateway/body +383 final-mutant final-mutant-0001 +384 dark-li-shot creator/darklishot/darkli-ball +385 suncontainer breakable/suncontainer +386 falsebg falsebg/bg +387 upgrade-wok gui/wok +388 beluga beluga/body +389 beluga-bubble bubble +390 merchild merchild/head +391 merwoman merwoman/head +392 merman merman/head +393 luciengf luciengf/head +394 otter otter/body +395 fishcaveglow particles/spiralglow +396 timerock missingImage +397 arnassi-spirit missingImage +200 SongDoor1 SongDoor-Body 1 +403 CrabBoss CrabBoss-body 1 +404 EnergyBoss EnergyBoss/Body 1 +405 EnergyGod EnergyGod-Torso 1 +406 EnergyBossClimb EnergyBoss-Torso 1 +407 NautilusPrime NautilusPrime-Body 1 +408 Mergog Mergog/Mergog 1 +409 CreatorForm1 Creator/Form1/Mask +410 CreatorForm2 Creator/Form1/Head +411 CreatorForm3 Creator/Form3/Head +412 CreatorForm4 Creator/Form4/Body +413 CreatorForm5 Creator/Form5/Head-Down +414 CreatorForm6 Creator/Form6/Head +415 VineDoor VineDoor +500 CollectibleSongCave Collectibles/SongCave 1 +501 CollectibleNautilusPrime Collectibles/NautilusPrime 1 +502 CollectibleNaijaCave Collectibles/NaijaCave 1 +503 CollectibleEnergyBoss Collectibles/EnergyBoss 1 +504 CollectibleEnergyTemple Collectibles/EnergyTemple 1 +505 CollectibleCrabCostume Collectibles/CrabCostume 1 +506 CollectibleDumboEgg Collectibles/Egg-Dumbo 1 +507 CollectibleBlasterEgg Collectibles/Egg-Blaster 1 +508 CollectiblePiranhaEgg Collectibles/Egg-Piranha 1 +509 CollectibleChest Collectibles/treasure-chest 1 +510 CollectibleBanner Collectibles/mithalas-banner 1 +511 CollectibleMithalaDoll Collectibles/mithala-doll 1 +512 CollectibleWalkerBaby Collectibles/walker-baby 1 +513 CollectibleSeedBag Collectibles/seed-bag 1 +514 CollectibleArnassiStatue Collectibles/arnassi-statue 1 +515 CollectibleGear Collectibles/golden-gear 1 +516 CollectibleSunKey Collectibles/sun-key 1 +517 CollectibleJellyCostume collectibles/jelly-costume 1 +518 CollectibleAnemoneSeed collectibles/anemone-seed 1 +519 CollectibleBioSeed collectibles/bio-seed 1 +520 CollectibleUrchinCostume collectibles/urchin-costume 1 +521 CollectibleMithalanCostume collectibles/mithalan-costume 1 +522 CollectibleTeenCostume collectibles/teen-costume 1 +523 CollectibleTurtleEgg collectibles/turtle-egg 1 +524 CollectibleSkull collectibles/skull 1 +525 CollectibleTridentHead collectibles/trident-head 1 +526 CollectibleSporeSeed collectibles/sporeseed 1 +527 CollectibleUpsideDownSeed collectibles/upsidedownseed 1 +528 CollectibleEnergyStatue collectibles/energystatue 1 +529 CollectibleJellyPlant collectibles/jellyplant 1 +530 CollectibleMithalasPot collectibles/mithalaspot 1 +531 CollectibleSeahorseCostume collectibles/seahorse-costume 1 +532 CollectibleStoneHead collectibles/stonehead 1 +533 CollectibleStarfish collectibles/goldstar 1 +534 CollectibleBlackPearl collectibles/blackpearl 1 +535 CollectibleBabyCrib collectibles/babycrib 1 +536 CollectibleMutantCostume collectibles/mutant-costume 1 +600 SporeChild SporeChildSeed 1 +700 SongLeaf songleaf +701 EnergyLamp breakable/energylamp +702 Oarfish oarfish +703 Nauplius nauplius +704 CastleCrab castlecrab/body +705 HardBeetle hardbeetle +706 DeepCrawley deepcrawley +707 PlasmawormBG plasmaworm/body-bg +708 Hatchetfish hatchetfish/body +709 IceJelly icejelly/head +710 Spooter spooter +711 MamaTurtle mamaturtle/head +712 IceShrimp iceshrimp/body +713 Mantis mantis/body +714 Coward coward/body +715 Lionfish lionfish/body +716 LeopardShark leopardshark/body +717 TigerShark tigershark/body +718 Mermoth mermoth/body +719 cellgenerator red-cell +720 roundvirus-bg roundvirus-bg +721 pistolshrimp pistolshrimp/body +722 electriceel eel-0002 +723 whelk whelk +724 whelknoshell whelk +725 aggroeggs aggro-eggs +726 aggrobaby aggrobaby +727 rotcrab rotcrab/head +728 sporeplant songspore-plant +729 bioplant abyss-plant-0001 +730 statuehead creatorstatue-0004 +731 weird-derek weirdfish/derek-body +732 weird-alec weirdfish/alec-body +733 sunkencrate Breakable/crate +734 Rock0007 rock0007 1 +1000 SeaHorse6 Seahorse/Seahorse-0006 +1001 SeaHorseBaby Seahorse/seahorse-baby +1002 GlobeCrab GlobeCrab/Body +1003 BigMaul bigmaul-body +1004 SlipperLobster SlipperLobster/Body +1005 SlipperGenerator SlipperLobster/Body +1006 drask-statue drask/statue-head +1007 queen-statue queen-statue/head \ No newline at end of file diff --git a/game_scripts/scripts/entities/entitygroups.txt b/game_scripts/scripts/entities/entitygroups.txt new file mode 100644 index 0000000..ba89503 --- /dev/null +++ b/game_scripts/scripts/entities/entitygroups.txt @@ -0,0 +1,417 @@ +GROUP:OpenWaters +Nautilus +RedNautilus +Tromulo +Seahorse +Seahorse2 +Seahorse3 +Seahorse4 +Seahorse5 +SeaHorseBaby +TransTurtle +Phonograph +JellySmall +Jelly +JellyShock +Nauplius +Squiddy +RockHead +Raspberry +Moneye +MoneyeBreeder +Anemone +Anemone2 +Anemone3 +Anemone4 +Leach +KingCrab +GlobeCrab +CastleCrab +Trillious +Scooter +HardBeetle +AggroHopper +aggrobaby +aggroeggs +Eel +Oarfish +HydraWurm +Turtle +Nudi +TurtleNoShell +NudiNoShell +whelk +TurtleNoShell +Shrimp +SongSpore +SongStalk +SongLeaf +sporeplant +HealthPlant +Ekkrit +Crotoid +13_MainArea +OriginalRaspberry +Moloch +Tabar +Swordfish +Kappa +Bevy +Huggy +Krill +KrillEggs +Chomper +Duoeye +Armapillar +StressTest +Minnow +Grouper +poisonberry + +GROUP:SongCave +ErulianGhost +SongDoor1 + +GROUP:EnergyTemple +Blaster +MoneyeBreeder +Shocker +Turret +NewtBlaster +Froog +EnergyLamp +OrbHolder +EnergyOrb +EnergyDoor +EnergyBarrierFlicker +EnergyBarrierSolid +EnergyOrbCracked +EnergyBarrierOff +TempleStatue +BigBlaster +VineDoor + +GROUP:Mithalas +Splitter1 +Splitter2 +Rotworm +rotcrab +Blazer +Flea +RotCore +SporeFungus0001 +Priest +Loper +SacrificeButton +Seal-King +Seal-Queen +Seal-Prince +Altar +MermanThin +CathedralDoor +Toad +RotBaby-Form1 +DarkJelly +Seahorse5 +Moray +DarkJellyFG +MithalasUrn +drask-statue +queen-statue + +GROUP:Forest +GreenSeaDragon +Simon +CrawPappy +SpikyBall +SpiderCrab +MossHead +NudiBranch0 +NudiBranch1 +NudiBranch2 +NudiBranch3 +Dandelion +electriceel +pistolshrimp +Wisker +Squeezer +BigMaul +Mermog +Mermoth +Maul +SeaWolf +Coward +Piranha +UpsideDownJelly +Orbiter +Walker +ForestSprite +SporeChildFlowerRed +SporeChildFlowerPortal + +GROUP:Veil +Shark +LeopardShark +TigerShark +Monkey +Parrot +BigMouth +BigMouthParasite +HorseShoe +PufferFish +FlatFish +Lionfish +MetaRay +Camopus +Clam +Rukh +Starmie1 +Starmie2 +SeaTurtleBig +SeaTurtleSmall +SeaTurtleBaby +MamaTurtle +SeaTurtleBaby-Special1 +SeaTurtleBaby-Special2 +SeaTurtleBaby-Special3 +ancient-plant +ancient-bulb + +GROUP:SunTemple +CrystalHolder +LightCrystal +LightCrystalCharged +ClockworkFish +ClockworkCrab +Gear +SpikeyEggDown +SpikeyEggUp +Skeeter +SnailGear +SlipperLobster +SlipperGenerator +GearSlow +GearMed +GearFast +SunDoor + +GROUP:Abyss +Rock0007 +EvilJelly +DeepUrchin +AnglerFish +Plasmaworm +PlasmawormBG +PredatoryTunicate +DeepCrawley +SpinyCrab +DeepEel +AbyssSpikes +Wisp +Hatchetfish +Triffle +BabyDeepShrimp +ThermalVent +SlenderEel +DeepJelly +DeepWhale + +GROUP:IceCave +IceChunkLarge +IceChunkMedium +IceChunkSmall +Ekko +IceCrab +SeaHorse6 +IceJelly +Spooter +IceShrimp +Mantis + +GROUP:SunkenCity +Scavenger +CC_LostInCave +CC_Mother +CC_MissingMom +CC_GF +CC_Kid +CC_Cat +SunkenDoor +CC_EndDemo +CC_SunkenCity +sunkencrate +Spookfish +ClayStatue +Clay +cc_father + +GROUP:FinalDungeon +AbyssOctopus +Mutilus +Horror +Abaddon +GroundShocker +Mutileye +JellyZap +BiteyMouth +Drask-Final +Erulian-Final +Krotite-Final +Druniad-Final +FinalDoor +FinalTongue +GrabbyArm +MutantNaija +LiCage +Guardian +bloodcell-red +bloodcell-white +cellgenerator +crawlvirus +roundvirus +roundvirus-bg + +GROUP:Bosses +EnergyBoss +HellBeast +SunWorm +ForestGod +SunkenDad +SunkenMom +Zygote +MomEyes +NautilusPrime +CrabBoss +KingJelly +Octomun +Mergog +CreatorForm1 +CreatorForm2 +CreatorForm3 +CreatorForm4 +CreatorForm5 +CreatorForm6 +CC_EndOfGame + +GROUP:Secrets +YoungLi +Mia +MiaGhost +NaijaBabyGhost +NaijaChild +NaijaChildGhost +StrangeCreature +SongLamp0 +SongLamp1 +SongLamp2 +SongLamp3 +SongLamp4 +SongLamp5 +SongLamp6 +SongLamp7 +weird-derek +weird-alec + +GROUP:Items +HealthUpgrade0 +HealthUpgrade1 +HealthUpgrade2 +HealthUpgrade3 +HealthUpgrade4 +FormUpgradeEnergy1 +FormUpgradeEnergy2 +FormUpgradeBeast +CollectibleSongCave +CollectibleNautilusPrime +CollectibleNaijaCave +CollectibleEnergyBoss +CollectibleEnergyTemple +CollectibleCrabCostume +CollectibleChest +CollectibleBanner +CollectibleMithalaDoll +CollectibleWalkerBaby +CollectibleSeedBag +CollectibleArnassiStatue +CollectibleGear +CollectibleSunKey +CollectibleSkull +CollectibleTridentHead +CollectibleSporeSeed +CollectibleUpsideDownSeed +CollectibleEnergyStatue +CollectibleJellyPlant +CollectibleMithalasPot +CollectibleSeahorseCostume +CollectibleStoneHead +CollectibleStarfish +CollectibleBlackPearl +CollectibleMutantCostume +LiHelmet +CaveFish1 +CaveFish2 +CaveFish3 +CaveFish4 +CollectibleDumboEgg +CollectibleBlasterEgg +CollectiblePiranhaEgg +CollectibleJellyCostume +CollectibleAnemoneSeed +CollectibleBioSeed +CollectibleUrchinCostume +CollectibleMithalanCostume +CollectibleTeenCostume +CollectibleTurtleEgg + +GROUP:Unsorted +Fatso +ForestGodVine +ForestGodVineHead +TitleTextLeft +TitleTextCenter +CursorSwarmer +KrotiteWorshipper +KrotiteErulianBattle01 +KrotiteOnTheWay +KrotiteVsKrotite +Druniad +Drask +PriestNormal +DraskPriestBattle +PullPlantNormal +Ompo +Architect +EnergyGodSpirit +SingBulb +floating-city +eric_13 +eric_energyboss +eric_mithala +eric_sunkenmom +eric_mutantnaija +eric_forestgod +eric_erulian +lucien +airship +gateway +final-mutant +dark-li-shot +suncontainer +falsebg +upgrade-wok +beluga +merchild +merwoman +merman +luciengf +Rock0001 +Rock0002 +Rock0003 +Rock0004 +Rock0005 +Rock0006 +statuehead +otter +fishcaveglow +timerock +arnassi-spirit diff --git a/game_scripts/scripts/entities/icechunkcommon.lua b/game_scripts/scripts/entities/icechunkcommon.lua index 474212b..e176f31 100644 --- a/game_scripts/scripts/entities/icechunkcommon.lua +++ b/game_scripts/scripts/entities/icechunkcommon.lua @@ -55,7 +55,7 @@ function v.commonInit(me, size) 512, -- sprite height 1, -- particle "explosion" type, maps to particleEffects.txt -1 = none 1, -- 0/1 hit other entities off/on (uses collideRadius) - 4000, -- updateCull -1: disabled, default: 4000 + 4000 -- updateCull -1: disabled, default: 4000 ) loadSound("IceChunkBreak") diff --git a/win/vc90/Aquaria.vcproj b/win/vc90/Aquaria.vcproj index 7cf48b0..ccd1d17 100644 --- a/win/vc90/Aquaria.vcproj +++ b/win/vc90/Aquaria.vcproj @@ -131,6 +131,7 @@ BufferSecurityCheck="false" EnableFunctionLevelLinking="false" EnableEnhancedInstructionSet="2" + FloatingPointModel="2" UsePrecompiledHeader="0" WarningLevel="3" DebugInformationFormat="3" diff --git a/win/vc90/BBGE.vcproj b/win/vc90/BBGE.vcproj index 8505cb1..f7e90a1 100644 --- a/win/vc90/BBGE.vcproj +++ b/win/vc90/BBGE.vcproj @@ -123,6 +123,7 @@ BufferSecurityCheck="false" EnableFunctionLevelLinking="false" EnableEnhancedInstructionSet="2" + FloatingPointModel="2" UsePrecompiledHeader="0" WarningLevel="3" DebugInformationFormat="3" @@ -331,6 +332,14 @@ RelativePath="..\..\BBGE\LensFlare.cpp" > + + + + diff --git a/win/vc90/external.vcproj b/win/vc90/external.vcproj index c1cf1af..f44df45 100644 --- a/win/vc90/external.vcproj +++ b/win/vc90/external.vcproj @@ -123,6 +123,7 @@ BufferSecurityCheck="false" EnableFunctionLevelLinking="false" EnableEnhancedInstructionSet="2" + FloatingPointModel="2" RuntimeTypeInfo="false" UsePrecompiledHeader="0" WarningLevel="3"