Refactor UpdateDroppedMine away (#64)

Create new mine graphics (#173)
Add mine arm sound (#39)
Fix a few assertions related to CArray
This commit is contained in:
Cong
2014-06-10 22:10:16 +10:00
parent 8ca82c4523
commit 95695933a6
13 changed files with 93 additions and 51 deletions

BIN
graphics/mine_active.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 B

BIN
graphics/mine_inactive.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

4
sounds/mine_arm.txt Normal file
View File

@@ -0,0 +1,4 @@
Derived from Radio Beep by Kijadzel
http://freesound.org/people/Kijadzel/sounds/170608/
http://creativecommons.org/licenses/by/3.0/

BIN
sounds/mine_arm.wav Normal file

Binary file not shown.

View File

@@ -1343,8 +1343,6 @@ int main(int argc, char *argv[])
PlayMenuSong();
CampaignInit(&gCampaign);
LoadAllCampaigns(&campaigns);
EventInit(&gEventHandlers, NULL, true);
if (wait)
@@ -1352,11 +1350,6 @@ int main(int argc, char *argv[])
printf("Press the enter key to continue...\n");
getchar();
}
BulletInitialize();
WeaponInitialize(&gGunDescriptions, GetDataFilePath("guns.json"));
PlayerDataInitialize();
MapInit(&gMap);
if (!PicManagerTryInit(
&gPicManager, "graphics/cdogs.px", "graphics/cdogs2.px"))
{
@@ -1389,6 +1382,17 @@ int main(int argc, char *argv[])
{
TextManagerGenerateOldPics(&gTextManager, &gGraphicsDevice);
PicManagerLoadDir(&gPicManager, GetDataFilePath("graphics"));
BulletInitialize();
WeaponInitialize(&gGunDescriptions, GetDataFilePath("guns.json"));
CampaignInit(&gCampaign);
LoadAllCampaigns(&campaigns);
PlayerDataInitialize();
MapInit(&gMap);
GrafxMakeRandomBackground(
&gGraphicsDevice, &gCampaign, &gMission, &gMap);
debug(D_NORMAL, ">> Entering main loop\n");
// Attempt to pre-load campaign if requested
if (loadCampaign != NULL)

View File

@@ -101,6 +101,10 @@ static bool IsFacingPlayer(TActor *actor, direction_e d)
{
for (int i = 0; i < MAX_PLAYERS; i++)
{
if (gPlayerIds[i] < 0)
{
continue;
}
const TActor *player = CArrayGet(&gActors, gPlayerIds[i]);
if (IsPlayerAlive(i) && IsFacing(actor->Pos, player->Pos, d))
{

View File

@@ -84,22 +84,33 @@ static void DrawBullet(Vec2i pos, TileItemDrawFuncData *data)
{
const TMobileObject *obj = CArrayGet(&gMobObjs, data->MobObjId);
CASSERT(obj->isInUse, "Cannot draw non-existent bullet");
const TOffsetPic *pic = &cGeneralPics[data->u.Bullet.Ofspic];
pos = Vec2iAdd(pos, Vec2iNew(pic->dx, pic->dy - obj->z));
if (data->u.Bullet.UseMask)
if (data->u.Bullet.Pic)
{
pos = Vec2iMinus(pos, Vec2iScaleDiv(data->u.Bullet.Pic->size, 2));
BlitMasked(
&gGraphicsDevice,
PicManagerGetFromOld(&gPicManager, pic->picIndex),
pos, data->u.Bullet.Mask, 1);
data->u.Bullet.Pic,
pos, data->u.Bullet.Mask, true);
}
else
{
DrawBTPic(
&gGraphicsDevice,
PicManagerGetFromOld(&gPicManager, pic->picIndex),
pos,
&data->u.Bullet.Tint);
const TOffsetPic *pic = &cGeneralPics[data->u.Bullet.Ofspic];
pos = Vec2iAdd(pos, Vec2iNew(pic->dx, pic->dy - obj->z));
if (data->u.Bullet.UseMask)
{
BlitMasked(
&gGraphicsDevice,
PicManagerGetFromOld(&gPicManager, pic->picIndex),
pos, data->u.Bullet.Mask, 1);
}
else
{
DrawBTPic(
&gGraphicsDevice,
PicManagerGetFromOld(&gPicManager, pic->picIndex),
pos,
&data->u.Bullet.Tint);
}
}
}
@@ -621,14 +632,23 @@ int UpdateActiveMine(TMobileObject *obj, int ticks)
return 1;
}
int UpdateDroppedMine(TMobileObject *obj, int ticks)
void AddActiveMine(const TMobileObject *obj)
{
MobileObjectUpdate(obj, ticks);
if (obj->count >= obj->range)
{
obj->updateFunc = UpdateActiveMine;
}
return 1;
GameEvent e;
e.Type = GAME_EVENT_ADD_BULLET;
e.u.AddBullet.Bullet = BULLET_ACTIVEMINE;
e.u.AddBullet.MuzzlePos = Vec2iNew(obj->x, obj->y);
e.u.AddBullet.MuzzleHeight = obj->z;
e.u.AddBullet.Angle = 0;
e.u.AddBullet.Direction = DIRECTION_UP;
e.u.AddBullet.Flags = obj->flags;
e.u.AddBullet.PlayerIndex = obj->player;
GameEventsEnqueue(&gGameEvents, e);
GameEvent sound;
sound.Type = GAME_EVENT_SOUND_AT;
sound.u.SoundAt.Sound = SND_MINE_ARM;
sound.u.SoundAt.Pos = Vec2iFull2Real(Vec2iNew(obj->x, obj->y));
GameEventsEnqueue(&gGameEvents, sound);
}
@@ -643,6 +663,7 @@ void BulletInitialize(void)
b->UpdateFunc = UpdateBullet;
b->GetPicFunc = NULL;
b->DrawFunc = NULL;
memset(&b->DrawData, 0, sizeof b->DrawData);
b->SpeedScale = false;
b->Friction = Vec2iZero();
b->Size = Vec2iZero();
@@ -860,8 +881,8 @@ void BulletInitialize(void)
b = &gBulletClasses[BULLET_PROXMINE];
b->Name = "proxmine";
b->UpdateFunc = UpdateDroppedMine;
b->DrawFunc = (TileItemDrawFunc)DrawBullet;
b->DrawData.u.Bullet.Pic = PicManagerGetPic(&gPicManager, "mine_inactive");
b->DrawData.u.Bullet.Ofspic = OFSPIC_MINE;
b->DrawData.u.Bullet.UseMask = true;
b->DrawData.u.Bullet.Mask = colorWhite;
@@ -869,8 +890,8 @@ void BulletInitialize(void)
b->RangeLow = b->RangeHigh = 140;
b->Power = 0;
b->Persists = true;
b->SparkType = BULLET_NONE;
b->HitsObjects = false;
b->OutOfRangeFunc = AddActiveMine;
b = &gBulletClasses[BULLET_DYNAMITE];
b->Name = "dynamite";
@@ -1010,6 +1031,7 @@ void BulletInitialize(void)
b->Name = "activemine";
b->UpdateFunc = UpdateActiveMine;
b->DrawFunc = (TileItemDrawFunc)DrawBullet;
b->DrawData.u.Bullet.Pic = PicManagerGetPic(&gPicManager, "mine_active");
b->DrawData.u.Bullet.Ofspic = OFSPIC_MINE;
b->DrawData.u.Bullet.UseMask = true;
b->DrawData.u.Bullet.Mask = colorWhite;
@@ -1017,13 +1039,13 @@ void BulletInitialize(void)
b->RangeLow = b->RangeHigh = 5;
b->Power = 0;
b->Persists = true;
b->SparkType = BULLET_NONE;
b->HitsObjects = false;
b = &gBulletClasses[BULLET_TRIGGEREDMINE];
b->Name = "triggeredmine";
b->UpdateFunc = UpdateTriggeredMine;
b->DrawFunc = (TileItemDrawFunc)DrawBullet;
b->DrawData.u.Bullet.Pic = PicManagerGetPic(&gPicManager, "mine_active");
b->DrawData.u.Bullet.Ofspic = OFSPIC_MINE;
b->DrawData.u.Bullet.UseMask = true;
b->DrawData.u.Bullet.Mask = colorWhite;
@@ -1031,7 +1053,7 @@ void BulletInitialize(void)
b->RangeLow = b->RangeHigh = 5;
b->Power = 0;
b->Persists = true;
b->SparkType = BULLET_NONE;
b->HitsObjects = false;
}
void AddGrenade(
@@ -1104,7 +1126,9 @@ void BulletAdd(
case BULLET_DYNAMITE: // fallthrough
case BULLET_RAPID: // fallthrough
case BULLET_HEATSEEKER: // fallthrough
case BULLET_FRAG:
case BULLET_FRAG: // fallthrough
case BULLET_ACTIVEMINE: // fallthrough
case BULLET_TRIGGEREDMINE:
AddBullet(muzzlePos, muzzleHeight, angle, bullet, flags, playerIndex);
break;

View File

@@ -70,22 +70,28 @@ void CArrayInsert(CArray *a, int idx, void *elem)
{
CArrayReserve(a, a->capacity * 2);
}
memmove(
CArrayGet(a, idx + 1),
CArrayGet(a, idx),
a->elemSize * ((int)a->size - idx));
memcpy(CArrayGet(a, idx), elem, a->elemSize);
a->size++;
if (idx < (int)a->size - 1)
{
memmove(
CArrayGet(a, idx + 1),
CArrayGet(a, idx),
a->elemSize * ((int)a->size - 1 - idx));
}
memcpy(CArrayGet(a, idx), elem, a->elemSize);
}
void CArrayDelete(CArray *a, int idx)
{
CASSERT(a->size != 0, "Cannot delete from empty array");
CASSERT(a->elemSize > 0, "array has not been initialised");
CASSERT(idx >= 0 && idx < (int)a->size, "array index out of bounds");
memmove(
CArrayGet(a, idx),
CArrayGet(a, idx + 1),
a->elemSize * ((int)a->size - 1 - idx));
if (idx < (int)a->size - 1)
{
memmove(
CArrayGet(a, idx),
CArrayGet(a, idx + 1),
a->elemSize * ((int)a->size - 1 - idx));
}
a->size--;
}

View File

@@ -348,11 +348,6 @@ void GraphicsInitialize(
device->cachedConfig.Res.x = w;
device->cachedConfig.Res.y = h;
CDogsSetPalette(palette);
// Need to make background here since dimensions use cached config
if (!config->IsEditor)
{
GrafxMakeRandomBackground(device, &gCampaign, &gMission, &gMap);
}
}
void GraphicsTerminate(GraphicsDevice *device)

View File

@@ -96,6 +96,7 @@ SoundDevice gSoundDevice =
{"shotgun_r", false, NULL},
{"powergun_r", false, NULL},
{"package_r", false, NULL},
{"mine_arm", false, NULL},
{"knife_flesh", false, NULL},
{"knife_hard", false, NULL},
{"ricochet", false, NULL},

View File

@@ -83,6 +83,7 @@ typedef enum
SND_SHOTGUN_R,
SND_LASER_R,
SND_PACKAGE_R,
SND_MINE_ARM,
SND_KNIFE_FLESH,
SND_KNIFE_HARD,
SND_HIT_WALL,

View File

@@ -118,6 +118,7 @@ typedef struct
{
struct
{
const Pic *Pic;
int Ofspic;
bool UseMask;
color_t Mask;

View File

@@ -1119,17 +1119,9 @@ int main(int argc, char *argv[])
EditorBrushInit(&brush);
CampaignInit(&gCampaign);
MissionInit(&lastMission);
MissionInit(&currentMission);
ConfigLoadDefault(&gConfig);
ConfigLoad(&gConfig, GetConfigFilePath(CONFIG_FILE));
gConfig.Graphics.IsEditor = 1;
BulletInitialize();
WeaponInitialize(&gGunDescriptions, GetDataFilePath("guns.json"));
PlayerDataInitialize();
MapInit(&gMap);
if (!PicManagerTryInit(
&gPicManager, "graphics/cdogs.px", "graphics/cdogs2.px"))
{
@@ -1153,6 +1145,16 @@ int main(int argc, char *argv[])
}
TextManagerGenerateOldPics(&gTextManager, &gGraphicsDevice);
PicManagerLoadDir(&gPicManager, GetDataFilePath("graphics"));
BulletInitialize();
WeaponInitialize(&gGunDescriptions, GetDataFilePath("guns.json"));
CampaignInit(&gCampaign);
MissionInit(&lastMission);
MissionInit(&currentMission);
PlayerDataInitialize();
MapInit(&gMap);
// initialise UI collections
// Note: must do this after text init since positions depend on text height
sObjs = CreateMainObjs(&gCampaign, &brush, Vec2iNew(320, 240));