mirror of
https://github.com/cxong/cdogs-sdl.git
synced 2025-07-23 07:23:01 +02:00
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:
BIN
graphics/mine_active.png
Normal file
BIN
graphics/mine_active.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 161 B |
BIN
graphics/mine_inactive.png
Normal file
BIN
graphics/mine_inactive.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 170 B |
4
sounds/mine_arm.txt
Normal file
4
sounds/mine_arm.txt
Normal 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
BIN
sounds/mine_arm.wav
Normal file
Binary file not shown.
18
src/cdogs.c
18
src/cdogs.c
@@ -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)
|
||||
|
@@ -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))
|
||||
{
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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--;
|
||||
}
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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},
|
||||
|
@@ -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,
|
||||
|
@@ -118,6 +118,7 @@ typedef struct
|
||||
{
|
||||
struct
|
||||
{
|
||||
const Pic *Pic;
|
||||
int Ofspic;
|
||||
bool UseMask;
|
||||
color_t Mask;
|
||||
|
@@ -1119,17 +1119,9 @@ int main(int argc, char *argv[])
|
||||
|
||||
EditorBrushInit(&brush);
|
||||
|
||||
CampaignInit(&gCampaign);
|
||||
MissionInit(&lastMission);
|
||||
MissionInit(¤tMission);
|
||||
|
||||
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(¤tMission);
|
||||
|
||||
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));
|
||||
|
Reference in New Issue
Block a user