Skip to content

Commit 9fb1ad7

Browse files
committed
-
1 parent f199805 commit 9fb1ad7

18 files changed

Lines changed: 381 additions & 98 deletions

gamedata/entities/common.json

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
{
2+
"weapons":
3+
{
4+
"fists":
5+
{
6+
"fire_type": "melee",
7+
"base_fire_rate": 2.0,
8+
"base_ammo_limit": 0,
9+
"base_melee_hit_distance": "0.2u"
10+
},
11+
"pistol":
12+
{
13+
"fire_type": "projectile",
14+
"projectile": "bullet",
15+
"base_fire_rate": 2.0,
16+
"sprite_index": 30,
17+
"base_ammo_limit": 999
18+
},
19+
"machinegun":
20+
{
21+
"fire_type": "projectile",
22+
"projectile": "bullet",
23+
"base_fire_rate": 8.0,
24+
"sprite_index": 31,
25+
"base_ammo_limit": 999
26+
},
27+
"flamethrower":
28+
{
29+
"fire_type": "projectile",
30+
"projectile": "flame",
31+
"base_fire_rate": 16.0,
32+
"sprite_index": 33,
33+
"base_ammo_limit": 999
34+
},
35+
"rocket_launcher":
36+
{
37+
"fire_type": "projectile",
38+
"projectile": "rocket",
39+
"base_fire_rate": 1.0,
40+
"sprite_index": 32,
41+
"base_ammo_limit": 999
42+
}
43+
},
44+
45+
"projectiles":
46+
{
47+
"bullet":
48+
{
49+
"anim_id": "projectile_bullet",
50+
"anim_loop": "from_start",
51+
"radius": 0.1,
52+
"base_distance": "4.5u",
53+
"base_primary_damage_radius": 0.0,
54+
"base_secondary_damage_radius": 0.0,
55+
"speed": "8.0u"
56+
},
57+
"flame":
58+
{
59+
"anim_id": "projectile_flame",
60+
"anim_loop": "none",
61+
"radius": 0.3,
62+
"base_distance": "1.1u",
63+
"base_primary_damage_radius": 0.0,
64+
"base_secondary_damage_radius": 0.0,
65+
"speed": "2.75u"
66+
},
67+
"rocket":
68+
{
69+
"anim_id": "projectile_rocket",
70+
"anim_loop": "from_start",
71+
"radius": 0.1,
72+
"base_distance": "20.0u",
73+
"base_primary_damage_radius": 0.0,
74+
"base_secondary_damage_radius": 0.0,
75+
"speed": "4.4u"
76+
}
77+
}
78+
}

src/Carnage3D.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@
327327
<ItemGroup>
328328
<None Include="..\gamedata\config\inputs.json.default" />
329329
<None Include="..\gamedata\config\sys_config.json.default" />
330+
<None Include="..\gamedata\entities\common.json" />
330331
<None Include="..\gamedata\shaders\city_mesh.glsl" />
331332
<None Include="..\gamedata\shaders\debug.glsl" />
332333
<None Include="..\gamedata\shaders\gui.glsl" />

src/Carnage3D.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@
6262
<Filter Include="Game\DebugWindows">
6363
<UniqueIdentifier>{e0f94144-2eda-4062-a81c-663d85aba012}</UniqueIdentifier>
6464
</Filter>
65+
<Filter Include="Data\entities">
66+
<UniqueIdentifier>{ba5abb24-45fc-4800-b80d-acbc30a9f820}</UniqueIdentifier>
67+
</Filter>
6568
</ItemGroup>
6669
<ItemGroup>
6770
<ClInclude Include="stdafx.h">
@@ -548,6 +551,9 @@
548551
<None Include="..\gamedata\config\inputs.json.default">
549552
<Filter>Data\config</Filter>
550553
</None>
554+
<None Include="..\gamedata\entities\common.json">
555+
<Filter>Data\entities</Filter>
556+
</None>
551557
</ItemGroup>
552558
<ItemGroup>
553559
<Text Include="..\docs\CorrectionsToCDS.txt">

src/GameDefs.h

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,16 @@ enum eWeaponType
741741

742742
decl_enum_strings(eWeaponType);
743743

744+
// weapon fire type
745+
enum eWeaponFireType
746+
{
747+
eWeaponFireType_Melee,
748+
eWeaponFireType_Projectile,
749+
eWeaponFireType_COUNT
750+
};
751+
752+
decl_enum_strings(eWeaponFireType);
753+
744754
// pedestrian basic action
745755
enum ePedestrianAction
746756
{
@@ -831,17 +841,34 @@ enum eProjectileType
831841
};
832842
decl_enum_strings(eProjectileType);
833843

834-
// projectile type info
844+
// projectile type data
835845
struct ProjectileStyle
836846
{
837847
public:
838-
eProjectileType mTypeID;
839-
eSpriteAnimID mAnimID;
840-
float mBaseDistance; // how far projectile can fly, meters
841-
float mProjectileRadius; // size, meters
842-
float mSpeed; // how fast projectile moves, meters
843-
float mBasePrimaryDamageRadius; // how far projectile can impact, meters
844-
float mBaseSecondaryDamageRadius; // // how far projectile can impact, meters
845-
// todo: damage
846-
// todo: impact type
848+
eProjectileType mTypeID = eProjectileType_Bullet;
849+
850+
eSpriteAnimID mAnimID = eSpriteAnimID_Projectile_Bullet;
851+
eSpriteAnimLoop mAnimLoop = eSpriteAnimLoop_FromStart;
852+
853+
float mBaseDistance = 1.0f; // how far projectile can fly, meters
854+
float mProjectileRadius = 1.0f; // size, meters
855+
float mSpeed = 1.0f; // how fast projectile moves, meters
856+
float mBasePrimaryDamageRadius = 0.0f; // how far projectile can impact, meters
857+
float mBaseSecondaryDamageRadius = 0.0f; // // how far projectile can impact, meters
858+
};
859+
860+
// weapon type data
861+
struct WeaponStyle
862+
{
863+
public:
864+
eWeaponType mTypeID = eWeaponType_Fists;
865+
866+
eWeaponFireType mFireTypeID = eWeaponFireType_Melee;
867+
eProjectileType mProjectileID = eProjectileType_Bullet; // has meaning only if mFireTypeID is projectile
868+
869+
float mBaseFireRate = 1.0f; // num shots per seconds
870+
float mBaseMeleeHitDistance = 1.0f; // has meaning only of mFireTypeID is melee
871+
872+
int mSpriteIndex = 0; // hud sprite
873+
int mBaseAmmoLimit = 0; // max ammo, 0 is unlimited
847874
};

src/GameParams.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ GameParams::GameParams()
1111
void GameParams::SetToDefaults()
1212
{
1313
mPedestrianBoundsSphereRadius = Convert::MapUnitsToMeters(0.10f);
14-
mPedestrianFistsHitDistance = mPedestrianBoundsSphereRadius + 0.25f;
1514
mPedestrianTurnSpeed = 260.0f;
1615
mPedestrianTurnSpeedSlideOnCar = 120.0f;
1716
mPedestrianSlideOnCarSpeed = Convert::MapUnitsToMeters(1.2f);
@@ -21,11 +20,4 @@ void GameParams::SetToDefaults()
2120
mPedestrianKnockedDownTime = 3.0f;
2221
mPedestrianFallDeathHeight = Convert::MapUnitsToMeters(2.0f);
2322
mPedestrianDrowningTime = 0.05f;
24-
25-
// weapons fire rate
26-
mWeaponsRechargeTime[eWeaponType_Fists] = 1.0f / 2.0f;
27-
mWeaponsRechargeTime[eWeaponType_Pistol] = 1.0f / 2.5f;
28-
mWeaponsRechargeTime[eWeaponType_Machinegun] = 1.0f / 8.0f;
29-
mWeaponsRechargeTime[eWeaponType_Flamethrower] = 1.0f / 14.0f;
30-
mWeaponsRechargeTime[eWeaponType_RocketLauncher] = 1.0f;
3123
}

src/GameParams.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ class GameParams
1414
public:
1515
// pedestrians
1616
float mPedestrianBoundsSphereRadius; // bounding sphere radius, meters
17-
float mPedestrianFistsHitDistance; // meters
1817
float mPedestrianTurnSpeed; // degrees per second
1918
float mPedestrianTurnSpeedSlideOnCar; // degrees per second
2019
float mPedestrianSlideOnCarSpeed; // meters per second
@@ -24,7 +23,6 @@ class GameParams
2423
float mPedestrianSpotTheCarDistance; // max distance to detect the car, meters
2524
float mPedestrianFallDeathHeight; // falling distance which causes pedestrian death, meters
2625
float mPedestrianDrowningTime; // seconds
27-
float mWeaponsRechargeTime[eWeaponType_COUNT]; // weapons reload time, seconds
2826
};
2927

3028
extern GameParams gGameParams;

src/HUD.cpp

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,8 @@ void HUD::DrawFrame(UiContext& uiContext)
2424
// temporary
2525
if (mCharacter->mCurrentWeapon != eWeaponType_Fists)
2626
{
27-
int arrowSpriteIndex = 30;
28-
switch (mCharacter->mCurrentWeapon)
29-
{
30-
case eWeaponType_Pistol: arrowSpriteIndex = 30; break;
31-
case eWeaponType_Machinegun: arrowSpriteIndex = 31; break;
32-
case eWeaponType_Flamethrower: arrowSpriteIndex = 33; break;
33-
case eWeaponType_RocketLauncher: arrowSpriteIndex = 32; break;
34-
}
35-
36-
int spriteIndex = gGameMap.mStyleData.GetSpriteIndex(eSpriteType_Arrow, arrowSpriteIndex);
27+
WeaponStyle& weapon = gGameMap.mStyleData.mWeapons[mCharacter->mCurrentWeapon];
28+
int spriteIndex = gGameMap.mStyleData.GetSpriteIndex(eSpriteType_Arrow, weapon.mSpriteIndex);
3729

3830
Sprite2D sprite;
3931
gSpriteManager.GetSpriteTexture(GAMEOBJECT_ID_NULL, spriteIndex, 0, sprite);

src/Pedestrian.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,10 @@ void Pedestrian::DrawDebug(DebugRenderer& debugRender)
119119
if (mCurrentCar == nullptr)
120120
{
121121
glm::vec3 position = mPhysicsBody->GetPosition();
122-
glm::vec2 signVector = mPhysicsBody->GetSignVector() * gGameParams.mPedestrianFistsHitDistance;
122+
123+
WeaponStyle& meleeWeapon = gGameMap.mStyleData.mWeapons[eWeaponFireType_Melee];
124+
125+
glm::vec2 signVector = mPhysicsBody->GetSignVector() * meleeWeapon.mBaseMeleeHitDistance;
123126
debugRender.DrawLine(position, position + glm::vec3(signVector.x, 0.0f, signVector.y), Color32_White, false);
124127

125128
cxx::bounding_sphere_t bsphere (mPhysicsBody->GetPosition(), gGameParams.mPedestrianBoundsSphereRadius);

src/PedestrianStates.cpp

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -178,18 +178,24 @@ void PedestrianStatesManager::ProcessMotionActions()
178178

179179
bool PedestrianStatesManager::TryToShoot()
180180
{
181+
debug_assert(mPedestrian->mCurrentWeapon < eWeaponType_COUNT);
182+
181183
float currGameTime = gTimeManager.mGameTime;
182-
if (mPedestrian->mWeaponRechargeTime > currGameTime ||
184+
if (mPedestrian->mWeaponRechargeTime >= currGameTime ||
183185
mPedestrian->mWeaponsAmmo[mPedestrian->mCurrentWeapon] == 0)
184186
{
185187
return false;
186188
}
187189

188190
glm::vec3 currPosition = mPedestrian->mPhysicsBody->GetPosition();
189-
if (mPedestrian->mCurrentWeapon == eWeaponType_Fists)
191+
192+
// get weapon params
193+
WeaponStyle& weaponParams = gGameMap.mStyleData.mWeapons[mPedestrian->mCurrentWeapon];
194+
195+
if (weaponParams.mFireTypeID == eWeaponFireType_Melee)
190196
{
191197
glm::vec2 posA { currPosition.x, currPosition.z };
192-
glm::vec2 posB = posA + (mPedestrian->mPhysicsBody->GetSignVector() * gGameParams.mPedestrianFistsHitDistance);
198+
glm::vec2 posB = posA + (mPedestrian->mPhysicsBody->GetSignVector() * weaponParams.mBaseMeleeHitDistance);
193199
// find candidates
194200
PhysicsLinecastResult linecastResult;
195201
gPhysics.QueryObjectsLinecast(posA, posB, linecastResult);
@@ -204,7 +210,7 @@ bool PedestrianStatesManager::TryToShoot()
204210
pedBody->mReferencePed->ReceiveDamage(mPedestrian->mCurrentWeapon, mPedestrian);
205211
}
206212
}
207-
else // create projectile
213+
else if (weaponParams.mFireTypeID == eWeaponFireType_Projectile)
208214
{
209215
glm::vec2 signVector = mPedestrian->mPhysicsBody->GetSignVector();
210216
glm::vec2 offset = (signVector * 1.0f); //todo: magic numbers
@@ -213,20 +219,17 @@ bool PedestrianStatesManager::TryToShoot()
213219
currPosition.y,
214220
currPosition.z + offset.y
215221
};
216-
eProjectileType projectileTypeID = eProjectileType_Bullet; // todo: add weapon desc with projectile type
217-
switch (mPedestrian->mCurrentWeapon)
218-
{
219-
case eWeaponType_Flamethrower: projectileTypeID = eProjectileType_Flame;
220-
break;
221-
case eWeaponType_RocketLauncher: projectileTypeID = eProjectileType_Rocket;
222-
break;
223-
}
224-
gGameObjectsManager.CreateProjectile(projectilePos, mPedestrian->mPhysicsBody->GetRotationAngle(), projectileTypeID);
225-
}
222+
debug_assert(weaponParams.mProjectileID < eProjectileType_COUNT);
223+
gGameObjectsManager.CreateProjectile(projectilePos, mPedestrian->mPhysicsBody->GetRotationAngle(), weaponParams.mProjectileID);
224+
}
225+
else
226+
{
227+
debug_assert(false);
228+
}
226229

227230
// setup cooldown time for weapons
228-
float rechargeTime = gGameParams.mWeaponsRechargeTime[mPedestrian->mCurrentWeapon];
229-
mPedestrian->mWeaponRechargeTime = currGameTime + rechargeTime;
231+
float rechargeTime = (1.0f / weaponParams.mBaseFireRate);
232+
mPedestrian->mWeaponRechargeTime = (currGameTime + rechargeTime);
230233
return true;
231234
}
232235

src/PhysicsComponents.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ void PedPhysicsBody::HandleWaterContact()
294294
mReferencePed->mStatesManager.ProcessEvent(evData);
295295
}
296296

297-
bool PedPhysicsBody::ShouldCollideWith(unsigned int bits) const
297+
bool PedPhysicsBody::ShouldContactWith(unsigned int bits) const
298298
{
299299
if (mReferencePed->IsDead())
300300
{
@@ -401,6 +401,11 @@ void CarPhysicsBody::SimulationStep()
401401
UpdateSteer();
402402
}
403403

404+
bool CarPhysicsBody::ShouldContactWith(unsigned int objCatBits) const
405+
{
406+
return true; // todo
407+
}
408+
404409
void CarPhysicsBody::GetChassisCorners(glm::vec2 corners[4]) const
405410
{
406411
const b2PolygonShape* shape = (const b2PolygonShape*) mChassisFixture->GetShape();
@@ -727,3 +732,8 @@ void ProjectilePhysicsBody::SimulationStep()
727732
mReferenceProjectile->MarkForDeletion();
728733
}
729734
}
735+
736+
bool ProjectilePhysicsBody::ShouldContactWith(unsigned int objCatBits) const
737+
{
738+
return true; // todo
739+
}

0 commit comments

Comments
 (0)