1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2025-07-04 15:04:36 +00:00

Merge branch 'experimental' into controllerfixup

# Conflicts:
#	Aquaria/Avatar.cpp
#	Aquaria/Continuity.cpp
#	Aquaria/DSQ.cpp
#	Aquaria/DSQ.h
#	Aquaria/Game.cpp
#	Aquaria/Game.h
#	Aquaria/Main.cpp
#	Aquaria/UserSettings.cpp
#	BBGE/Base.cpp
#	BBGE/Base.h
#	BBGE/Core.cpp
#	BBGE/Core.h
#	BBGE/DebugFont.cpp
#	BBGE/Shader.cpp
#	BBGE/SoundManager.h
This commit is contained in:
fgenesis 2017-01-13 12:19:23 +01:00
commit 0dc30e668d
67 changed files with 788 additions and 511 deletions

View file

@ -1115,7 +1115,6 @@ void AnimationEditor::flipRot()
BoneKeyframe *bcur = editSprite->getCurrentAnimation()->getKeyframe(currentKey)->getBoneKeyframe(editingBone->boneIdx); BoneKeyframe *bcur = editSprite->getCurrentAnimation()->getKeyframe(currentKey)->getBoneKeyframe(editingBone->boneIdx);
if (bcur) if (bcur)
{ {
int rotdiff = editingBone->rotation.z - bcur->rot;
if (!core->getCtrlState()) if (!core->getCtrlState())
{ {
for (int i = 0; i < editSprite->getCurrentAnimation()->getNumKeyframes(); ++i) for (int i = 0; i < editSprite->getCurrentAnimation()->getNumKeyframes(); ++i)

View file

@ -6,13 +6,13 @@
#ifndef BBGE_SKIP_CONFIG_HEADERS #ifndef BBGE_SKIP_CONFIG_HEADERS
#define AQUARIA_BUILD_CONSOLE 1 #define AQUARIA_BUILD_CONSOLE 1
#define AQUARIA_BUILD_SCENEEDITOR 1 #define AQUARIA_BUILD_SCENEEDITOR 1
#define AQUARIA_CUSTOM_BUILD_ID (" Build " __DATE__ " - " __TIME__) #define AQUARIA_CUSTOM_BUILD_ID (" Build " __DATE__ " - " __TIME__)
// If defined, this is shown instead of "Aquaria vx.x.x ..." on the title screen. // If defined, this is shown instead of "Aquaria vx.x.x ..." on the title screen.
//#define AQUARIA_OVERRIDE_VERSION_STRING "Aquaria OSE v1.001" //#define AQUARIA_OVERRIDE_VERSION_STRING "Aquaria OSE v1.001"
#endif #endif

View file

@ -884,6 +884,8 @@ void AquariaKeyConfig::onUpdate(float dt)
} }
} }
break; break;
case INPUTSET_NONE:
break;
} }
} }

View file

@ -56,7 +56,7 @@ int SongIcon::notesOpen = 0;
Avatar *avatar = 0; Avatar *avatar = 0;
const Vector BLIND_COLOR = Vector(0.1, 0.1, 0.1); const Vector BLIND_COLOR = Vector(0.1, 0.1, 0.1);
const float ANIM_TRANSITION = 0.2; const float ANIM_TRANSITION = 0.2;
const float MANA_RECHARGE_RATE = 1.0; //const float MANA_RECHARGE_RATE = 1.0;
const int AURA_SHIELD_RADIUS = 64; const int AURA_SHIELD_RADIUS = 64;
//const int TARGET_RANGE = 1024; //const int TARGET_RANGE = 1024;
const int TARGET_RANGE = 1024; // 650 const int TARGET_RANGE = 1024; // 650
@ -71,7 +71,7 @@ const int BURST_DISTANCE = 200;
const int STOP_DISTANCE = 48; const int STOP_DISTANCE = 48;
const int maxMouse = BURST_DISTANCE; const int maxMouse = BURST_DISTANCE;
//const int SHOCK_RANGE = 700; //const int SHOCK_RANGE = 700;
const int SHOCK_RANGE = 1000; //const int SHOCK_RANGE = 1000;
const int SPIRIT_RANGE = 2000; const int SPIRIT_RANGE = 2000;
const float QUICK_SONG_CAST_DELAY = 0.4; const float QUICK_SONG_CAST_DELAY = 0.4;
@ -83,9 +83,9 @@ const float BURST_ACCEL = 4000; //2000 // 1000
// Minimum time between two splash effects (seconds). // Minimum time between two splash effects (seconds).
const float SPLASH_INTERVAL = 0.2; const float SPLASH_INTERVAL = 0.2;
const float TUMMY_TIME = 6.0; //const float TUMMY_TIME = 6.0;
const float chargeMax = 2.0; //const float chargeMax = 2.0;
// Axis input distance (0.0-1.0) at which we start moving. // Axis input distance (0.0-1.0) at which we start moving.
const float JOYSTICK_LOW_THRESHOLD = 0.2; const float JOYSTICK_LOW_THRESHOLD = 0.2;
@ -847,6 +847,16 @@ std::string Avatar::getIdleAnimName()
case FORM_ENERGY: case FORM_ENERGY:
ret="energyidle"; ret="energyidle";
break; break;
case FORM_NORMAL:
case FORM_BEAST:
case FORM_NATURE:
case FORM_SPIRIT:
case FORM_DUAL:
case FORM_FISH:
case FORM_SUN:
case FORM_MAX:
case FORM_NONE:
break;
} }
return ret; return ret;
} }
@ -1217,6 +1227,10 @@ void Avatar::entityDied(Entity *e)
dsq->continuity.eatBeast(e->eatData); dsq->continuity.eatBeast(e->eatData);
} }
break; break;
case EAT_DEFAULT:
case EAT_MAX:
case EAT_NONE:
break;
} }
} }
@ -1567,6 +1581,9 @@ void Avatar::changeForm(FormType form, bool effects, bool onInit, FormType lastF
case FORM_DUAL: case FORM_DUAL:
core->sound->playSfx("DualForm"); core->sound->playSfx("DualForm");
break; break;
case FORM_NONE:
case FORM_MAX:
break;
} }
/* /*
@ -2812,6 +2829,10 @@ void Avatar::formAbility(int ability)
} }
break; break;
case FORM_NORMAL:
case FORM_NONE:
case FORM_MAX:
break;
} }
} }
@ -2936,7 +2957,6 @@ void Avatar::doShock(const std::string &shotName)
s->targetPt = targets[j].targetPt; s->targetPt = targets[j].targetPt;
} }
} }
Vector d = e->position - position;
s->setAimVector(getTendrilAimVector(i, thits)); s->setAimVector(getTendrilAimVector(i, thits));
checkUpgradeForShot(s); checkUpgradeForShot(s);
} }
@ -2978,9 +2998,15 @@ void Avatar::formAbilityUpdate(float dt)
} }
break; break;
case FORM_ENERGY: case FORM_ENERGY:
{ case FORM_NORMAL:
} case FORM_BEAST:
break; case FORM_NATURE:
case FORM_SPIRIT:
case FORM_DUAL:
case FORM_SUN:
case FORM_MAX:
case FORM_NONE:
break;
} }
} }
@ -3072,6 +3098,12 @@ bool Avatar::canCharge(int ability)
case FORM_SUN: case FORM_SUN:
return true; return true;
break; break;
case FORM_NORMAL:
case FORM_SPIRIT:
case FORM_FISH:
case FORM_MAX:
case FORM_NONE:
break;
} }
return false; return false;
} }
@ -4670,6 +4702,10 @@ void Avatar::updateAura(float dt)
} }
} }
break; break;
case AURA_THING:
case AURA_HEAL:
case AURA_NONE:
break;
} }
auraTimer -= dt; auraTimer -= dt;
@ -4814,6 +4850,14 @@ void Avatar::updateFormVisualEffects(float dt)
skeletalSprite.update(dt); skeletalSprite.update(dt);
skeletalSprite.position = bodyPosition; skeletalSprite.position = bodyPosition;
break; break;
case FORM_NORMAL:
case FORM_BEAST:
case FORM_NATURE:
case FORM_DUAL:
case FORM_FISH:
case FORM_MAX:
case FORM_NONE:
break;
} }
} }
@ -5891,7 +5935,7 @@ void Avatar::onUpdate(float dt)
{ {
if (state.spellCharge > 1.5f && chargeLevelAttained <1) if (state.spellCharge > 1.5f && chargeLevelAttained <1)
{ {
chargeLevelAttained = 1.5; chargeLevelAttained = 1;
core->sound->playSfx("PowerUp"); core->sound->playSfx("PowerUp");
chargingEmitter->load("ChargingEnergy2"); chargingEmitter->load("ChargingEnergy2");
} }
@ -5943,6 +5987,13 @@ void Avatar::onUpdate(float dt)
} }
} }
break; break;
case FORM_NORMAL:
case FORM_BEAST:
case FORM_SPIRIT:
case FORM_FISH:
case FORM_MAX:
case FORM_NONE:
break;
} }
} }
/* /*

View file

@ -93,6 +93,8 @@ void CollideEntity::bounce(float ba)
} }
} }
break; break;
case BOUNCE_NONE:
break;
} }

View file

@ -559,6 +559,10 @@ std::string Continuity::getIEString(IngredientData *data, int i)
return ret; return ret;
} }
break; break;
case IET_NONE:
case IET_RANDOM:
case IET_MAX:
break;
} }
return ""; return "";
@ -1192,6 +1196,9 @@ std::string Continuity::getInternalFormName()
return "sun"; return "sun";
case FORM_DUAL: case FORM_DUAL:
return "dual"; return "dual";
case FORM_NONE:
case FORM_MAX:
break;
} }
return ""; return "";
} }
@ -1581,8 +1588,12 @@ void Continuity::castSong(int num)
case SONG_FISHFORM: case SONG_FISHFORM:
dsq->game->avatar->changeForm(FORM_FISH); dsq->game->avatar->changeForm(FORM_FISH);
break; break;
case SONG_SONGDOOR1:
case SONG_MAP: case SONG_MAP:
case SONG_SONGDOOR1:
case SONG_SONGDOOR2:
case SONG_ANIMA:
case SONG_NONE:
case SONG_MAX:
break; break;
#endif #endif
} }

View file

@ -59,74 +59,74 @@ static void Linux_CopyTree(const char *src, const char *dst)
{ {
struct stat statbuf; struct stat statbuf;
if (stat(src, &statbuf) == -1) if (stat(src, &statbuf) == -1)
return; return;
if (S_ISDIR(statbuf.st_mode)) if (S_ISDIR(statbuf.st_mode))
{ {
createDir(dst); // don't care if this fails. createDir(dst); // don't care if this fails.
DIR *dirp = opendir(src); DIR *dirp = opendir(src);
if (dirp == NULL) if (dirp == NULL)
return; return;
struct dirent *dent; struct dirent *dent;
while ((dent = readdir(dirp)) != NULL) while ((dent = readdir(dirp)) != NULL)
{ {
if ((strcmp(dent->d_name, ".") == 0) || (strcmp(dent->d_name, "..") == 0)) if ((strcmp(dent->d_name, ".") == 0) || (strcmp(dent->d_name, "..") == 0))
continue; continue;
const size_t srclen = strlen(src) + strlen(dent->d_name) + 2; const size_t srclen = strlen(src) + strlen(dent->d_name) + 2;
char *subsrc = new char[srclen]; char *subsrc = new char[srclen];
snprintf(subsrc, srclen, "%s/%s", src, dent->d_name); snprintf(subsrc, srclen, "%s/%s", src, dent->d_name);
const size_t dstlen = strlen(dst) + strlen(dent->d_name) + 2; const size_t dstlen = strlen(dst) + strlen(dent->d_name) + 2;
char *subdst = new char[dstlen]; char *subdst = new char[dstlen];
snprintf(subdst, dstlen, "%s/%s", dst, dent->d_name); snprintf(subdst, dstlen, "%s/%s", dst, dent->d_name);
Linux_CopyTree(subsrc, subdst); Linux_CopyTree(subsrc, subdst);
delete[] subdst; delete[] subdst;
delete[] subsrc; delete[] subsrc;
} }
closedir(dirp); closedir(dirp);
} }
else if (S_ISREG(statbuf.st_mode)) else if (S_ISREG(statbuf.st_mode))
{ {
const int in = open(src, O_RDONLY); const int in = open(src, O_RDONLY);
if (in == -1) if (in == -1)
return; return;
// fail if it already exists. That's okay in this case. // fail if it already exists. That's okay in this case.
const int out = open(dst, O_WRONLY | O_CREAT | O_EXCL, 0600); const int out = open(dst, O_WRONLY | O_CREAT | O_EXCL, 0600);
if (out == -1) if (out == -1)
{ {
close(in); close(in);
return; return;
} }
const size_t buflen = 256 * 1024; const size_t buflen = 256 * 1024;
char *buf = new char[buflen]; char *buf = new char[buflen];
bool failed = false; bool failed = false;
ssize_t br = 0; ssize_t br = 0;
while ( (!failed) && ((br = read(in, buf, buflen)) > 0) ) while ( (!failed) && ((br = read(in, buf, buflen)) > 0) )
failed = (write(out, buf, br) != br); failed = (write(out, buf, br) != br);
if (br < 0) if (br < 0)
failed = true; failed = true;
delete[] buf; delete[] buf;
if (close(out) < 0) if (close(out) < 0)
failed = true; failed = true;
close(in); close(in);
if (failed) if (failed)
unlink(dst); unlink(dst);
} }
else else
{ {
fprintf(stderr, "WARNING: we should have copied %s to %s, but it's not a dir or file! Skipped it.\n", src, dst); fprintf(stderr, "WARNING: we should have copied %s to %s, but it's not a dir or file! Skipped it.\n", src, dst);
} }
} }
#endif #endif
@ -782,11 +782,11 @@ static bool sdlVideoModeOK(const int w, const int h, const int bpp)
const int modecount = SDL_GetNumDisplayModes(0); const int modecount = SDL_GetNumDisplayModes(0);
for (int i = 0; i < modecount; i++) { for (int i = 0; i < modecount; i++) {
SDL_GetDisplayMode(0, i, &mode); SDL_GetDisplayMode(0, i, &mode);
if (!mode.w || !mode.h || (w >= mode.w && h >= mode.h)) { if (!mode.w || !mode.h || (w >= mode.w && h >= mode.h)) {
return true; return true;
} }
} }
return false; return false;
#else #else
return SDL_VideoModeOK(w, h, bpp, SDL_OPENGL | SDL_FULLSCREEN); return SDL_VideoModeOK(w, h, bpp, SDL_OPENGL | SDL_FULLSCREEN);
#endif #endif
@ -1683,6 +1683,8 @@ void DSQ::setInputMode(InputMode mode)
core->joystickAsMouse = false; core->joystickAsMouse = false;
updateCursorFromMouse = true; updateCursorFromMouse = true;
break; break;
case INPUT_KEYBOARD:
break;
} }
} }
@ -3916,6 +3918,8 @@ void DSQ::onUpdate(float dt)
case INPUT_JOYSTICK: case INPUT_JOYSTICK:
os << "joystick"; os << "joystick";
break; break;
case INPUT_KEYBOARD:
break;
} }
os << std::endl; os << std::endl;
Bone *b = dsq->game->avatar->skeletalSprite.getBoneByIdx(1); Bone *b = dsq->game->avatar->skeletalSprite.getBoneByIdx(1);

View file

@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "Game.h" #include "Game.h"
ElementEffectData::ElementEffectData() ElementEffectData::ElementEffectData()
: elementEffectIndex(-1) : elementEffectType(EFX_NONE)
, wavyAngleOffset(0) , wavyAngleOffset(0)
, wavyMagnitude(0) , wavyMagnitude(0)
, wavyLerpIn(0) , wavyLerpIn(0)
@ -33,7 +33,7 @@ ElementEffectData::ElementEffectData()
, wavyWaving(false) , wavyWaving(false)
, wavyFlip(false) , wavyFlip(false)
, touching(false) , touching(false)
, elementEffectType(EFX_NONE) , elementEffectIndex(-1)
{ {
} }

View file

@ -998,11 +998,6 @@ bool Entity::touchAvatarDamage(int radius, float dmg, const Vector &override, fl
const float sct = 0.15; const float sct = 0.15;
const float blurMax = 0.01;
const float blurMin = 0.0;
void Entity::onFHScale() void Entity::onFHScale()
{ {
flipScale.interpolateTo(Vector(1, 1), sct); flipScale.interpolateTo(Vector(1, 1), sct);

View file

@ -278,7 +278,6 @@ void Game::warpToSceneNode(std::string scene, std::string node)
if (avatar->isfh()) if (avatar->isfh())
toFlip = 1; toFlip = 1;
core->enqueueJumpState("Game"); core->enqueueJumpState("Game");
} }
@ -3856,6 +3855,7 @@ void Game::playBurstSound(bool wallJump)
case FORM_BEAST: case FORM_BEAST:
sound->playSfx("BeastBurst", (128+rand()%64)/256.0f); sound->playSfx("BeastBurst", (128+rand()%64)/256.0f);
break; break;
default: ;
} }
} }
} }
@ -4766,8 +4766,6 @@ void Game::update(float dt)
cameraInterp.interpolateTo(dest, cameraLerpDelay); cameraInterp.interpolateTo(dest, cameraLerpDelay);
dsq->cameraPos = getCameraPositionFor(cameraInterp); dsq->cameraPos = getCameraPositionFor(cameraInterp);
constrainCamera(); constrainCamera();
float dd = (dsq->cameraPos - oldCamPos).getLength2D();
} }
cameraInterp.update(dt); cameraInterp.update(dt);
@ -4874,8 +4872,7 @@ ElementTemplate Game::getElementTemplateForLetter(int i)
void Game::loadElementTemplates(std::string pack) void Game::loadElementTemplates(std::string pack)
{ {
stringToLower(pack);
stringToLower(pack);
elementTemplates.clear(); elementTemplates.clear();

View file

@ -158,7 +158,7 @@ class EntityClass
{ {
public: public:
EntityClass(std::string name, bool script=false, int idx=-1, std::string prevGfx="", float prevScale=1) EntityClass(std::string name, bool script=false, int idx=-1, std::string prevGfx="", float prevScale=1)
: name(name), script(script), idx(idx), prevGfx(prevGfx), prevScale(prevScale) {} : name(name), prevScale(prevScale), prevGfx(prevGfx), script(script), idx(idx) {}
std::string name; std::string name;
float prevScale; float prevScale;
std::string prevGfx; std::string prevGfx;

View file

@ -109,6 +109,8 @@ class FoodHolder : public Quad
public: public:
FoodHolder(int slot, bool trash=false); FoodHolder(int slot, bool trash=false);
bool isValid() const;
void toggleValid(bool b);
bool isEmpty(); bool isEmpty();
bool isTrash(); bool isTrash();
void setIngredient(IngredientData *i, bool effects=true); void setIngredient(IngredientData *i, bool effects=true);
@ -255,6 +257,16 @@ FoodHolder::FoodHolder(int slot, bool trash) : Quad(), slot(slot), trash(trash)
addChild(lid, PM_POINTER); addChild(lid, PM_POINTER);
} }
bool FoodHolder::isValid() const
{
return alpha.x > 0 && alphaMod > 0;
}
void FoodHolder::toggleValid(bool v)
{
alpha = alphaMod = (float) v;
}
void FoodHolder::animateLid(bool down, bool longAnim) void FoodHolder::animateLid(bool down, bool longAnim)
{ {
float t = 0.2f; float t = 0.2f;
@ -518,7 +530,7 @@ void FoodSlot::moveRight()
for (int i = foodHolders.size()-1; i >= 0; i--) for (int i = foodHolders.size()-1; i >= 0; i--)
{ {
if (foodHolders[i]->alpha.x > 0 && foodHolders[i]->alphaMod > 0 && foodHolders[i]->isEmpty() && !foodHolders[i]->isTrash()) if (foodHolders[i]->isValid() && foodHolders[i]->isEmpty() && !foodHolders[i]->isTrash())
{ {
foodHolders[i]->setIngredient(ingredient); foodHolders[i]->setIngredient(ingredient);
inCookSlot = true; inCookSlot = true;
@ -593,7 +605,7 @@ void FoodSlot::onUpdate(float dt)
break; break;
} }
else if (foodHolders[i]->isEmpty()) else if (foodHolders[i]->isEmpty() && foodHolders[i]->isValid())
{ {
foodHolders[i]->setIngredient(ingredient); foodHolders[i]->setIngredient(ingredient);
inCookSlot = true; inCookSlot = true;
@ -1107,7 +1119,7 @@ void InGameMenu::action(int id, int state, int source)
int trashIndex = -1; int trashIndex = -1;
for (int i = 0; i < foodHolders.size(); i++) for (int i = 0; i < foodHolders.size(); i++)
{ {
if (foodHolders[i]->alpha.x > 0 && foodHolders[i]->alphaMod > 0 && foodHolders[i]->isTrash()) if (foodHolders[i]->isValid() && foodHolders[i]->isTrash())
{ {
trashIndex = i; trashIndex = i;
break; break;
@ -2268,7 +2280,7 @@ void InGameMenu::create()
for (i = 0; i < foodHolders.size(); i++) for (i = 0; i < foodHolders.size(); i++)
{ {
foodHolders[i] = new FoodHolder(i); foodHolders[i] = new FoodHolder(i);
foodHolders[i]->alpha = 0; foodHolders[i]->toggleValid(false);
float angle = (float(holders)/float(foodHolders.size()))*PI*2; float angle = (float(holders)/float(foodHolders.size()))*PI*2;
foodHolders[i]->position = rightCenter + Vector(sinf(angle), cosf(angle))*radius; foodHolders[i]->position = rightCenter + Vector(sinf(angle), cosf(angle))*radius;
@ -2355,7 +2367,7 @@ void InGameMenu::create()
foodHolders.resize(4); foodHolders.resize(4);
foodHolders[3] = new FoodHolder(-1, true); foodHolders[3] = new FoodHolder(-1, true);
foodHolders[3]->alpha = 0; foodHolders[3]->toggleValid(false);
foodHolders[3]->position = rightCenter + Vector(96, 150); foodHolders[3]->position = rightCenter + Vector(96, 150);
menuBg->addChild(foodHolders[3], PM_POINTER); menuBg->addChild(foodHolders[3], PM_POINTER);
@ -3011,7 +3023,7 @@ void InGameMenu::onCook()
longAnim = false; longAnim = false;
for (int i = foodHolders.size()-1; i >= 0; i--) for (int i = foodHolders.size()-1; i >= 0; i--)
if (foodHolders[i]->alpha.x > 0 && !foodHolders[i]->isEmpty() && !foodHolders[i]->isTrash()) if (foodHolders[i]->isValid() && !foodHolders[i]->isEmpty() && !foodHolders[i]->isTrash())
foodHolders[i]->animateLid(true, longAnim); foodHolders[i]->animateLid(true, longAnim);
//dsq->main(0.2); //dsq->main(0.2);
@ -3099,7 +3111,7 @@ void InGameMenu::onCook()
dsq->sound->playSfx("Cook"); dsq->sound->playSfx("Cook");
for (int i = 0; i < foodHolders.size(); i++) for (int i = 0; i < foodHolders.size(); i++)
if (foodHolders[i]->alpha.x > 0 && !foodHolders[i]->isTrash()) if (foodHolders[i]->isValid() && !foodHolders[i]->isTrash())
foodHolders[i]->animateLid(false); foodHolders[i]->animateLid(false);
dsq->spawnParticleEffect("cook-food", Vector(575,250), 0, 0, LR_HUD3, 1); dsq->spawnParticleEffect("cook-food", Vector(575,250), 0, 0, LR_HUD3, 1);
@ -3568,12 +3580,7 @@ void InGameMenu::toggleFoodMenu(bool f)
for (int i = 0; i < foodHolders.size(); i++) for (int i = 0; i < foodHolders.size(); i++)
{ foodHolders[i]->toggleValid(f);
if (f)
foodHolders[i]->alpha = 1;
else
foodHolders[i]->alpha = 0;
}
if (f) if (f)
{ {
@ -3584,11 +3591,11 @@ void InGameMenu::toggleFoodMenu(bool f)
|| ((p=game->getNearestPath(game->avatar->position, PATH_COOK)) || ((p=game->getNearestPath(game->avatar->position, PATH_COOK))
&& p->isCoordinateInside(game->avatar->position))) && p->isCoordinateInside(game->avatar->position)))
{ {
foodHolders[0]->alpha = 1; foodHolders[0]->toggleValid(true);
} }
else else
{ {
foodHolders[0]->alpha = 0; foodHolders[0]->toggleValid(false);
} }
} }
} }

View file

@ -24,9 +24,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "Avatar.h" #include "Avatar.h"
IngredientData::IngredientData(const std::string &name, const std::string &gfx, IngredientType type) IngredientData::IngredientData(const std::string &name, const std::string &gfx, IngredientType type)
: name(name), gfx(gfx), amount(0), maxAmount(MAX_INGREDIENT_AMOUNT), held(0), type(type), marked(0), sorted(false) : name(name)
, displayName(dsq->continuity.getIngredientDisplayName(name)) , gfx(gfx)
, rotKind(!(type == IT_OIL || type == IT_EGG)) , displayName(dsq->continuity.getIngredientDisplayName(name))
, type(type)
, amount(0)
, maxAmount(MAX_INGREDIENT_AMOUNT)
, held(0)
, marked(0)
, rotKind(!(type == IT_OIL || type == IT_EGG))
{ {
} }
@ -46,7 +52,11 @@ bool IngredientData::hasIET(IngredientEffectType iet)
} }
Ingredient::Ingredient(const Vector &pos, IngredientData *data, int amount) Ingredient::Ingredient(const Vector &pos, IngredientData *data, int amount)
: Entity(), data(data), amount(amount), gone(false), used(false) : Entity()
, data(data)
, used(false)
, gone(false)
, amount(amount)
{ {
addType(SCO_INGREDIENT); addType(SCO_INGREDIENT);
entityType = ET_INGREDIENT; entityType = ET_INGREDIENT;

View file

@ -27,7 +27,7 @@ class Logo : public StateObject
{ {
public: public:
Logo(); Logo();
EVENT(JumpTitle, jumpTitle); EVENT(JumpTitle, jumpTitle)
void applyState(); void applyState();
void removeState(); void removeState();
}; };

View file

@ -33,38 +33,38 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
static void MakeRan(void) static void MakeRan(void)
{ {
#ifdef BBGE_BUILD_WINDOWS #ifdef BBGE_BUILD_WINDOWS
std::ofstream out("ran"); std::ofstream out("ran");
if(out) if(out)
{ {
for (int i = 0; i < 32; i++) for (int i = 0; i < 32; i++)
out << rand()%1000; out << rand()%1000;
out.close(); out.close();
} }
#endif #endif
} }
static void StartAQConfig() static void StartAQConfig()
{ {
#if defined(BBGE_BUILD_WINDOWS) #if defined(BBGE_BUILD_WINDOWS)
if (!exists("ran", false, true)) if (!exists("ran", false, true))
{ {
MakeRan(); MakeRan();
if(exists("AQConfig.exe", false, true)) if(exists("AQConfig.exe", false, true))
{ {
ShellExecute(NULL, "open", "AQConfig.exe", NULL, NULL, SW_SHOWNORMAL); ShellExecute(NULL, "open", "AQConfig.exe", NULL, NULL, SW_SHOWNORMAL);
exit(0); exit(0);
} }
} }
remove("ran"); remove("ran");
#endif #endif
} }
static void CheckConfig(void) static void CheckConfig(void)
{ {
#ifdef BBGE_BUILD_WINDOWS #ifdef BBGE_BUILD_WINDOWS
bool hasCfg = exists("usersettings.xml", false, true); bool hasCfg = exists("usersettings.xml", false, true);
if(!hasCfg) if(!hasCfg)
StartAQConfig(); StartAQConfig();
#endif #endif
} }
@ -92,16 +92,16 @@ static void CheckConfig(void)
#endif #endif
CheckConfig(); CheckConfig();
{ {
DSQ dsql(dsqParam, extraDataDir); DSQ dsql(dsqParam, extraDataDir);
dsql.init(); dsql.init();
dsql.run(); dsql.run();
dsql.shutdown(); dsql.shutdown();
} }
MakeRan(); MakeRan();
return (0); return (0);
} }

View file

@ -286,12 +286,12 @@ void MiniMapRender::toggle(int t)
float MiniMapRender::getMiniMapWidth() const float MiniMapRender::getMiniMapWidth() const
{ {
return scale.x * miniMapSize; return scale.x * miniMapSize;
} }
float MiniMapRender::getMiniMapHeight() const float MiniMapRender::getMiniMapHeight() const
{ {
return scale.y * miniMapSize; return scale.y * miniMapSize;
} }
void MiniMapRender::onUpdate(float dt) void MiniMapRender::onUpdate(float dt)

View file

@ -41,8 +41,13 @@ static bool _modname_cmp(const ModIcon *a, const ModIcon *b)
return a->fname < b->fname; return a->fname < b->fname;
} }
ModSelectorScreen::ModSelectorScreen() : Quad(), ActionMapper(), ModSelectorScreen::ModSelectorScreen()
currentPanel(-1), gotServerList(false), dlText(&dsq->smallFont), subtext(&dsq->subsFont) : Quad()
, ActionMapper()
, dlText(&dsq->smallFont)
, gotServerList(false)
, currentPanel(-1)
, subtext(&dsq->subsFont)
{ {
followCamera = 1; followCamera = 1;
shareAlphaWithChildren = false; shareAlphaWithChildren = false;
@ -131,7 +136,7 @@ void ModSelectorScreen::showPanel(int id)
if(id == currentPanel) if(id == currentPanel)
return; return;
const float t = 0.2f; //const float t = 0.2f;
IconGridPanel *newgrid = panels[id]; IconGridPanel *newgrid = panels[id];
// fade in selected panel // fade in selected panel
@ -480,7 +485,11 @@ void BasicIcon::onClick()
dsq->sound->playSfx("denied"); dsq->sound->playSfx("denied");
} }
MenuIcon::MenuIcon(int id) : SubtitleIcon(), iconId(id), cb(0), cb_data(0) MenuIcon::MenuIcon(int id)
: SubtitleIcon()
, cb(0)
, cb_data(0)
, iconId(id)
{ {
} }
@ -623,7 +632,13 @@ void ModIcon::updateStatus()
ModIconOnline::ModIconOnline() ModIconOnline::ModIconOnline()
: SubtitleIcon(), pb(0), extraIcon(0), statusIcon(0), clickable(true), pkgtype(MPT_MOD), hasUpdate(false) : SubtitleIcon()
, pb(0)
, extraIcon(0)
, statusIcon(0)
, pkgtype(MPT_MOD)
, clickable(true)
, hasUpdate(false)
{ {
label = desc; label = desc;
} }
@ -881,7 +896,7 @@ void MenuIconBar::add(MenuIcon *ico)
} }
IconGridPanel::IconGridPanel() IconGridPanel::IconGridPanel()
: spacing(0), y(0), x(0) : spacing(0), x(0), y(0)
{ {
shareAlphaWithChildren = false; // patch selection icons need their own alpha, use fade() instead shareAlphaWithChildren = false; // patch selection icons need their own alpha, use fade() instead
alphaMod = 0.01f; alphaMod = 0.01f;

View file

@ -60,7 +60,7 @@ protected:
minihttp::HttpSocket::_OnOpen(); minihttp::HttpSocket::_OnOpen();
const Request& r = GetCurrentRequest(); //const Request& r = GetCurrentRequest();
// TODO ?? // TODO ??
} }

View file

@ -587,9 +587,6 @@ void Path::update(float dt)
Vector start = nodes[0].position; Vector start = nodes[0].position;
Vector end = nodes[1].position; Vector end = nodes[1].position;
Vector v = end - start; Vector v = end - start;
Vector left = v.getPerpendicularLeft();
Vector right = v.getPerpendicularRight();
Vector mid = (end-start) + start;
FOR_ENTITIES(i) FOR_ENTITIES(i)
{ {
Entity *e = *i; Entity *e = *i;

View file

@ -28,7 +28,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
class SearchGridRaw class SearchGridRaw
{ {
public: public:
SearchGridRaw(ObsType blocking) : game(dsq->game), blockingObsBits(blocking) {} SearchGridRaw(ObsType blocking) : blockingObsBits(blocking), game(dsq->game) {}
inline bool operator()(unsigned x, unsigned y) const inline bool operator()(unsigned x, unsigned y) const
{ {
return (game->getGridRaw(TileVector(x, y)) & blockingObsBits) == OT_EMPTY; return (game->getGridRaw(TileVector(x, y)) & blockingObsBits) == OT_EMPTY;
@ -79,8 +79,7 @@ void PathFinding::molestPath(VectorPath &path)
{ {
Vector node = path.getPathNode(i)->value; Vector node = path.getPathNode(i)->value;
float dist; float dist;
int sample = 20; const int sample = 20;
float maxDist = sample * TILE_SIZE;
{ {
Vector n = dsq->game->getWallNormal(node, sample, &dist); Vector n = dsq->game->getWallNormal(node, sample, &dist);
if (dist != -1 && (n.x != 0 || n.y != 0)) if (dist != -1 && (n.x != 0 || n.y != 0))

View file

@ -410,28 +410,28 @@ void SceneEditor::openMainMenu()
core->run(FRAME_TIME); core->run(FRAME_TIME);
} }
addMainMenuItem("LOAD LEVEL... (SHIFT-F1)", 100); addMainMenuItem("LOAD LEVEL... (SHIFT-F1)", 100);
addMainMenuItem("RELOAD LEVEL (F1)", 101); addMainMenuItem("RELOAD LEVEL (F1)", 101);
addMainMenuItem("SAVE LEVEL (F2)", 102); addMainMenuItem("SAVE LEVEL (F2)", 102);
addMainMenuItem("EDIT TILES (F5)", 106); addMainMenuItem("EDIT TILES (F5)", 106);
addMainMenuItem("EDIT ENTITIES (F6)", 107); addMainMenuItem("EDIT ENTITIES (F6)", 107);
addMainMenuItem("EDIT NODES (F7)", 108); addMainMenuItem("EDIT NODES (F7)", 108);
addMainMenuItem("REGEN COLLISIONS (ALT-R)", 103); addMainMenuItem("REGEN COLLISIONS (ALT-R)", 103);
addMainMenuItem("RECACHE TEXTURES (CTRL-R)", 130); addMainMenuItem("RECACHE TEXTURES (CTRL-R)", 130);
addMainMenuItem("REGEN ROCK FROM MAPTEMPLATE (F11+F12)", 116); addMainMenuItem("REGEN ROCK FROM MAPTEMPLATE (F11+F12)", 116);
addMainMenuItem("SET BG GRADIENT", 110); addMainMenuItem("SET BG GRADIENT", 110);
addMainMenuItem("SET MUSIC", 111); addMainMenuItem("SET MUSIC", 111);
addMainMenuItem("ENTITY GROUPS (CTRL-E)", 112); addMainMenuItem("ENTITY GROUPS (CTRL-E)", 112);
if (dsq->game->gridRender) if (dsq->game->gridRender)
addMainMenuItem(std::string("TOGGLE TILE COLLISION RENDER ") + ((dsq->game->gridRender->alpha!=0) ? "OFF" : "ON ") + std::string(" (F9)"), 113); addMainMenuItem(std::string("TOGGLE TILE COLLISION RENDER ") + ((dsq->game->gridRender->alpha!=0) ? "OFF" : "ON ") + std::string(" (F9)"), 113);
addMainMenuItem("SCREENSHOT ", 114); addMainMenuItem("SCREENSHOT ", 114);
addMainMenuItem("PARTICLE VIEWER ", 120); addMainMenuItem("PARTICLE VIEWER ", 120);
addMainMenuItem("ANIMATION EDITOR ", 115); addMainMenuItem("ANIMATION EDITOR ", 115);
while (1 && !core->getKeyState(KEY_TAB)) while (1 && !core->getKeyState(KEY_TAB))
{ {
@ -788,11 +788,11 @@ void SceneEditor::reversePath()
void SceneEditor::setGridPattern(int gi) void SceneEditor::setGridPattern(int gi)
{ {
if (selectedElements.size()) if (selectedElements.size())
for (int i = 0; i < selectedElements.size(); ++i) for (int i = 0; i < selectedElements.size(); ++i)
selectedElements[i]->setElementEffectByIndex(gi); selectedElements[i]->setElementEffectByIndex(gi);
else if (editingElement) else if (editingElement)
editingElement->setElementEffectByIndex(gi); editingElement->setElementEffectByIndex(gi);
} }
void SceneEditor::setGridPattern0() void SceneEditor::setGridPattern0()
@ -2741,6 +2741,9 @@ void SceneEditor::updateText()
if (getSelectedPath()) if (getSelectedPath())
os << " name: " << getSelectedPath()->name; os << " name: " << getSelectedPath()->name;
break; break;
case ET_SELECTENTITY:
case ET_MAX:
break;
} }
text->setText(os.str()); text->setText(os.str());
} }
@ -2806,6 +2809,10 @@ void SceneEditor::update(float dt)
else else
placer->alpha = 0.5; placer->alpha = 0.5;
break; break;
case ET_PATHS:
case ET_SELECTENTITY:
case ET_MAX:
break;
} }
updateText(); updateText();
@ -2913,6 +2920,9 @@ void SceneEditor::update(float dt)
if (selectedIdx >= 0) if (selectedIdx >= 0)
dsq->game->getPath(selectedIdx)->nodes[selectedNode].position = dsq->getGameCursorPosition() + cursorOffset; dsq->game->getPath(selectedIdx)->nodes[selectedNode].position = dsq->getGameCursorPosition() + cursorOffset;
break; break;
case ES_ROTATING:
case ES_MAX:
break;
} }
} }
else if (editType == ET_ENTITIES) else if (editType == ET_ENTITIES)
@ -2940,6 +2950,11 @@ void SceneEditor::update(float dt)
} }
} }
} }
break;
case ES_SELECTING:
case ES_SCALING:
case ES_MAX:
break;
} }
} }
else if (editType == ET_ELEMENTS) else if (editType == ET_ELEMENTS)
@ -3007,7 +3022,7 @@ void SceneEditor::update(float dt)
else if (cursorOffset.x < oldPosition.x-10) else if (cursorOffset.x < oldPosition.x-10)
right = false; right = false;
else else
noSide++; noSide = true;
if (cursorOffset.y > oldPosition.y+10) if (cursorOffset.y > oldPosition.y+10)
down = true; down = true;
else if (cursorOffset.y < oldPosition.y-10) else if (cursorOffset.y < oldPosition.y-10)
@ -3105,6 +3120,8 @@ void SceneEditor::update(float dt)
} }
} }
break; break;
case ES_MAX:
break;
} }
} }
} }

View file

@ -25,10 +25,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
const float strengthSeparation = 1; const float strengthSeparation = 1;
const float strengthAlignment = 0.8f; const float strengthAlignment = 0.8f;
const float strengthAvoidance = 1; //const float strengthAvoidance = 1;
const float strengthCohesion = 0.5f; const float strengthCohesion = 0.5f;
const float avoidanceDistance = 128; //const float avoidanceDistance = 128;
const float separationDistance = 128; const float separationDistance = 128;
const float minUrgency = 5;//0.05; const float minUrgency = 5;//0.05;
const float maxUrgency = 10;//0.1; const float maxUrgency = 10;//0.1;
@ -317,12 +317,12 @@ void SchoolFish::applySeparation(Vector &accumulator)
if (!change.isZero()) if (!change.isZero())
{ {
change.setLength2D(-ratio); change.setLength2D(-ratio);
accumulator += change; accumulator += change;
} }
} }
// Are we too far from nearest flockmate? Then Move Closer // Are we too far from nearest flockmate? Then Move Closer
/* /*
else if (dist > separationDistance) else if (dist > separationDistance)
change |= ratio; change |= ratio;
*/ */
} }

View file

@ -598,16 +598,6 @@ BaseText *getText(lua_State *L, int slot = 1)
return q; return q;
} }
static inline
Shader *getShader(lua_State *L, int slot = 1)
{
Shader *q = (Shader*)lua_touserdata(L, slot);
ENSURE_TYPE(q, SCO_SHADER);
if (!q)
scriptDebug(L, "Invalid Shader");
return q;
}
static SkeletalSprite *getSkeletalSprite(Entity *e) static SkeletalSprite *getSkeletalSprite(Entity *e)
{ {
return e ? &e->skeletalSprite : NULL; return e ? &e->skeletalSprite : NULL;
@ -893,7 +883,7 @@ luaFunc(os_setclipboard)
luaFunc(os_getclipboard) luaFunc(os_getclipboard)
{ {
const char *s = SDL_GetClipboardText(); char *s = SDL_GetClipboardText();
lua_pushstring(L, s ? s : ""); lua_pushstring(L, s ? s : "");
if(s) if(s)
SDL_free(s); SDL_free(s);
@ -4575,7 +4565,7 @@ luaFunc(entity_getAnimationLoop)
luaFunc(entity_move) luaFunc(entity_move)
{ {
Entity *e = entity(L); Entity *e = entity(L);
bool ease = lua_tointeger(L, 5); //bool ease = lua_tointeger(L, 5);
Vector p(lua_tonumber(L, 2), lua_tonumber(L, 3)); Vector p(lua_tonumber(L, 2), lua_tonumber(L, 3));
if (getBool(L, 6)) if (getBool(L, 6))
p = e->position + p; p = e->position + p;
@ -7712,7 +7702,7 @@ luaFunc(getNearestEntity)
Vector p(lua_tonumber(L, 1), lua_tonumber(L, 2)); Vector p(lua_tonumber(L, 1), lua_tonumber(L, 2));
int radius = lua_tointeger(L, 3); int radius = lua_tointeger(L, 3);
Entity *ignore = lua_isuserdata(L, 4) ? entity(L, 4) : NULL; Entity *ignore = lua_isuserdata(L, 4) ? entity(L, 4) : NULL;
EntityType et = lua_isnumber(L, 5) ? (EntityType)lua_tointeger(L, 5) : ET_NOTYPE; //EntityType et = lua_isnumber(L, 5) ? (EntityType)lua_tointeger(L, 5) : ET_NOTYPE;
DamageType dt = lua_isnumber(L, 6) ? (DamageType)lua_tointeger(L, 6) : DT_NONE; DamageType dt = lua_isnumber(L, 6) ? (DamageType)lua_tointeger(L, 6) : DT_NONE;
int lrStart = lua_isnumber(L, 7) ? lua_tointeger(L, 7) : -1; int lrStart = lua_isnumber(L, 7) ? lua_tointeger(L, 7) : -1;
int lrEnd = lua_isnumber(L, 8) ? lua_tointeger(L, 8) : -1; int lrEnd = lua_isnumber(L, 8) ? lua_tointeger(L, 8) : -1;
@ -9727,6 +9717,7 @@ static const struct {
luaRegister(entity_setDeathParticleEffect), luaRegister(entity_setDeathParticleEffect),
luaRegister(entity_setDeathSound), luaRegister(entity_setDeathSound),
luaRegister(entity_setStopSoundsOnDeath),
luaRegister(entity_setDamageTarget), luaRegister(entity_setDamageTarget),
luaRegister(entity_setAllDamageTargets), luaRegister(entity_setAllDamageTargets),
@ -9979,7 +9970,7 @@ static const struct {
luaRegister(resetTimer), luaRegister(resetTimer),
luaRegister(addInfluence), luaRegister(addInfluence),
luaRegister(setSuckPosition), luaRegister(getSuckPosition),
luaRegister(setSuckPosition), luaRegister(setSuckPosition),
luaRegister(setNumSuckPositions), luaRegister(setNumSuckPositions),
luaRegister(setupBasicEntity), luaRegister(setupBasicEntity),
@ -10585,8 +10576,9 @@ static const struct {
luaRegister(minimap_setWaterBitTex), luaRegister(minimap_setWaterBitTex),
luaRegister(minimap_setTopTex), luaRegister(minimap_setTopTex),
luaRegister(minimap_setBottomTex), luaRegister(minimap_setBottomTex),
luaRegister(minimap_setAvatarIconTex), luaRegister(minimap_setAvatarIconTex),
luaRegister(minimap_setHealthBarTex), luaRegister(minimap_setHealthBarTex),
luaRegister(minimap_setMaxHealthMarkerTex),
luaRegister(entity_mmicon_delete), luaRegister(entity_mmicon_delete),
luaRegister(entity_mmicon_tex), luaRegister(entity_mmicon_tex),
luaRegister(entity_mmicon_size), luaRegister(entity_mmicon_size),
@ -10608,7 +10600,7 @@ static const struct {
#undef MK_ALIAS #undef MK_ALIAS
#define MK_FUNC(base, getter, prefix, suffix) luaRegister(prefix##_##suffix), #define MK_FUNC(base, getter, prefix, suffix) luaRegister(prefix##_##suffix),
#define MK_STR(s) #s #define MK_STR(s) #s
#define MK_ALIAS(prefix, suffix, alias) {MK_STR(prefix)"_"MK_STR(alias), l_##prefix##_##suffix}, #define MK_ALIAS(prefix, suffix, alias) {MK_STR(prefix) "_" MK_STR(alias), l_##prefix##_##suffix},
EXPAND_FUNC_PROTOTYPES EXPAND_FUNC_PROTOTYPES
@ -11368,12 +11360,12 @@ lua_State *ScriptInterface::createLuaVM()
luaL_openlibs(state); luaL_openlibs(state);
#ifdef LUAAPI_HAS_CLIPBOARD #ifdef LUAAPI_HAS_CLIPBOARD
lua_getglobal(L, "os"); lua_getglobal(state, "os");
lua_pushcfunction(L, l_os_getclipboard); lua_pushcfunction(state, l_os_getclipboard);
lua_setfield(L, -2, "getclipboard"); lua_setfield(state, -2, "getclipboard");
lua_pushcfunction(L, l_os_setclipboard); lua_pushcfunction(state, l_os_setclipboard);
lua_setfield(L, -2, "setclipboard"); lua_setfield(state, -2, "setclipboard");
lua_pop(L, 1); lua_pop(state, 1);
#endif #endif
if(!allowUnsafeFunctions) if(!allowUnsafeFunctions)

View file

@ -93,7 +93,7 @@ const int FLAG_SPIRIT_DRASK = 126;
const int FLAG_SPIRIT_DRUNIAD = 127; const int FLAG_SPIRIT_DRUNIAD = 127;
const int FLAG_TRANSTURTLE_VEIL01 = 130; const int FLAG_TRANSTURTLE_VEIL01 = 130;
const int FLAG_TRANSTURTLE_OPENWATER06 = 131; //const int FLAG_TRANSTURTLE_OPENWATER06 = 131;
const int FLAG_TRANSTURTLE_FOREST04 = 132; const int FLAG_TRANSTURTLE_FOREST04 = 132;
const int FLAG_TRANSTURTLE_OPENWATER03 = 133; const int FLAG_TRANSTURTLE_OPENWATER03 = 133;
const int FLAG_TRANSTURTLE_FOREST05 = 134; const int FLAG_TRANSTURTLE_FOREST05 = 134;
@ -105,15 +105,15 @@ const int FLAG_TRANSTURTLE_FINALBOSS = 139;
const int FLAG_SEAHORSEBESTTIME = 247; const int FLAG_SEAHORSEBESTTIME = 247;
const int FLAG_MINIBOSS_START = 700; //const int FLAG_MINIBOSS_START = 700;
const int FLAG_MINIBOSS_NAUTILUSPRIME = 700; //const int FLAG_MINIBOSS_NAUTILUSPRIME = 700;
const int FLAG_MINIBOSS_KINGJELLY = 701; const int FLAG_MINIBOSS_KINGJELLY = 701;
const int FLAG_MINIBOSS_MERGOG = 702; const int FLAG_MINIBOSS_MERGOG = 702;
const int FLAG_MINIBOSS_CRAB = 703; const int FLAG_MINIBOSS_CRAB = 703;
const int FLAG_MINIBOSS_OCTOMUN = 704; const int FLAG_MINIBOSS_OCTOMUN = 704;
const int FLAG_MINIBOSS_MANTISSHRIMP = 705; const int FLAG_MINIBOSS_MANTISSHRIMP = 705;
const int FLAG_MINIBOSS_PRIESTS = 706; //const int FLAG_MINIBOSS_PRIESTS = 706;
const int FLAG_MINIBOSS_END = 720; //const int FLAG_MINIBOSS_END = 720;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -778,7 +778,7 @@ void StatsAndAchievements::UnlockAchievement( Achievement &achievement )
achievement.iconImage = 0; achievement.iconImage = 0;
#ifdef BBGE_BUILD_ACHIEVEMENTS_INTERNAL #ifdef BBGE_BUILD_ACHIEVEMENTS_INTERNAL
unlockedToBeDisplayed.push( std::string(achievement.name) ); unlockedToBeDisplayed.push( std::string(achievement.name) );
#endif #endif
// Store stats end of frame // Store stats end of frame

View file

@ -155,7 +155,7 @@ private:
// Should we store stats this frame? // Should we store stats this frame?
bool storeStats; bool storeStats;
PlayStats playStats; // PlayStats playStats;
// Current Stat details // Current Stat details
//float m_flGameFeetTraveled; //float m_flGameFeetTraveled;

View file

@ -259,10 +259,6 @@ void AfterEffectManager::renderGrid()
if (activeShader) if (activeShader)
activeShader->unbind(); activeShader->unbind();
float width2 = float(vw)/2;
float height2 = float(vh)/2;
if(firstShader != lastShader) if(firstShader != lastShader)
{ {
// From here on: secondary shader passes. // From here on: secondary shader passes.

View file

@ -29,6 +29,7 @@ class Effect
{ {
public: public:
Effect(); Effect();
virtual ~Effect(){};
virtual void go(){} virtual void go(){}
virtual void update(float dt, Vector ** drawGrid, int xDivs, int yDivs){} virtual void update(float dt, Vector ** drawGrid, int xDivs, int yDivs){}
bool done; bool done;

View file

@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifdef BBGE_BUILD_VFS #ifdef BBGE_BUILD_VFS
# include "ttvfs.h" # include "ttvfs.h"
# ifndef VFS_IGNORE_CASE # ifndef VFS_IGNORE_CASE
# error Must define VFS_IGNORE_CASE, see VFSDefines.h # error Must define VFS_IGNORE_CASE, see VFSDefines.h
# endif # endif
ttvfs::Root vfs; // extern ttvfs::Root vfs; // extern
#endif #endif
@ -62,12 +62,12 @@ std::string removeSpaces(const std::string &input)
unsigned hash(const std::string &string) unsigned hash(const std::string &string)
{ {
unsigned hash = 5381; unsigned hash = 5381;
for (int i = 0; i < string.size(); i++) for (int i = 0; i < string.size(); i++)
hash = ((hash << 5) + hash) + (unsigned char)string[i]; hash = ((hash << 5) + hash) + (unsigned char)string[i];
return hash; return hash;
} }
@ -113,11 +113,6 @@ static unsigned char charIsUpper(unsigned char c)
return c == upperToLowerTable[c]; return c == upperToLowerTable[c];
} }
static unsigned char charIsLower(unsigned char c)
{
return c == lowerToUpperTable[c];
}
static unsigned char charToLower(unsigned char c) static unsigned char charToLower(unsigned char c)
{ {
return upperToLowerTable[c]; return upperToLowerTable[c];
@ -190,8 +185,8 @@ void stringToLowerUserData(std::string &s)
const std::string userdata = core->getUserDataFolder(); const std::string userdata = core->getUserDataFolder();
const size_t len = userdata.length(); const size_t len = userdata.length();
const bool match = (s.length() > len) && const bool match = (s.length() > len) &&
((s[len] == '/') || (s[len] == '\\')) && ((s[len] == '/') || (s[len] == '\\')) &&
!strncmp(userdata.c_str(), s.c_str(), len); !strncmp(userdata.c_str(), s.c_str(), len);
if (!match) if (!match)
stringToLower(s); stringToLower(s);
else else
@ -211,18 +206,18 @@ int nocasecmp(const std::string &s1, const std::string &s2)
//stop when either string's end has been reached //stop when either string's end has been reached
while ( *it1 && *it2 ) while ( *it1 && *it2 )
{ {
if(charToUpper(*it1) != charToUpper(*it2)) //letters differ? if(charToUpper(*it1) != charToUpper(*it2)) //letters differ?
// return -1 to indicate smaller than, 1 otherwise // return -1 to indicate smaller than, 1 otherwise
return (charToUpper(*it1) < charToUpper(*it2)) ? -1 : 1; return (charToUpper(*it1) < charToUpper(*it2)) ? -1 : 1;
//proceed to the next character in each string //proceed to the next character in each string
++it1; ++it1;
++it2; ++it2;
} }
size_t size1=s1.size(), size2=s2.size();// cache lengths size_t size1=s1.size(), size2=s2.size();// cache lengths
//return -1,0 or 1 according to strings' lengths //return -1,0 or 1 according to strings' lengths
if (size1==size2) if (size1==size2)
return 0; return 0;
return (size1<size2) ? -1 : 1; return (size1<size2) ? -1 : 1;
} }
#endif // #if !HAVE_STRCASECMP #endif // #if !HAVE_STRCASECMP
@ -355,27 +350,26 @@ std::string stripEndlineForUnix(const std::string &in)
return out; return out;
} }
bool isTouchingLine(Vector lineStart, Vector lineEnd, Vector point, int radius, Vector *closestP) bool isTouchingLine(Vector lineStart, Vector lineEnd, Vector point, int radius, Vector *closestP)
{ {
Vector dir = lineEnd - lineStart; Vector dir = lineEnd - lineStart;
Vector diff = point - lineStart; Vector diff = point - lineStart;
Vector closest; Vector closest;
if (!dir.isZero()) { if (!dir.isZero()) {
float t = diff.dot2D(dir) / dir.dot2D(dir); float t = diff.dot2D(dir) / dir.dot2D(dir);
if (t < 0.0f) if (t < 0.0f)
t = 0.0f; t = 0.0f;
if (t > 1.0f) if (t > 1.0f)
t = 1.0f; t = 1.0f;
closest = lineStart + t * dir; closest = lineStart + t * dir;
} else { } else {
closest = lineStart; closest = lineStart;
} }
Vector d = point - closest; Vector d = point - closest;
float distsqr = d.dot2D(d); float distsqr = d.dot2D(d);
if (closestP) if (closestP)
(*closestP) = closest; (*closestP) = closest;
return distsqr <= radius*radius; return distsqr <= radius*radius;
} }
Vector randVector(float mag) Vector randVector(float mag)

View file

@ -350,7 +350,7 @@ Core::Core(const std::string &filesystem, const std::string& extraDataDir, int n
#if defined(BBGE_BUILD_UNIX) #if defined(BBGE_BUILD_UNIX)
const char *envr = getenv("HOME"); const char *envr = getenv("HOME");
if (envr == NULL) if (envr == NULL)
envr = "."; // oh well. envr = "."; // oh well.
const std::string home(envr); const std::string home(envr);
createDir(home); // just in case. createDir(home); // just in case.
@ -769,7 +769,6 @@ bool Core::initGraphicsLibrary(int width, int height, bool fullscreen, bool vsyn
#endif #endif
initIcon(gScreen); initIcon(gScreen);
// Create window
std::ostringstream os; std::ostringstream os;
os << "setting vsync: " << vsync; os << "setting vsync: " << vsync;
@ -979,22 +978,22 @@ void Core::applyState(const std::string &state)
#ifdef BBGE_BUILD_WINDOWS #ifdef BBGE_BUILD_WINDOWS
void centerWindow(HWND hwnd) void centerWindow(HWND hwnd)
{ {
int x, y; int x, y;
HWND hwndDeskTop; HWND hwndDeskTop;
RECT rcWnd, rcDeskTop; RECT rcWnd, rcDeskTop;
// Get a handle to the desktop window // Get a handle to the desktop window
hwndDeskTop = ::GetDesktopWindow(); hwndDeskTop = ::GetDesktopWindow();
// Get dimension of desktop in a rect // Get dimension of desktop in a rect
::GetWindowRect(hwndDeskTop, &rcDeskTop); ::GetWindowRect(hwndDeskTop, &rcDeskTop);
// Get dimension of main window in a rect // Get dimension of main window in a rect
::GetWindowRect(hwnd, &rcWnd); ::GetWindowRect(hwnd, &rcWnd);
// Find center of desktop // Find center of desktop
x = (rcDeskTop.right - rcDeskTop.left)/2; x = (rcDeskTop.right - rcDeskTop.left)/2;
y = (rcDeskTop.bottom - rcDeskTop.top)/2; y = (rcDeskTop.bottom - rcDeskTop.top)/2;
x -= (rcWnd.right - rcWnd.left)/2; x -= (rcWnd.right - rcWnd.left)/2;
y -= (rcWnd.bottom - rcWnd.top)/2; y -= (rcWnd.bottom - rcWnd.top)/2;
// Set top and left to center main window on desktop // Set top and left to center main window on desktop
::SetWindowPos(hwnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE); ::SetWindowPos(hwnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE);
} }
#endif #endif
@ -1002,7 +1001,7 @@ void centerWindow(HWND hwnd)
// No longer part of C/C++ standard // No longer part of C/C++ standard
#ifndef M_PI #ifndef M_PI
#define M_PI 3.14159265358979323846 #define M_PI 3.14159265358979323846
#endif #endif
void Core::setPixelScale(int pixelScaleX, int pixelScaleY) void Core::setPixelScale(int pixelScaleX, int pixelScaleY)
@ -1158,7 +1157,7 @@ std::string getScreenshotFilename(bool png)
std::ostringstream os; std::ostringstream os;
os << prefix << screenshotNum << ext; os << prefix << screenshotNum << ext;
screenshotNum ++; screenshotNum ++;
std::string str(os.str()); std::string str(os.str());
if (!core->exists(str)) // keep going until we hit an unused filename. if (!core->exists(str)) // keep going until we hit an unused filename.
return str; return str;
} }
@ -1195,7 +1194,6 @@ void Core::run(float runTime)
float dt; float dt;
float counter = 0; float counter = 0;
int frames = 0; int frames = 0;
float real_dt = 0;
#if !defined(_DEBUG) #if !defined(_DEBUG)
bool wasInactive = false; bool wasInactive = false;

View file

@ -164,8 +164,15 @@ void DebugFont::setAlign(Align align)
#include "../BBGE/Quad.h" #include "../BBGE/Quad.h"
DebugButton::DebugButton(int buttonID, DebugButtonReceiver *receiver, int bgWidth, int fsize) DebugButton::DebugButton(int buttonID, DebugButtonReceiver *receiver, int bgWidth, int fsize)
: RenderObject(), label(0), highlight(0), receiver(receiver), buttonID(buttonID) : RenderObject()
, activeAlpha(0.5f), activeColor(1,1,1), inactiveAlpha(0.5f), inactiveColor(0,0,0) , label(0)
, buttonID(buttonID)
, highlight(0)
, receiver(receiver)
, activeAlpha(0.5f)
, activeColor(1,1,1)
, inactiveAlpha(0.5f)
, inactiveColor(0,0,0)
{ {
if (bgWidth == 0) if (bgWidth == 0)
bgWidth = 150; bgWidth = 150;

View file

@ -82,6 +82,8 @@ void PostProcessingFX::render()
FXTypes type = (FXTypes)i; FXTypes type = (FXTypes)i;
switch(type) switch(type)
{ {
case FXT_MAX:
break;
case FXT_RADIALBLUR: case FXT_RADIALBLUR:
float windowW = core->getWindowWidth(); float windowW = core->getWindowWidth();

View file

@ -26,7 +26,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
enum FXTypes enum FXTypes
{ {
FTX_NONE =-1,
FXT_RADIALBLUR =0, FXT_RADIALBLUR =0,
FXT_MAX FXT_MAX
}; };

View file

@ -50,7 +50,7 @@ public:
private: private:
T *callee; T *callee;
void (T::*callback)(void); void (T::*callback)(void);
}; };
template <class T> template <class T>
@ -67,7 +67,7 @@ public:
private: private:
T *callee; T *callee;
void (T::*callback)(Event *e); void (T::*callback)(Event *e);
}; };
#define EVENT(x,y) class x : public Event { public: void act(); }; x y; #define EVENT(x,y) class x : public Event { public: void act(); }; x y;

View file

@ -185,7 +185,7 @@ protected:
struct ParticleInfluence struct ParticleInfluence
{ {
ParticleInfluence(Vector pos, float spd, float size, bool pull) ParticleInfluence(Vector pos, float spd, float size, bool pull)
: pos(pos), spd(spd), size(size), pull(pull) : pos(pos), size(size), spd(spd), pull(pull)
{} {}
ParticleInfluence() : size(0), spd(0), pull(false) {} ParticleInfluence() : size(0), spd(0), pull(false) {}
Vector pos; Vector pos;

View file

@ -142,7 +142,7 @@ void Precacher::precacheList(const std::string &list, void progressCallback())
t = t.substr(0,t.size()-1); t = t.substr(0,t.size()-1);
debugLog("precache["+t+"]"); debugLog("precache["+t+"]");
#endif #endif
stringToLower(t); stringToLower(t);
precacheTex(t); precacheTex(t);
} }
} }

View file

@ -23,7 +23,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "RenderBase.h" #include "RenderBase.h"
QuadTrail::QuadTrail(int maxPoints, float pointDist) QuadTrail::QuadTrail(int maxPoints, float pointDist)
: RenderObject(), maxPoints(maxPoints), pointDist(pointDist), numPoints(0) : RenderObject()
, numPoints(0)
, maxPoints(maxPoints)
, pointDist(pointDist)
{ {
quadTrailAlphaEffect = QTAE_NORMAL; quadTrailAlphaEffect = QTAE_NORMAL;
cull = false; cull = false;

View file

@ -73,9 +73,9 @@ void Shader::staticInit()
// everything fine when we are here // everything fine when we are here
_useShaders = true; _useShaders = true;
#endif
end: end:
#endif
if (_useShaders) if (_useShaders)
debugLog("Shader support enabled."); debugLog("Shader support enabled.");
@ -187,7 +187,7 @@ void Shader::load(const std::string &file, const std::string &fragFile)
this->vertFile = file; this->vertFile = file;
this->fragFile = fragFile; this->fragFile = fragFile;
char *vertCode = file.length() ? readFile(file) : NULL; char *vertCode = file.length() ? readFile(file) : NULL;
char *fragCode = fragFile.length() ? readFile(fragFile) : NULL; char *fragCode = fragFile.length() ? readFile(fragFile) : NULL;
loadSrc(vertCode, fragCode); loadSrc(vertCode, fragCode);
@ -288,14 +288,14 @@ void Shader::_setUniform(Uniform *u)
{ {
switch(u->type) switch(u->type)
{ {
case GL_FLOAT: glUniform1fvARB(u->location, 1, u->data.f); break; case GL_FLOAT: glUniform1fvARB(u->location, 1, u->data.f.f); break;
case GL_FLOAT_VEC2_ARB: glUniform2fvARB(u->location, 1, u->data.f); break; case GL_FLOAT_VEC2_ARB: glUniform2fvARB(u->location, 1, u->data.f.f); break;
case GL_FLOAT_VEC3_ARB: glUniform3fvARB(u->location, 1, u->data.f); break; case GL_FLOAT_VEC3_ARB: glUniform3fvARB(u->location, 1, u->data.f.f); break;
case GL_FLOAT_VEC4_ARB: glUniform4fvARB(u->location, 1, u->data.f); break; case GL_FLOAT_VEC4_ARB: glUniform4fvARB(u->location, 1, u->data.f.f); break;
case GL_INT: glUniform1ivARB(u->location, 1, u->data.i); break; case GL_INT: glUniform1ivARB(u->location, 1, u->data.i.i); break;
case GL_INT_VEC2_ARB: glUniform2ivARB(u->location, 1, u->data.i); break; case GL_INT_VEC2_ARB: glUniform2ivARB(u->location, 1, u->data.i.i); break;
case GL_INT_VEC3_ARB: glUniform3ivARB(u->location, 1, u->data.i); break; case GL_INT_VEC3_ARB: glUniform3ivARB(u->location, 1, u->data.i.i); break;
case GL_INT_VEC4_ARB: glUniform4ivARB(u->location, 1, u->data.i); break; case GL_INT_VEC4_ARB: glUniform4ivARB(u->location, 1, u->data.i.i); break;
} }
u->dirty = false; u->dirty = false;
} }
@ -391,10 +391,10 @@ void Shader::setInt(const char *name, int x, int y /* = 0 */, int z /* = 0 */, i
if(unsigned(idx) >= uniforms.size()) if(unsigned(idx) >= uniforms.size())
return; return;
Uniform& u = uniforms[idx]; Uniform& u = uniforms[idx];
u.data.i[0] = x; u.data.i.i[0] = x;
u.data.i[1] = y; u.data.i.i[1] = y;
u.data.i[2] = z; u.data.i.i[2] = z;
u.data.i[3] = w; u.data.i.i[3] = w;
u.dirty = true; u.dirty = true;
uniformsDirty = true; uniformsDirty = true;
#endif #endif
@ -409,10 +409,10 @@ void Shader::setFloat(const char *name, float x, float y /* = 0 */, float z /* =
if(unsigned(idx) >= uniforms.size()) if(unsigned(idx) >= uniforms.size())
return; return;
Uniform& u = uniforms[idx]; Uniform& u = uniforms[idx];
u.data.f[0] = x; u.data.f.f[0] = x;
u.data.f[1] = y; u.data.f.f[1] = y;
u.data.f[2] = z; u.data.f.f[2] = z;
u.data.f[3] = w; u.data.f.f[3] = w;
u.dirty = true; u.dirty = true;
uniformsDirty = true; uniformsDirty = true;
#endif #endif

View file

@ -62,14 +62,14 @@ private:
bool dirty; // need to flush if true bool dirty; // need to flush if true
union union
{ {
struct struct si
{ {
int i[4]; int i[4];
}; } i;
struct struct sf
{ {
float f[4]; float f[4];
}; } f;
} data; } data;
char name[64]; char name[64];

View file

@ -377,6 +377,9 @@ void BoneCommand::run()
case AC_RESET_PASS: case AC_RESET_PASS:
b->setRenderPass(b->originalRenderPass); b->setRenderPass(b->originalRenderPass);
break; break;
case AC_SEGS_START:
case AC_SEGS_STOP:
break;
} }
} }
@ -409,8 +412,8 @@ void AnimationLayer::playCurrentAnimation(int loop)
void AnimationLayer::animate(const std::string &a, int loop) void AnimationLayer::animate(const std::string &a, int loop)
{ {
std::string animation = a; std::string animation = a;
stringToLower(animation); stringToLower(animation);
bool played = false; bool played = false;
for (int i = 0; i < s->animations.size(); i++) for (int i = 0; i < s->animations.size(); i++)
@ -458,7 +461,7 @@ void AnimationLayer::enqueueAnimation(const std::string& anim, int loop)
float AnimationLayer::transitionAnimate(std::string anim, float time, int loop) float AnimationLayer::transitionAnimate(std::string anim, float time, int loop)
{ {
stringToLower(anim); stringToLower(anim);
float totalTime =0; float totalTime =0;
if (createTransitionAnimation(anim, time)) if (createTransitionAnimation(anim, time))
{ {

View file

@ -108,7 +108,7 @@ public:
class BoneKeyframe class BoneKeyframe
{ {
public: public:
BoneKeyframe() : idx(0), x(0), y(0), rot(0), doScale(0), sx(1), sy(1) {} BoneKeyframe() : idx(0), x(0), y(0), rot(0), sx(1), sy(1), doScale(0) {}
int idx, x, y, rot; int idx, x, y, rot;
float sx, sy; float sx, sy;
bool doScale; bool doScale;

View file

@ -25,13 +25,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "ttvfs_stdio.h" #include "ttvfs_stdio.h"
#ifdef BBGE_BUILD_FMOD_OPENAL_BRIDGE #ifdef BBGE_BUILD_FMOD_OPENAL_BRIDGE
#include "FmodOpenALBridge.h" #include "FmodOpenALBridge.h"
#else #else
#include <fmod.h> #include <fmod.h>
#include <fmod.hpp> #include <fmod.hpp>
#ifdef BBGE_BUILD_WINDOWS #ifdef BBGE_BUILD_WINDOWS
#pragma comment(lib, "fmodex_vc.lib") #pragma comment(lib, "fmodex_vc.lib")
#endif #endif
#endif #endif
@ -73,7 +73,7 @@ namespace SoundCore
struct FadeCh struct FadeCh
{ {
public: public:
FadeCh() : v(1), s(1), c(0), d(-1), to(0) {} FadeCh() : c(0), v(1), s(1), to(0), d(-1) {}
FMOD::Channel *c; FMOD::Channel *c;
float v,s,to; float v,s,to;
int d; int d;
@ -112,17 +112,17 @@ using namespace SoundCore;
/* /*
TIPS: TIPS:
1. use F_CALLBACK. Do NOT force cast your own function to fmod's callback type. 1. use F_CALLBACK. Do NOT force cast your own function to fmod's callback type.
2. return FMOD_ERR_FILE_NOTFOUND in open as required. 2. return FMOD_ERR_FILE_NOTFOUND in open as required.
3. return number of bytes read in read callback. Do not get the size and count 3. return number of bytes read in read callback. Do not get the size and count
around the wrong way in fread for example, this would return 1 instead of the number of bytes read. around the wrong way in fread for example, this would return 1 instead of the number of bytes read.
QUESTIONS: QUESTIONS:
1. Why does fmod seek to the end and read? Because it is looking for ID3V1 tags. 1. Why does fmod seek to the end and read? Because it is looking for ID3V1 tags.
Use FMOD_IGNORETAGS in System::createSound / System::createStream if you don't like this behaviour. Use FMOD_IGNORETAGS in System::createSound / System::createStream if you don't like this behaviour.
*/ */
@ -279,54 +279,54 @@ SoundManager::SoundManager(const std::string &defaultDevice)
int channels = 128; int channels = 128;
unsigned int version; unsigned int version;
FMOD_SPEAKERMODE speakermode; FMOD_SPEAKERMODE speakermode;
FMOD_CAPS caps; FMOD_CAPS caps;
debugLog("system::create"); debugLog("system::create");
result = FMOD::System_Create(&SoundCore::system); result = FMOD::System_Create(&SoundCore::system);
if (checkError()) goto get_out; if (checkError()) goto get_out;
debugLog("getVersion"); debugLog("getVersion");
result = SoundCore::system->getVersion(&version); result = SoundCore::system->getVersion(&version);
if (checkError()) goto get_out; if (checkError()) goto get_out;
if (version < FMOD_VERSION) if (version < FMOD_VERSION)
{ {
char str[256]; char str[256];
sprintf(str, "Error! You are using an old version of FMOD %08x. This program requires %08x\n", version, FMOD_VERSION); sprintf(str, "Error! You are using an old version of FMOD %08x. This program requires %08x\n", version, FMOD_VERSION);
debugLog(str); debugLog(str);
goto get_out; goto get_out;
} }
debugLog("driver caps"); debugLog("driver caps");
result = SoundCore::system->getDriverCaps(0, &caps, 0, 0, &speakermode); result = SoundCore::system->getDriverCaps(0, &caps, 0, 0, &speakermode);
if (checkError()) goto get_out; if (checkError()) goto get_out;
debugLog("set speaker mode"); debugLog("set speaker mode");
result = SoundCore::system->setSpeakerMode(speakermode); /* Set the user selected speaker mode. */ result = SoundCore::system->setSpeakerMode(speakermode); /* Set the user selected speaker mode. */
if (checkError()) goto get_out; if (checkError()) goto get_out;
debugLog("check caps"); debugLog("check caps");
if (caps & FMOD_CAPS_HARDWARE_EMULATED) /* The user has the 'Acceleration' slider set to off! This is really bad for latency!. */ if (caps & FMOD_CAPS_HARDWARE_EMULATED) /* The user has the 'Acceleration' slider set to off! This is really bad for latency!. */
{ /* You might want to warn the user about this. */ { /* You might want to warn the user about this. */
debugLog("acceleration slider is off"); debugLog("acceleration slider is off");
result = SoundCore::system->setDSPBufferSize(1024, 10); /* At 48khz, the latency between issuing an fmod command and hearing it will now be about 213ms. */ result = SoundCore::system->setDSPBufferSize(1024, 10); /* At 48khz, the latency between issuing an fmod command and hearing it will now be about 213ms. */
if (checkError()) goto get_out; if (checkError()) goto get_out;
} }
debugLog("init"); debugLog("init");
result = SoundCore::system->init(channels, FMOD_INIT_NORMAL, 0); /* Replace with whatever channel count and flags you use! */ result = SoundCore::system->init(channels, FMOD_INIT_NORMAL, 0); /* Replace with whatever channel count and flags you use! */
if (result == FMOD_ERR_OUTPUT_CREATEBUFFER) /* Ok, the speaker mode selected isn't supported by this soundcard. Switch it back to stereo... */ if (result == FMOD_ERR_OUTPUT_CREATEBUFFER) /* Ok, the speaker mode selected isn't supported by this soundcard. Switch it back to stereo... */
{ {
debugLog("err_output_createbuffer, speaker mode"); debugLog("err_output_createbuffer, speaker mode");
result = SoundCore::system->setSpeakerMode(FMOD_SPEAKERMODE_STEREO); result = SoundCore::system->setSpeakerMode(FMOD_SPEAKERMODE_STEREO);
if (checkError()) goto get_out; if (checkError()) goto get_out;
debugLog("init 2"); debugLog("init 2");
result = SoundCore::system->init(channels, FMOD_INIT_NORMAL, 0); /* Replace with whatever channel count and flags you use! */ result = SoundCore::system->init(channels, FMOD_INIT_NORMAL, 0); /* Replace with whatever channel count and flags you use! */
if (checkError()) goto get_out; if (checkError()) goto get_out;
} }
#ifdef BBGE_BUILD_FMOD_OPENAL_BRIDGE #ifdef BBGE_BUILD_FMOD_OPENAL_BRIDGE
SoundCore::system->getNumChannels(&channels); SoundCore::system->getNumChannels(&channels);
@ -336,7 +336,7 @@ SoundManager::SoundManager(const std::string &defaultDevice)
debugLog("set file system"); debugLog("set file system");
result = SoundCore::system->setFileSystem(myopen, myclose, myread, myseek, 2048); result = SoundCore::system->setFileSystem(myopen, myclose, myread, myseek, 2048);
if (checkError()) goto get_out; if (checkError()) goto get_out;
debugLog("create channel group vox"); debugLog("create channel group vox");
result = SoundCore::system->createChannelGroup("vox", &group_vox); result = SoundCore::system->createChannelGroup("vox", &group_vox);
@ -411,6 +411,9 @@ void SoundManager::toggleEffectMusic(SoundEffectType effect, bool on)
dspFlange->remove(); dspFlange->remove();
} }
break; break;
case SFX_NONE:
case SFX_MAX:
break;
} }
} }

View file

@ -83,9 +83,8 @@ enum SoundLoadType
struct PlaySfx struct PlaySfx
{ {
PlaySfx() : priority(0.5), vol(1), fade(SFT_NONE), PlaySfx() : vol(1), time(0), freq(1), loops(0), priority(0.5),
time(0), freq(1), loops(0), maxdist(0), fade(SFT_NONE), x(0), y(0), relative(true), positional(false) {}
maxdist(0), x(0), y(0), relative(true), positional(false) {}
std::string name; std::string name;
float vol; float vol;

View file

@ -221,7 +221,7 @@ bool Texture::load(std::string file)
size_t pos = file.find_last_of('.'); size_t pos = file.find_last_of('.');
if ((pos != std::string::npos) && (pos >= 0)) if (pos != std::string::npos)
{ {
// make sure this didn't catch the '.' in /home/username/.Aquaria/* --ryan. // make sure this didn't catch the '.' in /home/username/.Aquaria/* --ryan.
const std::string userdata = core->getUserDataFolder(); const std::string userdata = core->getUserDataFolder();
@ -500,8 +500,8 @@ ImageTGA *Texture::TGAloadMem(void *mem, int size)
// files are stored as BGR instead of RGB (or use GL_BGR_EXT verses GL_RGB) // files are stored as BGR instead of RGB (or use GL_BGR_EXT verses GL_RGB)
for(i = 0; i < stride; i += channels) for(i = 0; i < stride; i += channels)
{ {
int temp = pLine[i]; int temp = pLine[i];
pLine[i] = pLine[i + 2]; pLine[i] = pLine[i + 2];
pLine[i + 2] = temp; pLine[i + 2] = temp;
} }
} }
@ -653,8 +653,8 @@ ImageTGA *Texture::TGAloadMem(void *mem, int size)
// Fill in our tImageTGA structure to pass back // Fill in our tImageTGA structure to pass back
pImageData->channels = channels; pImageData->channels = channels;
pImageData->sizeX = width; pImageData->sizeX = width;
pImageData->sizeY = height; pImageData->sizeY = height;
// Return the TGA data (remember, you must free this data after you are done) // Return the TGA data (remember, you must free this data after you are done)
return pImageData; return pImageData;

View file

@ -148,26 +148,26 @@ public:
ByteBuffer() ByteBuffer()
: _rpos(0), _wpos(0), _buf(NULL), _size(0), _growable(true), _res(0), _mybuf(false), _delfunc(NULL), : _buf(NULL), _rpos(0), _wpos(0), _res(0), _size(0), _delfunc(NULL),
_allocfunc(NULL) _allocfunc(NULL), _mybuf(false), _growable(true)
{ {
} }
ByteBuffer(uint32 res) ByteBuffer(uint32 res)
: _rpos(0), _wpos(0), _buf(NULL), _size(0), _growable(true), _res(0), _mybuf(false), _delfunc(NULL), : _buf(NULL), _rpos(0), _wpos(0), _res(0), _size(0), _delfunc(NULL),
_allocfunc(NULL) _allocfunc(NULL), _mybuf(false), _growable(true)
{ {
_allocate(res); _allocate(res);
} }
ByteBuffer(ByteBuffer &buf, Mode mode = COPY, uint32 extra = 0) ByteBuffer(ByteBuffer &buf, Mode mode = COPY, uint32 extra = 0)
: _rpos(0), _wpos(0), _buf(NULL), _size(0), _growable(true), _res(0), _mybuf(false), _delfunc(NULL), : _buf(NULL), _rpos(0), _wpos(0), _res(0), _size(0), _delfunc(NULL),
_allocfunc(NULL) _allocfunc(NULL), _mybuf(false), _growable(true)
{ {
init(buf, mode, extra); init(buf, mode, extra);
} }
// del param only used with TAKE_OVER, extra only used with COPY // del param only used with TAKE_OVER, extra only used with COPY
ByteBuffer(void *buf, uint32 size, Mode mode = COPY, delete_func del = NULL, uint32 extra = 0) ByteBuffer(void *buf, uint32 size, Mode mode = COPY, delete_func del = NULL, uint32 extra = 0)
: _rpos(0), _wpos(0), _size(size), _buf(NULL), _growable(true), _delfunc(del), : _buf(NULL), _rpos(0), _wpos(0), _res(0), _size(0), _delfunc(NULL),
_mybuf(false), _allocfunc(NULL) // for mode == REUSE _allocfunc(NULL), _mybuf(false), _growable(true) // for mode == REUSE
{ {
init(buf, size, mode, del, extra); init(buf, size, mode, del, extra);
} }

View file

@ -9,9 +9,9 @@
DeflateCompressor::DeflateCompressor() DeflateCompressor::DeflateCompressor()
: _windowBits(-MAX_WBITS), // negative, because we want a raw deflate stream, and not zlib-wrapped : _windowBits(-MAX_WBITS), // negative, because we want a raw deflate stream, and not zlib-wrapped
_real_size(0),
_forceCompress(false), _forceCompress(false),
_iscompressed(false), _iscompressed(false)
_real_size(0)
{ {
} }

View file

@ -4,6 +4,8 @@ set(ttvfs_SRC
VFSArchiveLoader.h VFSArchiveLoader.h
VFSBase.cpp VFSBase.cpp
VFSBase.h VFSBase.h
VFSDebug.cpp
VFSDebug.h
VFSDefines.h VFSDefines.h
VFSDir.cpp VFSDir.cpp
VFSDir.h VFSDir.h
@ -28,3 +30,8 @@ set(ttvfs_SRC
) )
add_library(ttvfs ${ttvfs_SRC}) add_library(ttvfs ${ttvfs_SRC})
install(TARGETS ttvfs DESTINATION lib)
install(DIRECTORY ./ DESTINATION include/ttvfs
FILES_MATCHING PATTERN "*.h")

View file

@ -0,0 +1,72 @@
#include "VFSDebug.h"
#include "VFSInternal.h"
#include "VFSRoot.h"
#include "VFSDir.h"
#include "VFSFile.h"
#include "VFSTools.h"
#include <iostream>
#include <set>
VFS_NAMESPACE_START
namespace debug {
struct _DbgParams
{
_DbgParams(std::ostream& os_, const std::string& path, const std::string& sp_)
: os(os_), mypath(path), sp(sp_) {}
std::ostream& os;
std::string mypath;
const std::string& sp;
std::set<std::string> dirnames;
};
static void _DumpFile(File *vf, void *user)
{
_DbgParams& p = *((_DbgParams*)user);
p.os << p.sp << " F:" << vf->fullname() << " [" << vf->getType() << ", ref " << vf->getRefCount() << ", 0x" << vf << "]" << std::endl;
}
static void _DumpDir(DirBase *vd, void *user)
{
_DbgParams& p = *((_DbgParams*)user);
if(!(vd->fullname()[0] == '/' && vd->fullnameLen() == 1)) // don't recurse down the root dir.
p.dirnames.insert(vd->name());
p.os << p.sp << "D : " << vd->fullname() << " [" << vd->getType() << ", ref " << vd->getRefCount() << ", 0x" << vd << "]" << std::endl;
}
static void _DumpTree(_DbgParams& p, Root& vfs, int level)
{
p.os << ">> [" << p.mypath << "]" << std::endl;
vfs.ForEach(p.mypath.c_str(), _DumpFile, _DumpDir);
if(!level)
return;
std::string sub = p.sp + " ";
for(std::set<std::string>::iterator it = p.dirnames.begin(); it != p.dirnames.end(); ++it)
{
_DbgParams recP(p.os, joinPath(p.mypath, it->c_str()), sub);
_DumpTree(recP, vfs, level - 1);
}
}
void dumpTree(Root& root, std::ostream& os, const char *path /* = NULL */, int level /* = -1 */)
{
if(!path)
path = "";
os << ">>> FILE TREE DUMP <<<" << std::endl;
_DbgParams recP(os, path, "");
_DumpTree(recP, root, level);
}
} // end namespace debug
VFS_NAMESPACE_END

View file

@ -0,0 +1,22 @@
#ifndef TTVFS_DEBUG_H
#define TTVFS_DEBUG_H
#include "VFSDefines.h"
#include <iosfwd>
VFS_NAMESPACE_START
class Root;
namespace debug {
/** Dump tree structure with debug information to a stream.
path specifies the subdir to dump; use "" or NULL to dump the whole tree.
Set level to >= 0 to limit the recursion depth.
Level < 0 recurses as deep as the tree goes. */
void dumpTree(Root& root, std::ostream& os, const char *path = NULL, int level = -1);
} // end namespace debug
VFS_NAMESPACE_END
#endif

View file

@ -28,30 +28,39 @@
#define VFS_NAMESPACE_END } #define VFS_NAMESPACE_END }
#if !defined(_MSC_VER) // Important that this is included outside of the namespace.
# include <stdint.h> // Note that stdint.h is intentionally NOT included if possible,
// because on gcc it pulls in features.h, which in turn checks for
// _FILE_OFFSET_BITS presence. That means to enable 64bit file I/O,
// _FILE_OFFSET_BITS would have to be defined here.
// For the sake of not polluting the includer, use other means to define
// a 64 bit type.
#if !defined(_MSC_VER) && !defined(__GNUC__)
# include <stdint.h> // Hope it works.
#endif #endif
VFS_NAMESPACE_START VFS_NAMESPACE_START
#ifdef VFS_LARGEFILE_SUPPORT // vfspos type (signed 64bit integer if possible, 32bit otherwise)
# if defined(_MSC_VER) #if defined(_MSC_VER)
typedef __int64 vfspos; typedef __int64 vfspos;
# else #elif defined(__GNUC__)
# include <stdint.h> __extension__ // suppress warnings about long long
typedef int64_t vfspos; typedef long long int vfspos;
# endif #elif defined(VFS_LARGEFILE_SUPPORT)
// fallback using stdint. h, but only if necessary
typedef int64_t vfspos;
#else #else
typedef unsigned int vfspos; // If all else fails
typedef long int vfspos; // what fseek() uses, no guarantees whether 64 or 32 bits
#endif #endif
#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) #if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
# define VFS_STRICMP _stricmp # define VFS_STRICMP _stricmp
static const vfspos npos = vfspos(-1i64);
#else #else
# define VFS_STRICMP strcasecmp # define VFS_STRICMP strcasecmp
static const vfspos npos = vfspos(-1LL);
#endif #endif
static const vfspos npos = ~vfspos(0);
typedef void (*delete_func)(void *); typedef void (*delete_func)(void *);
@ -63,6 +72,12 @@ struct _AbiCheck
int nocase; int nocase;
}; };
class File;
class DirBase;
typedef void (*FileEnumCallback)(File *vf, void *user);
typedef void (*DirEnumCallback)(DirBase *vd, void *user);
VFS_NAMESPACE_END VFS_NAMESPACE_END

View file

@ -59,7 +59,6 @@ std::pair<DirBase*, DirBase*> DirBase::_getDirEx(const char *subdir, const char
return std::make_pair(this, this); return std::make_pair(this, this);
DirBase *ret = NULL; DirBase *ret = NULL;
DirBase *last = NULL;
char *slashpos = (char *)strchr(subdir, '/'); char *slashpos = (char *)strchr(subdir, '/');
// if there is a '/' in the string, descend into subdir and continue there // if there is a '/' in the string, descend into subdir and continue there
@ -239,12 +238,13 @@ void Dir::forEachDir(DirEnumCallback f, void *user /* = NULL */, bool safe /* =
} }
bool Dir::add(File *f) bool Dir::add(File *f)
{ {
if(!f) return _addRecursiveSkip(f, 0);
return false; }
bool Dir::_addSingle(File *f)
{
Files::iterator it = _files.find(f->name()); Files::iterator it = _files.find(f->name());
if(it != _files.end()) if(it != _files.end())
@ -260,11 +260,8 @@ bool Dir::add(File *f)
return true; return true;
} }
bool Dir::addRecursive(File *f, size_t skip /* = 0 */) bool Dir::_addRecursiveSkip(File *f, size_t skip /* = 0 */)
{ {
if(!f)
return false;
Dir *vdir = this; Dir *vdir = this;
if(f->fullnameLen() - f->nameLen() > skip) if(f->fullnameLen() - f->nameLen() > skip)
{ {
@ -285,7 +282,7 @@ bool Dir::addRecursive(File *f, size_t skip /* = 0 */)
} }
} }
return vdir->add(f); return vdir->_addSingle(f);
} }
void Dir::clearGarbage() void Dir::clearGarbage()
@ -374,4 +371,12 @@ void DiskDir::load()
} }
} }
// ----- MemDir start here -----
MemDir *MemDir::createNew(const char *dir) const
{
return new MemDir(dir);
}
VFS_NAMESPACE_END VFS_NAMESPACE_END

View file

@ -59,9 +59,6 @@ class DirView;
class File; class File;
class VFSLoader; class VFSLoader;
typedef void (*FileEnumCallback)(File *vf, void *user);
typedef void (*DirEnumCallback)(DirBase *vd, void *user);
// Avoid using std::string as key. // Avoid using std::string as key.
// The file names are known to remain constant during each object's lifetime, // The file names are known to remain constant during each object's lifetime,
@ -125,14 +122,12 @@ public:
virtual ~Dir(); virtual ~Dir();
/** Adds a file directly to this directory, allows any name. /** Adds a file directly to this directory, allows any name.
If another file with this name already exists, drop the old one out. If the file name contains a path, descend the tree to the target dir.
Returns whether the file was actually added (false if the same file already existed) */ Not-existing subdirs are created on the way.
If another file with this name already exists, drop the old one out.
Returns whether the file was actually added (false if the same file already existed) */
bool add(File *f); bool add(File *f);
/** Like add(), but if the file name contains a path, descend the tree to the target dir.
Not-existing subdirs are created on the way. */
bool addRecursive(File *f, size_t skip = 0);
/** Enumerate directory with given path. Clears previously loaded entries. */ /** Enumerate directory with given path. Clears previously loaded entries. */
virtual void load() = 0; virtual void load() = 0;
@ -146,9 +141,12 @@ public:
File *getFileByName(const char *fn, bool lazyLoad = true); File *getFileByName(const char *fn, bool lazyLoad = true);
File *getFileFromSubdir(const char *subdir, const char *file); File *getFileFromSubdir(const char *subdir, const char *file);
bool _addRecursiveSkip(File *f, size_t skip = 0);
protected: protected:
bool _addSingle(File *f);
inline VFSLoader *getLoader() const { return _loader; } inline VFSLoader *getLoader() const { return _loader; }
Files _files; Files _files;
@ -162,9 +160,23 @@ class DiskDir : public Dir
public: public:
DiskDir(const char *path, VFSLoader *ldr); DiskDir(const char *path, VFSLoader *ldr);
virtual ~DiskDir() {}; virtual ~DiskDir() {};
virtual void load();
virtual DiskDir *createNew(const char *dir) const; // virtual overloads
virtual const char *getType() const { return "DiskDir"; } void load();
DiskDir *createNew(const char *dir) const;
const char *getType() const { return "DiskDir"; }
};
class MemDir : public Dir
{
public:
MemDir(const char *fullpath) : Dir(fullpath, NULL) {}
virtual ~MemDir() {}
// virtual overloads
void load() {}
MemDir *createNew(const char *dir) const;
const char *getType() const { return "MemDir"; }
}; };
VFS_NAMESPACE_END VFS_NAMESPACE_END

View file

@ -106,12 +106,6 @@ void InternalDir::forEachFile(FileEnumCallback f, void *user /* = NULL */, bool
f(it->second, user); f(it->second, user);
} }
static void _iterDirs(Dirs &m, DirEnumCallback f, void *user)
{
for(Dirs::iterator it = m.begin(); it != m.end(); ++it)
f(it->second.content(), user);
}
void InternalDir::forEachDir(DirEnumCallback f, void *user /* = NULL */, bool safe /* = false */) void InternalDir::forEachDir(DirEnumCallback f, void *user /* = NULL */, bool safe /* = false */)
{ {
for(MountedDirs::reverse_iterator it = _mountedDirs.rbegin(); it != _mountedDirs.rend(); ++it) for(MountedDirs::reverse_iterator it = _mountedDirs.rbegin(); it != _mountedDirs.rend(); ++it)

View file

@ -95,7 +95,7 @@ vfspos DiskFile::size()
// ------------- MemFile ----------------------- // ------------- MemFile -----------------------
MemFile::MemFile(const char *name, void *buf, unsigned int size, delete_func delfunc /* = NULL */, DeleteMode delmode /* = ON_CLOSE */) MemFile::MemFile(const char *name, void *buf, unsigned int size, delete_func delfunc /* = NULL */, DeleteMode delmode /* = ON_CLOSE */)
: File(name), _pos(0), _size(size), _buf(buf), _delfunc(delfunc), _delmode(delmode) : File(name), _buf(buf), _pos(0), _size(size), _delfunc(delfunc), _delmode(delmode)
{ {
} }

View file

@ -88,13 +88,14 @@ public:
ON_CLOSE, ON_CLOSE,
ON_DESTROY ON_DESTROY
}; };
/* Creates a virtual file from a memory buffer. The buffer is passed as-is, /** Creates a virtual file from a memory buffer. The buffer is passed as-is,
so for text files you should make sure it ends with a \0 character. so for text files you should make sure it ends with a \0 character.
A deletor function can be passed optionally, that the buffer will be passed to A deletor function can be passed optionally, that the buffer will be passed to
when the memory file is destroyed. Pass NULL or leave away to keep the buffer alive. */ when the memory file is destroyed. Pass NULL or leave away to keep the buffer alive. */
MemFile(const char *name, void *buf, unsigned int size, delete_func delfunc = NULL, DeleteMode delmode = ON_CLOSE); MemFile(const char *name, void *buf, unsigned int size, delete_func delfunc = NULL, DeleteMode delmode = ON_CLOSE);
virtual ~MemFile(); virtual ~MemFile();
virtual bool open(const char *mode = NULL) { return true; } /** In order not to modify the passed buffer, MemFile does NOT respect the mode parameter. */
virtual bool open(const char *mode = NULL) { return !!_buf; }
virtual bool isopen() const { return !!_buf; } // always open virtual bool isopen() const { return !!_buf; } // always open
virtual bool iseof() const { return _pos >= _size; } virtual bool iseof() const { return _pos >= _size; }
virtual void close(); virtual void close();

View file

@ -8,10 +8,12 @@ VFS_NAMESPACE_START
// Compile time assertion to make sure things work as expected // Compile time assertion to make sure things work as expected
#if defined(VFS_LARGEFILE_SUPPORT) #if defined(VFS_LARGEFILE_SUPPORT)
static void _dummy_() TTVFS_UNUSED static void _dummy_()
{ {
// Ensure vfspos is 64 bits in largefile mode.
switch(0) { case 0:; case 4: case sizeof(vfspos): ; } switch(0) { case 0:; case 4: case sizeof(vfspos): ; }
#ifndef _MSC_VER #ifndef _MSC_VER
// Ensure the _FILE_OFFSET_BITS=64 setting in VFSInternal.h is effective
switch(0) { case 0:; case 4: case sizeof(off_t): ; } switch(0) { case 0:; case 4: case sizeof(off_t): ; }
#endif #endif
} }

View file

@ -37,6 +37,12 @@
# endif # endif
#endif #endif
#ifdef __GNUC__
# define TTVFS_UNUSED __attribute__((unused))
#else
# define TTVFS_UNUSED
#endif
// These are used for small, temporary memory allocations that can remain on the stack. // These are used for small, temporary memory allocations that can remain on the stack.
// If alloca is available, this is the preferred way. // If alloca is available, this is the preferred way.
#include <stdlib.h> #include <stdlib.h>

View file

@ -37,6 +37,7 @@ public:
{ {
int val = s_getRef(_refcount); int val = s_getRef(_refcount);
assert(val == 0 && "Object was deleted with refcount != 0"); assert(val == 0 && "Object was deleted with refcount != 0");
(void)val;
} }
inline void incref() inline void incref()

View file

@ -1,8 +1,6 @@
// VFSRoot.cpp - glues it all together and makes use simple // VFSRoot.cpp - glues it all together and makes use simple
// For conditions of distribution and use, see copyright notice in VFS.h // For conditions of distribution and use, see copyright notice in VFS.h
#include <set>
#include "VFSInternal.h" #include "VFSInternal.h"
#include "VFSRoot.h" #include "VFSRoot.h"
#include "VFSTools.h" #include "VFSTools.h"
@ -13,9 +11,6 @@
#include "VFSArchiveLoader.h" #include "VFSArchiveLoader.h"
#include "VFSDirView.h" #include "VFSDirView.h"
//#include <stdio.h>
#include <iostream>
#ifdef _DEBUG #ifdef _DEBUG
# include <cassert> # include <cassert>
# define DEBUG_ASSERT(x) assert(x) # define DEBUG_ASSERT(x) assert(x)
@ -64,11 +59,12 @@ void Root::Clear()
loaders.clear(); loaders.clear();
archLdrs.clear(); archLdrs.clear();
loadersInfo.clear();
} }
void Root::Mount(const char *src, const char *dest) void Root::Mount(const char *src, const char *dest)
{ {
AddVFSDir(GetDir(src, true), dest); return AddVFSDir(GetDir(src, true), dest);
} }
void Root::AddVFSDir(DirBase *dir, const char *subdir /* = NULL */) void Root::AddVFSDir(DirBase *dir, const char *subdir /* = NULL */)
@ -79,26 +75,54 @@ void Root::AddVFSDir(DirBase *dir, const char *subdir /* = NULL */)
into->_addMountDir(dir); into->_addMountDir(dir);
} }
bool Root::Unmount(const char *src, const char *dest) bool Root::RemoveVFSDir(DirBase *dir, const char *subdir /* = NULL */)
{ {
DirBase *vdsrc = GetDir(src, false); if(!subdir)
InternalDir *vddest = safecast<InternalDir*>(GetDir(dest, false)); subdir = dir->fullname();
if(!vdsrc || !vddest) InternalDir *vddest = safecast<InternalDir*>(GetDir(subdir, false));
if(!vddest)
return false; return false;
vddest->_removeMountDir(vdsrc); vddest->_removeMountDir(dir);
return true; return true;
} }
void Root::AddLoader(VFSLoader *ldr, const char *path /* = NULL */) bool Root::Unmount(const char *src, const char *dest)
{ {
loaders.push_back(ldr); DirBase *vdsrc = GetDir(src, false);
AddVFSDir(ldr->getRoot(), path); if(!vdsrc)
return false;
return RemoveVFSDir(vdsrc, dest);
} }
void Root::AddArchiveLoader(VFSArchiveLoader *ldr) int Root::AddLoader(VFSLoader *ldr, const char *path /* = NULL */)
{ {
DEBUG_ASSERT(ldr != NULL);
loaders.push_back(ldr);
loadersInfo.push_back(path);
AddVFSDir(ldr->getRoot(), path);
return (int)(loaders.size() - 1);
}
void Root::RemoveLoader(int index, const char *path /* = NULL */)
{
VFSLoader *ldr = loaders[index];
RemoveVFSDir(ldr->getRoot(), loadersInfo[index].getPath());
loaders.erase(loaders.begin() + index);
loadersInfo.erase(loadersInfo.begin() + index);
}
int Root::AddArchiveLoader(VFSArchiveLoader *ldr)
{
DEBUG_ASSERT(ldr != NULL);
archLdrs.push_back(ldr); archLdrs.push_back(ldr);
return (int)(archLdrs.size() - 1);
}
void Root::RemoveArchiveLoader(int index)
{
archLdrs.erase(archLdrs.begin() + index);
} }
Dir *Root::AddArchive(const char *arch, void *opaque /* = NULL */) Dir *Root::AddArchive(const char *arch, void *opaque /* = NULL */)
@ -133,7 +157,7 @@ inline static File *VFSHelper_GetFileByLoader(VFSLoader *ldr, const char *fn, co
return NULL; return NULL;
File *vf = ldr->Load(fn, unmangled); File *vf = ldr->Load(fn, unmangled);
if(vf) if(vf)
ldr->getRoot()->addRecursive(vf); ldr->getRoot()->add(vf);
return vf; return vf;
} }
@ -217,62 +241,21 @@ void Root::ClearGarbage()
merged->clearGarbage(); merged->clearGarbage();
} }
bool Root::ForEach(const char *path, FileEnumCallback fileCallback /* = NULL */, DirEnumCallback dirCallback /* = NULL */,
void *user /* = NULL */, bool safe /* = false */)
// DEBUG STUFF
struct _DbgParams
{ {
_DbgParams(std::ostream& os_, const std::string& path, const std::string& sp_)
: os(os_), mypath(path), sp(sp_) {}
std::ostream& os;
std::string mypath;
const std::string& sp;
std::set<std::string> dirnames;
};
static void _DumpFile(File *vf, void *user)
{
_DbgParams& p = *((_DbgParams*)user);
p.os << p.sp << " F:" << vf->fullname() << " [" << vf->getType() << ", ref " << vf->getRefCount() << ", 0x" << vf << "]" << std::endl;
}
static void _DumpDir(DirBase *vd, void *user)
{
_DbgParams& p = *((_DbgParams*)user);
if(!(vd->fullname()[0] == '/' && vd->fullnameLen() == 1)) // don't recurse down the root dir.
p.dirnames.insert(vd->name());
p.os << p.sp << "D : " << vd->fullname() << " [" << vd->getType() << ", ref " << vd->getRefCount() << ", 0x" << vd << "]" << std::endl;
}
static void _DumpTree(_DbgParams& p, Root& vfs, int level)
{
p.os << ">> [" << p.mypath << "]" << std::endl;
DirView view; DirView view;
vfs.FillDirView(p.mypath.c_str(), view); if(!FillDirView(path, view))
return false;
view.forEachDir(_DumpDir, &p); if(dirCallback)
view.forEachFile(_DumpFile, &p); view.forEachDir(dirCallback, user, safe);
if(fileCallback)
view.forEachFile(fileCallback, user, safe);
if(!level) return true;
return;
std::string sub = p.sp + " ";
for(std::set<std::string>::iterator it = p.dirnames.begin(); it != p.dirnames.end(); ++it)
{
_DbgParams recP(p.os, joinPath(p.mypath, it->c_str()), sub);
_DumpTree(recP, vfs, level - 1);
}
} }
void Root::debugDumpTree(std::ostream& os, const char *path, int level)
{
os << ">>> FILE TREE DUMP <<<" << std::endl;
_DbgParams recP(os, path, "");
_DumpTree(recP, *this, level);
}
VFS_NAMESPACE_END VFS_NAMESPACE_END

View file

@ -7,7 +7,6 @@
#include <vector> #include <vector>
#include <list> #include <list>
#include <string> #include <string>
#include <iosfwd>
#include "VFSRefcounted.h" #include "VFSRefcounted.h"
@ -23,7 +22,12 @@ class VFSArchiveLoader;
class DirView; class DirView;
/** Root - extensible class to simplify working with the VFS tree */ /** Root - simplify working with the VFS tree.
Everything is reference-counted. If you store pointers to contained objects externally,
use ttvfs::CountedPtr<>.
To enumerate the file tree for debugging, use ttvfs::debug::dumpTree().
*/
class Root class Root
{ {
public: public:
@ -31,28 +35,24 @@ public:
virtual ~Root(); virtual ~Root();
/** Reset an instance to its initial state. /** Reset an instance to its initial state.
Drops all archives, loaders, archive loaders, mount points, internal trees, ...*/ Drops all subdirs, loaders, archive loaders, mount points, ...*/
virtual void Clear(); virtual void Clear();
/** Do cleanups from time to time. For internal classes, this is a no-op. /** Do cleanups from time to time. For internal classes, this is a no-op.
Extensions may wish to override this method do do cleanup jobs. */ Extensions may wish to override this method do do cleanup jobs. */
virtual void ClearGarbage(); virtual void ClearGarbage();
/** Mount a directory in the tree to a different location. Requires a previous call to Prepare(). /** Mount a directory in the tree to a different location.
This can be imagined like the contents of a directory appearing in a different location. This means that the contents of src will appear in dest.
Be careful not to create circles! */ Be careful not to create circles! */
void Mount(const char *src, const char *dest); void Mount(const char *src, const char *dest);
/** Drops a directory from the tree. Internally, this calls Reload(false), /** Like Mount(), but in reverse.
which is a heavy operation compared to Mount(). Be warned. */ Returns true if the mount point does not exist after the call,
(that is, if it was removed or it never existed in the first place),
false if src or dst do not exist. */
bool Unmount(const char *src, const char *dest); bool Unmount(const char *src, const char *dest);
/** Adds a Dir object into the merged tree. If subdir is NULL (the default),
add into the subdir stored in the Dir object. The tree will be extended if target dir does not exist.
Files in the tree will be replaced if already existing.
Like with Mount(); be careful not to create cycles. */
void AddVFSDir(DirBase *dir, const char *subdir = NULL);
/** Add an archive file to the tree, which can then be addressed like a folder, /** Add an archive file to the tree, which can then be addressed like a folder,
e.g. "path/to/example.zip/file.txt". e.g. "path/to/example.zip/file.txt".
Returns a pointer to the actual Dir object that represents the added archive, or NULL if failed. Returns a pointer to the actual Dir object that represents the added archive, or NULL if failed.
@ -60,18 +60,31 @@ public:
such as a password to open the file. such as a password to open the file.
Read the comments in VFSArchiveLoader.h for an explanation how it works. Read the comments in VFSArchiveLoader.h for an explanation how it works.
If you have no idea, leave it NULL, because it can easily cause a crash if not used carefully. */ If you have no idea, leave it NULL, because it can easily cause a crash if not used carefully. */
Dir *AddArchive(const char *arch, void *opaque = NULL);
Dir *AddArchive(File *file, const char *path = NULL, void *opaque = NULL); Dir *AddArchive(File *file, const char *path = NULL, void *opaque = NULL);
/** Add an archive by file name. This is a quick convenience method using the method above. */
Dir *AddArchive(const char *arch, void *opaque = NULL);
/** Add a loader that can look for files on demand. /** Add a loader that can look for files on demand.
Do not add more then once instance of a loader type. */ Do not add more than one instance of a loader type.
void AddLoader(VFSLoader *ldr, const char *path = NULL); The optional path parameter is experimental, do not use it.
Returns the index of the added loader, which is required for RemoveLoader().
If the loader will not be removed, ignore the return value.*/
int AddLoader(VFSLoader *ldr, const char *path = NULL);
/** Remove a previously added loader. Use the index returned by AddLoader(). */
void RemoveLoader(int index, const char *path = NULL);
/** Add an archive loader that can open archives of various types. /** Add an archive loader that can open archives of various types.
Whenever an archive file is requested to be opened by AddArchive(), Whenever an archive file is requested to be opened by AddArchive(),
it is sent through each registered loader until one of them can recognize it is sent through each registered loader until one of them recognizes
the format and open it. */ the format and can open it.
void AddArchiveLoader(VFSArchiveLoader *ldr); Returns the index of the added loader, which is required for RemoveArchiveLoader().
If the loader will not be removed, ignore the return value.*/
int AddArchiveLoader(VFSArchiveLoader *ldr);
/** Remove a previously added archive loader. Use the index returned by AddArchiveLoader(). */
void RemoveArchiveLoader(int index);
/** Get a file from the merged tree. Asks loaders if the file is not in the tree. /** Get a file from the merged tree. Asks loaders if the file is not in the tree.
If found by a loader, the file will be added to the tree. */ If found by a loader, the file will be added to the tree. */
@ -79,18 +92,37 @@ public:
/** Fills a DirView object with a list of directories that match the specified path. /** Fills a DirView object with a list of directories that match the specified path.
This is the preferred way to enumerate directories, as it respects and collects This is the preferred way to enumerate directories, as it respects and collects
mount points during traversal. The DirView instance can be re-used until an (un-)mounting mount points during traversal. The DirView instance can be re-used until any mount or unmount
operation takes place. If the content of directories changes, this is reflected in the view. operation takes place. If the content of a contained directory changes, this is reflected in the view.
(Added dirs or files will appear, removed ones disappear). (Added dirs or files will appear, removed ones disappear).
Use DirView::forEachFile() or DirView::forEachDir() to iterate. */ Use DirView::forEachFile() or DirView::forEachDir() to iterate. */
bool FillDirView(const char *path, DirView& view); bool FillDirView(const char *path, DirView& view);
/** Convenience method to iterate over all files and subdirs of a given path.
Returns true if the path exists and iteration was successful.
Both callback functions are optional, pass NULL if not interested.
user is an opaque pointer passed to the callbacks.
Set safe = true if the file tree is modified by a callback function. */
bool ForEach(const char *path, FileEnumCallback fileCallback = NULL, DirEnumCallback dirCallback = NULL, void *user = NULL, bool safe = false);
/** Remove a file or directory from the tree */ /** Remove a file or directory from the tree */
//bool Remove(File *vf); //bool Remove(File *vf);
//bool Remove(Dir *dir); //bool Remove(Dir *dir);
//bool Remove(const char *name); // TODO: CODE ME //bool Remove(const char *name); // TODO: CODE ME
// --- Less common functions below ---
/** Adds a Dir object into the merged tree. If subdir is NULL (the default),
use the full path of dir. The tree will be extended if target dir does not exist.
Files in the tree will be overridden if already existing.
Like with Mount(); be careful not to create cycles. */
void AddVFSDir(DirBase *dir, const char *subdir = NULL);
/** Removes a dir from a given path previously added to via AddVFSDir().
Returns true if dir does not exist at subdir after the call. */
bool RemoveVFSDir(DirBase *dir, const char *subdir /* = NULL */);
/** Returns the tree root, which is usually the working directory. /** Returns the tree root, which is usually the working directory.
Same as GetDir(""). Same as GetDir("").
You will most likely not need this function. */ You will most likely not need this function. */
@ -99,25 +131,31 @@ public:
/** Get a directory from the merged tree. If create is true and the directory does not exist, /** Get a directory from the merged tree. If create is true and the directory does not exist,
build the tree structure and return the newly created dir. NULL otherwise. build the tree structure and return the newly created dir. NULL otherwise.
You will most likely not need this function. You will most likely not need this function.
Use FillDirView() on a DirView object to iterate over directory contents. */ Use FillDirView() on a DirView object or ForEach() to iterate over directory contents. */
DirBase *GetDir(const char* dn, bool create = false); DirBase *GetDir(const char* dn, bool create = false);
// DEBUG STUFF
void debugDumpTree(std::ostream& os, const char *path, int level);
protected: protected:
InternalDir *_GetDirByLoader(VFSLoader *ldr, const char *fn, const char *unmangled); InternalDir *_GetDirByLoader(VFSLoader *ldr, const char *fn, const char *unmangled);
class _LoaderInfo
{
public:
_LoaderInfo(const char *path) : isnull(path == NULL), pathstr(path ? path : "") {}
inline const char *getPath() { return isnull ? NULL : pathstr.c_str(); }
private:
bool isnull;
std::string pathstr;
};
typedef std::vector<CountedPtr<VFSLoader> > LoaderArray; typedef std::vector<CountedPtr<VFSLoader> > LoaderArray;
typedef std::vector<CountedPtr<VFSArchiveLoader> > ArchiveLoaderArray; typedef std::vector<CountedPtr<VFSArchiveLoader> > ArchiveLoaderArray;
typedef std::vector<_LoaderInfo> ArchiveLoaderInfoArray;
// If files are not in the tree, maybe one of these is able to find it. LoaderArray loaders; // If files are not in the tree, maybe one of these is able to find it.
LoaderArray loaders;
CountedPtr<InternalDir> merged; // contains the merged virtual/actual file system tree CountedPtr<InternalDir> merged; // contains the merged virtual/actual file system tree
ArchiveLoaderArray archLdrs; ArchiveLoaderArray archLdrs;
ArchiveLoaderInfoArray loadersInfo;
}; };
VFS_NAMESPACE_END VFS_NAMESPACE_END

View file

@ -10,3 +10,7 @@ add_library(ttvfs_cfileapi ${cfileapi_SRC})
target_link_libraries(ttvfs_cfileapi ttvfs) target_link_libraries(ttvfs_cfileapi ttvfs)
install(TARGETS ttvfs_cfileapi DESTINATION lib)
install(DIRECTORY ./ DESTINATION include/ttvfs
FILES_MATCHING PATTERN "*.h")

View file

@ -16,12 +16,6 @@ void ttvfs_setroot(ttvfs::Root *root)
VFILE *vfopen(const char *fn, const char *mode) VFILE *vfopen(const char *fn, const char *mode)
{ {
if (strchr(mode, 'w'))
{
assert(0 && "ttvfs_stdio: File writing via VFS not yet supported!");
return NULL;
}
VFILE *vf = vfs->GetFile(fn); VFILE *vf = vfs->GetFile(fn);
if (!vf || !vf->open(mode)) if (!vf || !vf->open(mode))
return NULL; return NULL;

View file

@ -6,13 +6,14 @@
// * Define VFS_ENABLE_C_API to 1 to use ttvfs overrides. // * Define VFS_ENABLE_C_API to 1 to use ttvfs overrides.
/* /*
This file is a minimal wrapper to replace the C API and std::ifstream. This file is a poor man's wrapper to replace the C API and std::ifstream.
Note that if you have an advanced needs, this wrapper API is not for you. Note that if you have any advanced needs, this wrapper API is not for you.
To use it, go through your code and rename all FILE* to VFILE*, To use it, go through your code and rename all FILE* to VFILE*,
and fopen() and related to vfopen() (so just put a 'v' in front). and fopen() and related to vfopen() (so just put a 'v' in front).
Instead of std::ifstream, use InStream. If you use std::fstream for reading ONLY, Instead of std::ifstream, use InStream. If you use std::fstream for reading ONLY,
also use InStream. also use InStream.
Make sure that a FILE* is not opened twice at any time - this is not supported.
Note that the seek and tell functions do not offer 64 bit offsets in this API. Note that the seek and tell functions do not offer 64 bit offsets in this API.
*/ */
@ -35,6 +36,8 @@ typedef ttvfs::File VFILE;
void ttvfs_setroot(ttvfs::Root *root); void ttvfs_setroot(ttvfs::Root *root);
// Note that vfopen() returns the same pointer for the same file name,
// so effectively a file is a singleton object.
VFILE *vfopen(const char *fn, const char *mode); VFILE *vfopen(const char *fn, const char *mode);
size_t vfread(void *ptr, size_t size, size_t count, VFILE *vf); size_t vfread(void *ptr, size_t size, size_t count, VFILE *vf);
int vfclose(VFILE *vf); int vfclose(VFILE *vf);

View file

@ -10,8 +10,16 @@ set(ttvfs_zip_SRC
VFSZipArchiveRef.h VFSZipArchiveRef.h
miniz.c miniz.c
miniz.h miniz.h
ttvfs_zip.h
) )
include_directories(${TTVFS_INCLUDE_DIRS}) include_directories(${TTVFS_INCLUDE_DIRS})
add_library(ttvfs_zip ${ttvfs_zip_SRC}) add_library(ttvfs_zip ${ttvfs_zip_SRC})
install(TARGETS ttvfs_zip DESTINATION lib)
install(FILES miniz.c DESTINATION include/ttvfs)
install(DIRECTORY ./ DESTINATION include/ttvfs
FILES_MATCHING PATTERN "*.h")

View file

@ -65,7 +65,7 @@ void ZipDir::load()
continue; continue;
ZipFile *vf = new ZipFile(fs.m_filename, _archiveHandle, fs.m_file_index); ZipFile *vf = new ZipFile(fs.m_filename, _archiveHandle, fs.m_file_index);
addRecursive(vf, len); _addRecursiveSkip(vf, len);
} }
_canLoad = false; _canLoad = false;

View file

@ -30,6 +30,8 @@ bool ZipFile::open(const char *mode /* = NULL */)
_pos = 0; _pos = 0;
if(!mode) if(!mode)
mode = "rb"; mode = "rb";
else if(strchr(mode, 'w') || strchr(mode, 'a'))
return false; // writing not yet supported
if(_mode != mode) if(_mode != mode)
{ {
delete [] _buf; delete [] _buf;
@ -53,7 +55,7 @@ void ZipFile::close()
{ {
//flush(); // TODO: write to zip file on close //flush(); // TODO: write to zip file on close
delete []_buf; delete [] _buf;
_buf = NULL; _buf = NULL;
_bufSize = 0; _bufSize = 0;
} }
@ -143,16 +145,15 @@ bool ZipFile::unpack()
close(); // delete the buffer close(); // delete the buffer
const vfspos sz = size(); // will reopen the file const vfspos sz = size(); // will reopen the file
if(sz < 0) if(sz == npos)
return false; return false;
_buf = new char[sz + 1]; _buf = new char[size_t(sz) + 1];
if(!_buf) if(!_buf)
return false; return false;
if(!mz_zip_reader_extract_to_mem(MZ, _fileIdx, _buf, sz, 0)) if(!mz_zip_reader_extract_to_mem(MZ, _fileIdx, _buf, (size_t)sz, 0))
{ {
//assert(0 && "ZipFile unpack: Failed mz_zip_reader_extract_to_mem");
delete [] _buf; delete [] _buf;
_buf = NULL; _buf = NULL;
return false; // this should not happen return false; // this should not happen

View file

@ -144,7 +144,7 @@
// If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl. // If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl.
// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O. // Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O.
#define MINIZ_NO_STDIO //#define MINIZ_NO_STDIO
// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current time, or // If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current time, or
// get/set file times. // get/set file times.

View file

@ -0,0 +1,6 @@
#ifndef TTVFS_ZIP_INC_H
#define TTVFS_ZIP_INC_H
#include "VFSZipArchiveLoader.h"
#endif