diff --git a/graphics/drains/0.png b/graphics/drains/0.png new file mode 100644 index 000000000..af495f796 Binary files /dev/null and b/graphics/drains/0.png differ diff --git a/graphics/drains/0.txt b/graphics/drains/0.txt new file mode 100644 index 000000000..80d323fec --- /dev/null +++ b/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/ \ No newline at end of file diff --git a/graphics/drains/1.png b/graphics/drains/1.png new file mode 100644 index 000000000..74d2475d0 Binary files /dev/null and b/graphics/drains/1.png differ diff --git a/graphics/drains/1_2.txt b/graphics/drains/1_2.txt new file mode 100644 index 000000000..6489e532b --- /dev/null +++ b/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/ \ No newline at end of file diff --git a/graphics/drains/2.png b/graphics/drains/2.png new file mode 100644 index 000000000..d23473f6f Binary files /dev/null and b/graphics/drains/2.png differ diff --git a/src/cdogs/handle_game_events.c b/src/cdogs/handle_game_events.c index 8cc0d39c4..0cb35d361 100644 --- a/src/cdogs/handle_game_events.c +++ b/src/cdogs/handle_game_events.c @@ -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; } diff --git a/src/cdogs/map_archive.c b/src/cdogs/map_archive.c index 7ef81084b..d32fefa28 100644 --- a/src/cdogs/map_archive.c +++ b/src/cdogs/map_archive.c @@ -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); diff --git a/src/cdogs/map_build.c b/src/cdogs/map_build.c index 5aec20c42..b63c49411 100644 --- a/src/cdogs/map_build.c +++ b/src/cdogs/map_build.c @@ -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; } } diff --git a/src/cdogs/pic_manager.c b/src/cdogs/pic_manager.c index 46c46f43d..0e94adc19 100644 --- a/src/cdogs/pic_manager.c +++ b/src/cdogs/pic_manager.c @@ -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); @@ -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) @@ -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) { @@ -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) { @@ -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) { diff --git a/src/cdogs/pic_manager.h b/src/cdogs/pic_manager.h index 417698ee3..78d1c6bcf 100644 --- a/src/cdogs/pic_manager.h +++ b/src/cdogs/pic_manager.h @@ -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; @@ -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); @@ -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);