/
Factory.cs
194 lines (149 loc) · 7.72 KB
/
Factory.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#region
using SFML.Graphics;
using SFMLStart.Utilities;
using SFMLStart.Vectors;
using Specimen.Components;
using Specimen.Resources;
using TestGenericShooter;
using VeeCollision;
using VeeEntity;
#endregion
namespace Specimen
{
public class Factory
{
private readonly SPGame _game;
private readonly Manager _manager;
private readonly World _world;
public Factory(SPGame mGame, Manager mManager, World mWorld)
{
_game = mGame;
_manager = mManager;
_world = mWorld;
}
#region Components
private CBody Body(SSVector2I mPosition, int mWidth, int mHeight, bool mIsStatic = false) { return new CBody(new Body(_world, mPosition, mIsStatic, mWidth, mHeight)); }
private CRender Render(CBody mCBody, string mTextureName, string mTilesetName = null, string mLabelName = null,
float mRotation = 0) { return new CRender(_game, mCBody, mTextureName, mTilesetName, mLabelName, mRotation); }
private CMovement Movement(CBody mCBody) { return new CMovement(mCBody); }
private CControl Control(CBody mCBody, CStats mCStats, CMovement mCMovement, CRender mCRender) { return new CControl(_game, mCStats, mCBody, mCMovement, mCRender); }
private CChild Child(Entity mParent, CBody mCBody) { return new CChild(mParent, mCBody); }
private CAI AI(CStats mCStats, CBody mCBody, CMovement mCMovement, CRender mCRender, CLineOfSight mCLineOfSight) { return new CAI(_game, mCStats, mCBody, mCMovement, mCRender, mCLineOfSight); }
#endregion
#region Environment
public Entity Wall(int mX, int mY, string mLabelName = "fill", float mRotation = 0)
{
var result = new Entity(_manager);
var cBody = Body(new SSVector2I(mX, mY), 16.ToUnits(), 16.ToUnits(), true);
var cRender = Render(cBody, Textures.Wall, Tilesets.Wall, mLabelName, mRotation);
cBody.Body.AddGroups(Groups.Obstacle);
result.AddComponents(cBody, cRender);
result.AddTags(Tags.Wall, Tags.DestroysBullets);
return result;
}
public Entity BreakableWall(int mX, int mY)
{
var result = new Entity(_manager);
var cHealth = new CHealth(85);
var cBody = Body(new SSVector2I(mX, mY), 16.ToUnits(), 16.ToUnits(), true);
var cRender = Render(cBody, Textures.Wall, Tilesets.Wall, "breakable");
cBody.Body.AddGroups(Groups.Obstacle);
result.AddComponents(cHealth, cBody, cRender);
result.AddTags(Tags.Wall, Tags.DamagedByAny);
cRender.Sprite.Rotation = Utils.Random.Next(0, 4)*90;
return result;
}
public Entity Decoration(int mX, int mY, string mTextureName, string mTilesetName, string mLabelName,
float mRotation = 0)
{
var result = new Entity(_manager);
var cBody = Body(new SSVector2I(mX, mY), 1600, 1600, true);
var cRender = Render(cBody, mTextureName, mTilesetName, mLabelName, mRotation);
cBody.Body.AddGroups(Groups.Decoration);
result.AddComponents(cBody, cRender);
result.AddTags(Tags.Decoration);
return result;
}
#endregion
#region Characters
public Entity Player(int mX, int mY)
{
var result = new Entity(_manager);
var cStats = new CStats(1, 1, 1, 50);
var cHealth = new CHealth(cStats);
var cBody = Body(new SSVector2I(mX, mY), 10.ToUnits(), 10.ToUnits());
var cMovement = Movement(cBody);
var cRender = Render(cBody, Textures.CharPlayer, Tilesets.Char, "normal");
var cControl = Control(cBody, cStats, cMovement, cRender);
var cShadower = new CShadower(_game, cBody, true, new Color(77, 77, 175, 255), 1);
cBody.Body.AddGroups(Groups.Character, Groups.Friendly);
cBody.Body.AddGroupsToCheck(Groups.Obstacle);
result.AddComponents(cStats, cHealth, cBody, cMovement, cControl, cRender, cShadower);
result.AddTags(Tags.Char, Tags.Friendly, Tags.DamagedByEnemy);
return result;
}
public Entity Enemy(int mX, int mY)
{
var result = new Entity(_manager);
var cStats = new CStats(1, 1, 1, 75);
var cHealth = new CHealth(cStats);
var cBody = Body(new SSVector2I(mX, mY), 10.ToUnits(), 10.ToUnits());
var cMovement = Movement(cBody);
var cRender = Render(cBody, Textures.CharEnemy, Tilesets.Char, "normal");
var cShadower = new CShadower(_game, cBody, false, new Color(125, 255, 125, 125));
var cLineOfSight = new CLineOfSight(_game, cBody, cShadower) {TargetTag = Tags.Friendly, Angle = 90, Amplitude = 65};
var cAI = AI(cStats, cBody, cMovement, cRender, cLineOfSight);
cBody.Body.AddGroups(Groups.Character, Groups.Enemy);
cBody.Body.AddGroupsToCheck(Groups.Obstacle);
result.AddComponents(cHealth, cBody, cMovement, cRender, cShadower, cLineOfSight, cAI);
result.AddTags(Tags.Char, Tags.Enemy, Tags.DamagedByFriendly);
return result;
}
#endregion
private Entity BulletBase(int mX, int mY, float mDegrees, int mSpeed, string mTextureName, bool mEnemy)
{
var result = new Entity(_manager);
var cBody = Body(new SSVector2I(mX, mY), 250, 250);
var cMovement = Movement(cBody);
var cRender = Render(cBody, mTextureName);
cBody.Body.AddGroupsToCheck(Groups.Obstacle, Groups.Character);
cBody.Body.AddGroupsToIgnoreResolve(Groups.Obstacle, Groups.Character);
cBody.OnCollision += (mCollisionInfo) =>
{
var entity = (Entity) mCollisionInfo.UserData;
var cHealth = entity.GetComponent<CHealth>();
if (entity.HasTag(Tags.DamagedByAny))
{
cHealth.Health--;
result.Destroy();
}
else if (result.HasTag(Tags.BulletFriendly) &&
entity.HasTag(Tags.DamagedByFriendly))
{
cHealth.Health--;
result.Destroy();
}
else if (result.HasTag(Tags.BulletEnemy) &&
entity.HasTag(Tags.DamagedByEnemy))
{
cHealth.Health--;
result.Destroy();
}
if (entity.HasTag(Tags.DestroysBullets)) result.Destroy();
};
cMovement.Angle = mDegrees;
cMovement.Speed = mSpeed;
cRender.Torque = 8;
result.AddComponents(cBody, cMovement, cRender);
result.AddTags(Tags.Bullet);
return result;
}
public Entity Bullet(int mX, int mY, float mDegrees, int mSpeed, bool mEnemy)
{
var texture = !mEnemy ? Textures.BulletFriendly : Textures.BulletEnemy;
var result = BulletBase(mX, mY, mDegrees, mSpeed, texture, mEnemy);
result.AddTags(!mEnemy ? Tags.BulletFriendly : Tags.BulletEnemy);
return result;
}
}
}