-
Notifications
You must be signed in to change notification settings - Fork 0
/
StudentWorld.h
275 lines (212 loc) · 7.03 KB
/
StudentWorld.h
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#ifndef STUDENTWORLD_H_
#define STUDENTWORLD_H_
#include "GameWorld.h"
#include "Level.h"
#include "Actor.h"
#include "GameConstants.h"
//#include "GraphObject.h"
#include <string>
#include <list>
using namespace std;
// Students: Add code to this file, StudentWorld.cpp, Actor.h, and Actor.cpp
class StudentWorld;
class StudentWorld : public GameWorld
{
public:
StudentWorld(std::string assetDir)
: GameWorld(assetDir)
{
list<Actor*>::iterator iter;
iter = setofActors.begin();
for (; iter != setofActors.end(); ++iter) // note that end is just past the end of the vector
{
*iter = nullptr;
}
setofActors.clear();
m_player = nullptr;
return;
}
~StudentWorld()
{
list<Actor*>::iterator iter;
iter = setofActors.begin();
for (; iter != setofActors.end(); ++iter) // note that end is just past the end of the vector
{
delete *iter;
}
setofActors.clear();
delete m_player;
return;
}
// EMPTY DESCRUCTOR BECAUSE CLEAN UP DOES ALL THE WORK
virtual int init()
{
bonusScoreLeft = 1000; // sets the bonus score
numberofJewelsLeft = 0;
////////////////////// /*not allowed to use assetDirectory*////////////////////////////////////////
Level lev(assetDirectory());
Level::LoadResult result = lev.loadLevel(leveltextfunct());// load different levels ? Right now it can only read the first
if (result == Level::load_fail_file_not_found || getLevel() > 99){
return GWSTATUS_PLAYER_WON;
}
else if (result == Level::load_fail_bad_format)
return GWSTATUS_LEVEL_ERROR;
else if (result == Level::load_success)
{
for (int x = 0; x < VIEW_WIDTH; x++) // refers to the columns
{
for (int y = 0; y < VIEW_HEIGHT; y++) // refers to the rows
{
Level::MazeEntry ge = lev.getContentsOf(x, y); // x=5, y=10
// NOTE: DO YOU WANT TO BE ABLE TO PUSH A object EVERYTIME YOU DISOVER WHERE IT IS
switch (ge)
{
case Level::empty:
break;
case Level::exit:
setofActors.push_back(new Exit(x, y, this));
break;
case Level::player:
m_player = new Player (x, y, this); // CREATE PLAYER HERE
break;
case Level::horiz_snarlbot:
setofActors.push_back(new SnarlBots(x, y, this, GraphObject::right));
break;
case Level::vert_snarlbot:
setofActors.push_back(new SnarlBots(x, y, this, GraphObject::down));
break;
case Level::kleptobot_factory:
setofActors.push_back(new KleptobotFactory(x, y, this, IID_KLEPTOBOT));
break;
case Level::angry_kleptobot_factory:
setofActors.push_back(new KleptobotFactory(x, y, this, IID_ANGRY_KLEPTOBOT));
break;
case Level::wall:
setofActors.push_back(new Wall(x, y, this));
break;
case Level::boulder:
setofActors.push_back(new Boulder(x, y, this));
break;
case Level::hole:
setofActors.push_back(new Hole(x, y, this));
break;
case Level::jewel:
setofActors.push_back(new Jewel(x, y, this));
numberofJewelsLeft++; // increases the number of jewels
break;
case Level::restore_health:
setofActors.push_back(new RestoreHealthGoodie(x, y, this));
break;
case Level::extra_life:
setofActors.push_back(new ExtraLifeGoodie(x, y, this));
break;
case Level::ammo:
setofActors.push_back(new AmmoGoodie(x, y, this));
break;
}
}
}
}
//cout << setofActors.size() << endl;
return GWSTATUS_CONTINUE_GAME;
}/// SOMETHING WRONG WITH THE BRACES
virtual int move()
{
// This code is here merely to allow the game to build, run, and terminate after hitting enter a few times
setDisplayText();
list<Actor*>::iterator iter = setofActors.begin();
for (; iter != setofActors.end(); ++iter)
{
(*iter)->doSomething();
if (m_player->totalHealthLeft() <= 0)
{
decLives();
playSound(SOUND_PLAYER_DIE);
return GWSTATUS_PLAYER_DIED;
}
if (isLevelComplete()) // maybe check if the exit is no longer in the list
{
//increaseScoreAppropriately(); // <----- this was already done in the dosomething for the exit
return GWSTATUS_FINISHED_LEVEL;
}
}
unsigned int livesBeforePlayerdoesSomething = getLives();
m_player->doSomething();
// Remove newly-dead actors after each tick
removeDeadObjects();
// Reduce the current bonus for the Level by one
reduceBonusScore();
// If the player has collected all of the Jewels on the level, then we
// must expose the Exit so the player can advance to the next level
if (numberofJewelsLeft == 0)
{
//exposeTheExitInTheMaze(); // make the exit visible
list<Actor*>::iterator iter = setofActors.begin();
for (; iter != setofActors.end(); ++iter)
{
if ((*iter)->IdOfActor() == IID_EXIT)
{
(*iter)->GraphObject::setVisible(true);
(*iter)->Actor::setSeeAbilityActor(true);
playSound(SOUND_REVEAL_EXIT);
numberofJewelsLeft--; // this is preventing it from going into the loop again and keep playing sound
}
}
}
// return the proper result
if (getLives() < livesBeforePlayerdoesSomething)
return GWSTATUS_PLAYER_DIED;
if (isLevelComplete()) // maybe check if the exit is no longer in the list
{
//increaseScoreAppropriately(); // <----- this was already done in the dosomething for the exit
return GWSTATUS_FINISHED_LEVEL;
}
// the player hasn’t completed the current level and hasn’t died, so
// continue playing the current level
return GWSTATUS_CONTINUE_GAME;
}
virtual void cleanUp()
{
/*SHOULD BE COMPLETE*/
list<Actor*>::iterator iter;
iter = setofActors.begin();
for (; iter != setofActors.end(); ++iter) // note that end is just past the end of the vector
{
delete *iter;
}
setofActors.clear();
delete m_player;
return;
}
list<Actor*>& listOfActors() { return setofActors; }
Player* accessPlayer() { return m_player; }
// implemented in cpp file
bool isThisSpaceWalkable(int xcoord, int ycoord);
bool isthisSpaceEmpty(int xcoord, int ycoord);
bool isthisSpaceanOBJECT(int xcoord, int ycoord, const int OBJECT_ID);
bool IsThisSpaceAnOBSTACLEwhenMoving(int xcoord, int ycoord);
bool IsThisSpaceAnOBSTACLEwhenFiring(int xcoord, int ycoord);
const int getThisGoodieIDandSetInvisible(int xcoord, int ycoord);
Actor* ACTORObjectHere(int xcoord, int ycoord, const int OBJECT_ID);
int isActorHereaKleptobot(int xcoord, int ycoord);
string leveltextfunct();
void removeDeadObjects();
void setDisplayText();
void reduceBonusScore()
{
if (bonusScoreLeft > 0)
bonusScoreLeft -= 1;
}
string formatString(int score, int level, int lives, int health, int ammo, unsigned int bonus);
unsigned int bonusScore() { return bonusScoreLeft; }
int totalJewelsLeft(){ return numberofJewelsLeft; }
void reduceJewelsby1() { numberofJewelsLeft--; }
ShootingDamageActor* ObjectHere(int xcoord, int ycoord, const int OBJECT_ID);
bool isLevelComplete();
private:
list<Actor*> setofActors; // will contain all actors besides the player
Player* m_player;
int bonusScoreLeft;
int numberofJewelsLeft;
};
#endif // STUDENTWORLD_H_