Skip to content

Commit

Permalink
Add replacement drain tiles (#173)
Browse files Browse the repository at this point in the history
Allow multiple drain pics
  • Loading branch information
cxong committed Jun 14, 2015
1 parent ba4a7fd commit 002762b
Show file tree
Hide file tree
Showing 10 changed files with 60 additions and 19 deletions.
Binary file added graphics/drains/0.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions graphics/drains/0.txt
@@ -0,0 +1,4 @@
Derived from metal grate texture
by Luke.RUSTLTD
http://opengameart.org/content/metal-grate-texture
http://creativecommons.org/publicdomain/zero/1.0/
Binary file added graphics/drains/1.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions graphics/drains/1_2.txt
@@ -0,0 +1,4 @@
Derived from Weathered Metal Grates
by leeor_net
http://opengameart.org/content/weathered-metal-grates
http://creativecommons.org/licenses/by/3.0/
Binary file added graphics/drains/2.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion src/cdogs/handle_game_events.c
Expand Up @@ -106,7 +106,7 @@ static void HandleGameEvent(
case GAME_EVENT_ACTOR_MOVE:
{
TActor *a = ActorGetByUID(e->u.ActorMove.UID);
if (!a->isInUse)
if (a == NULL || !a->isInUse)
{
break;
}
Expand Down
2 changes: 1 addition & 1 deletion src/cdogs/map_archive.c
Expand Up @@ -90,7 +90,7 @@ int MapNewLoadArchive(const char *filename, CampaignSetting *c)

// Unload previous custom data
SoundClear(&gSoundDevice.customSounds);
PicManagerClear(&gPicManager.customPics, &gPicManager.customSprites);
PicManagerClearCustom(&gPicManager);
ParticleClassesClear(&gParticleClasses.CustomClasses);
AmmoClassesClear(&gAmmo.CustomAmmo);
BulletClassesClear(&gBulletClasses.CustomClasses);
Expand Down
3 changes: 1 addition & 2 deletions src/cdogs/map_build.c
Expand Up @@ -112,8 +112,7 @@ void MapSetupTilesAndWalls(Map *map, const Mission *m)
(rand() % map->Size.y) & 0xFFFFFE));
if (TileIsNormalFloor(t))
{
TileSetAlternateFloor(t, PicManagerGetFromOld(
&gPicManager, PIC_DRAINAGE));
TileSetAlternateFloor(t, PicManagerGetRandomDrain(&gPicManager));
t->flags |= MAPTILE_IS_DRAINAGE;
}
}
Expand Down
59 changes: 45 additions & 14 deletions src/cdogs/pic_manager.c
Expand Up @@ -57,6 +57,8 @@ bool PicManagerTryInit(
CArrayInit(&pm->sprites, sizeof(NamedSprites));
CArrayInit(&pm->customPics, sizeof(NamedPic));
CArrayInit(&pm->customSprites, sizeof(NamedSprites));
CArrayInit(&pm->drainPics, sizeof(Pic *));

char buf[CDOGS_PATH_MAX];
GetDataFilePath(buf, oldGfxFile1);
int i = ReadPics(buf, pm->oldPics, PIC_COUNT1, pm->palette);
Expand Down Expand Up @@ -188,6 +190,22 @@ void PicManagerAdd(
SDL_FreeSurface(s);
SDL_UnlockSurface(image);
SDL_FreeSurface(image);

// Scan all pics for drainage pics
CArrayClear(&gPicManager.drainPics);
for (int i = 0;; i++)
{
char buf[CDOGS_FILENAME_MAX];
sprintf(buf, "drains/%d", i);
Pic *p = PicManagerGet(&gPicManager, buf, PIC_DRAINAGE);
if (p == NULL) break;
// Only use the old pic once
if (i > 0 && p == PicManagerGetFromOld(&gPicManager, PIC_DRAINAGE))
{
break;
}
CArrayPushBack(&gPicManager.drainPics, &p);
}
}
static void PicManagerLoadDirImpl(
PicManager *pm, const char *path, const char *prefix)
Expand Down Expand Up @@ -369,20 +387,11 @@ static void AddMaskBasePic(
AddNamedPic(&pm->pics, buf, &p);
}

void PicManagerClear(CArray *pics, CArray *sprites)
static void PicManagerClear(CArray *pics, CArray *sprites);
void PicManagerClearCustom(PicManager *pm)
{
for (int i = 0; i < (int)pics->size; i++)
{
NamedPic *n = CArrayGet(pics, i);
PicFree(&n->pic);
CFREE(n->name);
}
CArrayClear(pics);
for (int i = 0; i < (int)sprites->size; i++)
{
NamedSpritesFree(CArrayGet(sprites, i));
}
CArrayClear(sprites);
PicManagerClear(&pm->customPics, &pm->customSprites);
CArrayClear(&pm->drainPics);
}
void PicManagerTerminate(PicManager *pm)
{
Expand All @@ -400,11 +409,27 @@ void PicManagerTerminate(PicManager *pm)
PicManagerClear(&pm->pics, &pm->sprites);
CArrayTerminate(&pm->pics);
CArrayTerminate(&pm->sprites);
PicManagerClear(&pm->customPics, &pm->customSprites);
PicManagerClearCustom(pm);
CArrayTerminate(&pm->customPics);
CArrayTerminate(&pm->customSprites);
CArrayTerminate(&pm->drainPics);
IMG_Quit();
}
static void PicManagerClear(CArray *pics, CArray *sprites)
{
for (int i = 0; i < (int)pics->size; i++)
{
NamedPic *n = CArrayGet(pics, i);
PicFree(&n->pic);
CFREE(n->name);
}
CArrayClear(pics);
for (int i = 0; i < (int)sprites->size; i++)
{
NamedSpritesFree(CArrayGet(sprites, i));
}
CArrayClear(sprites);
}

PicPaletted *PicManagerGetOldPic(PicManager *pm, int idx)
{
Expand Down Expand Up @@ -604,6 +629,12 @@ static NamedPic *AddNamedPic(CArray *pics, const char *name, const Pic *p)
return CArrayGet(pics, pics->size - 1);
}

Pic *PicManagerGetRandomDrain(PicManager *pm)
{
Pic **p = CArrayGet(&pm->drainPics, rand() % pm->drainPics.size);
return *p;
}


Pic PicFromTOffsetPic(PicManager *pm, TOffsetPic op)
{
Expand Down
5 changes: 4 additions & 1 deletion src/cdogs/pic_manager.h
Expand Up @@ -39,6 +39,8 @@ typedef struct
CArray sprites; // of NamedSprites
CArray customPics; // of NamedPic
CArray customSprites; // of NamedSprites

CArray drainPics; // of Pic *
} PicManager;

extern PicManager gPicManager;
Expand All @@ -48,7 +50,7 @@ bool PicManagerTryInit(
void PicManagerLoadDir(PicManager *pm, const char *path);
void PicManagerAdd(
CArray *pics, CArray *sprites, const char *name, SDL_Surface *image);
void PicManagerClear(CArray *pics, CArray *sprites);
void PicManagerClearCustom(PicManager *pm);
void PicManagerTerminate(PicManager *pm);

PicPaletted *PicManagerGetOldPic(PicManager *pm, int idx);
Expand Down Expand Up @@ -78,6 +80,7 @@ void PicManagerGenerateMaskedStylePic(
PicManager *pm, const char *name, const int style, const int type,
const color_t mask, const color_t maskAlt);

Pic *PicManagerGetRandomDrain(PicManager *pm);

// Conversion
Pic PicFromTOffsetPic(PicManager *pm, TOffsetPic op);

0 comments on commit 002762b

Please sign in to comment.