Dumb-ways-to-memorize
2D game
parselevel.c
Go to the documentation of this file.
1 #include "entity.h"
2 #include "parselevel.h"
3 #include "parseobject.h"
4 #include "parseentity.h"
5 #include "ai_interpret.h"
6 #include "mystrings.h"
7 #include <stdio.h>
8 
9 level_t *gCurrentLevel = NULL;
10 
11 int LoadLevel(object_t *level, char *g_str)
12 {
13  jsmntok_t *tempTok, *aiTok, *enemyTok;
14  object_t *tempObj, *enemyObj, *posObj, *itemObj, *aiObj;
15  entity_t *tempEnt, *cachedEnt;
16  ai_function_t *enemyAI;
17  int tempInt, i, j, x, y, enemies, objects, positions, tileX, tileY;
18  char *temp_str = NULL, *aiStr, *enemyName, *objectName, *aiFile, *tileX_str, *tileY_str;
19  vec2_t *spawn, *temp_pos, obj_pos, tile_pos;
20  if(!level || !level->keys)
21  {
22  printf("Could not load NULL lvl");
23  return -1;
24  }
25  if(!gCurrentLevel)
26  {
27  gCurrentLevel = (level_t*) malloc(sizeof(level_t));
28  } else {
30  memset(gCurrentLevel, 0, sizeof(level_t));
31  }
32 
33  //Assign Name & Hint
34  tempTok = FindKey(level->keys, G_NAME_STR, g_str);
35  if(!tempTok)
36  {
37  printf("Level %s has no Name \n", level->name);
38  return -1;
39  }
40  tempInt = tempTok - level->keys;
41  gCurrentLevel->mName = JsmnToString(&level->values[tempInt], g_str);
42 
43  if( (tempTok = FindKey(level->keys, "Hint", g_str)) != NULL)
44  {
45  tempInt = tempTok - level->keys;
46  gCurrentLevel->mHint = JsmnToString(&level->values[tempInt], g_str);
47  }
48 
49  //Assign Background
50  tempTok = FindKey(level->keys, LEVEL_BACKGROUND_STR, g_str);
51  if(!tempTok)
52  {
53  printf("Level %s has no Background \n", gCurrentLevel->mName);
54  return -1;
55  }
56  tempInt = tempTok - level->keys;
57  gCurrentLevel->mBackground = LoadSprite(JsmnToString(&level->values[tempInt], g_str), 0);
58 
59  //Assign Spawn Point
60  tempObj = FindObject(level->children, LEVEL_SPAWN_STR);
61  if(!tempObj)
62  {
63  printf("Level %s has no Spawn \n", gCurrentLevel->mName);
64  return -1;
65  }
66  spawn = ParseToVec2(tempObj, g_str);
67  if(!spawn)
68  {
69  printf("Level %s spawn parse error \n", gCurrentLevel->mName);
70  return -1;
71  }
72  gCurrentLevel->mSpawnPoint = *spawn;
73  free(spawn);
74 
75  //Spawn Enemies
76  enemyObj = FindObject(level, LEVEL_ENEMY_OBJ_STR);
77  if(!enemyObj)
78  {
79  printf("Level failed to find enemies in level : %s \n", level->name);
80  return -1;
81  }
82  if(enemyObj && enemyObj->children)
83  {
84  enemies = CountMem(enemyObj->children, sizeof(object_t));
85  for(i = 0; i < enemies; i++)
86  {
87 
88  enemyName = FindValue(&enemyObj->children[i], LEVEL_ENEMY_NAME_STR, g_str);
89  if(!enemyName)
90  {
91  continue;
92  }
93  cachedEnt = FindCachedEntity(enemyName);
94  if(!cachedEnt)
95  {
96  FreeEntity(cachedEnt);
97  continue;
98  }
99 
100  aiFile = FindValue(&enemyObj->children[i], LEVEL_AI_STR, g_str);
101  if(!aiFile)
102  {
103  enemyAI = NULL;
104  } else
105  {
106  //Find and parse AI
107  ConvertFileToUseable(aiFile, NULL, &aiStr,&aiTok );
108  aiObj = ParseToObject(aiTok, aiStr);
109  if( (tempObj = FindObject(aiObj, LEVEL_VARIABLES_STR)) != NULL )
110  {
111  enemyAI = ParseAI(aiObj, aiStr, ParseToStringArray(tempObj, aiStr));
112  } else
113  {
114  enemyAI = ParsePresetAI(aiObj, aiStr);
115  }
116 
117  }
118  posObj = FindObject(&enemyObj->children[i], LEVEL_POSITION_STR);
119  tileX_str = FindValue(&enemyObj->children[i], LEVEL_TILE_X_STR, g_str);
120  tileY_str = FindValue(&enemyObj->children[i], LEVEL_TILE_Y_STR, g_str);
121  tileX = StrToInt(tileX_str);
122  tileY = StrToInt(tileY_str);
123  if(!posObj)
124  {
125  continue;
126  }
127 
128 
129  positions = posObj->children ? CountMem(posObj->children, sizeof(object_t)) : 1;
130 
131  for(j = 0; j < positions; j++)
132  {
133  temp_pos = ParseToVec2(posObj->children ? &posObj->children[j] : posObj, g_str);
134  if(!temp_pos)
135  continue;
136  obj_pos.x = tileX ? (tileX - temp_pos->x)/cachedEnt->mSprites[0]->mSize.x : 1;
137  obj_pos.y = tileY ? (tileY - temp_pos->y)/cachedEnt->mSprites[0]->mSize.y : 1;
138  for(x = 0; x < obj_pos.x; x++)
139  {
140  for(y = 0; y < obj_pos.y; y++)
141  {
142  tempEnt = InitNewEntity();
143  if(!tempEnt)
144  {
145  printf("Max Entities reached for level %s", level->name);
146  continue;
147  }
148 
149  memcpy(tempEnt, cachedEnt , sizeof(entity_t));
150 
151  tile_pos.x = tileX ? temp_pos->x + x*cachedEnt->mSprites[0]->mSize.x: temp_pos->x;
152  tile_pos.y = tileY ? temp_pos->y + y*cachedEnt->mSprites[0]->mSize.y: temp_pos->y;
153  tempEnt->mPosition = tile_pos;
154  tempEnt->mData = enemyAI;
155  tempEnt->Think = ThinkEnemy;
156  tempEnt->Draw = DrawGeneric;
157  tempEnt->Touch = TouchGeneric;
158  tempEnt->mWeight = 1;
159  tempEnt->mNextThink = SDL_GetTicks() + 10;
160  tile_pos.x = 0; tile_pos.y = 0;
161  }
162  }
163  }
164 
165  if(temp_str) free(temp_str);
166  temp_str = NULL;
167  }
168  }
169 
170  //Spawn Objects
171  itemObj = FindObject(level, LEVEL_ITEM_OBJ_STR);
172  if(!itemObj)
173  {
174  printf("Level failed to find objects in level : %s \n", level->name);
175  return -1;
176  }
177  if(itemObj && itemObj->children)
178  {
179  objects = CountMem(itemObj->children, sizeof(object_t));
180  for(i = 0; i < objects; i++)
181  {
182  objectName = FindValue(&itemObj->children[i], LEVEL_ITEM_NAME_STR, g_str);
183  if(!objectName)
184  {
185  continue;
186  }
187 
188  cachedEnt = FindCachedEntity(objectName);
189  if(!cachedEnt)
190  {
191  FreeEntity(cachedEnt);
192  continue;
193  }
194 
195  posObj = FindObject(&itemObj->children[i], LEVEL_POSITION_STR);
196  tileX_str = FindValue(itemObj, LEVEL_TILE_X_STR, g_str);
197  tileY_str = FindValue(itemObj, LEVEL_TILE_Y_STR, g_str);
198  tileX = StrToInt(tileX_str);
199  tileY = StrToInt(tileY_str);
200  if(!posObj)
201  {
202  continue;
203  }
204  obj_pos.x = tileX ? (tileX - 0)/cachedEnt->mSprites[0]->mSize.x : 1;
205  obj_pos.y = tileY ? (tileY - 0)/cachedEnt->mSprites[0]->mSize.y : 1;
206 
207  positions = posObj->children ? CountMem(posObj->children, sizeof(object_t)) : 1;
208 
209  for(j = 0; j < positions; j++)
210  {
211  temp_pos = ParseToVec2(posObj->children ? &posObj->children[j] : posObj, g_str);
212  if(!temp_pos)
213  continue;
214  obj_pos.x = tileX ? (tileX - temp_pos->x)/cachedEnt->mSprites[0]->mSize.x : 1;
215  obj_pos.y = tileY ? (tileY - temp_pos->y)/cachedEnt->mSprites[0]->mSize.y : 1;
216  for(x = 0; x < obj_pos.x; x++)
217  {
218  for(y = 0; y < obj_pos.y; y++)
219  {
220  tempEnt = InitNewEntity();
221  if(!tempEnt)
222  {
223  printf("Max Entities reached in level : %s \n", level->name);
224  continue;
225  }
226 
227  memcpy(tempEnt, cachedEnt, sizeof(entity_t));
228  tempEnt->Draw = DrawGeneric;
229  tempEnt->Think = NULL;
230  tempEnt->Touch = FindValue(&itemObj->children[i], LEVEL_ITEM_XTRA_STR, g_str) ? TouchGoal : NULL;
231  tempEnt->mCollisionType = COLLISION_TYPE_STATIC;
232  tile_pos.x = tileX ? temp_pos->x + x*cachedEnt->mSprites[0]->mSize.x: temp_pos->x;
233  tile_pos.y = tileY ? temp_pos->y + y*cachedEnt->mSprites[0]->mSize.y: temp_pos->y;
234  tempEnt->mPosition = tile_pos;
235  tile_pos.x = 0; tile_pos.y = 0;
236  }
237  }
238  }
239  }
240  }
241 
242  return 0;
243 }
244 
245 void SpawnInLevel();
246 
247 
248 void DrawLevel()
249 {
250  if(!gCurrentLevel)
251  {
252  printf("Level not loaded, unable to print");
253  return;
254  }
255  DrawSprite(gCurrentLevel->mBackground, NULL , NULL, gRenderer);
256 }
Definition: jsmn.h:40
int CountMem(void *src, int size_type)
Definition: mymath.c:51
#define LEVEL_ITEM_XTRA_STR
Definition: parselevel.h:16
#define LEVEL_SPAWN_STR
Definition: parselevel.h:9
#define LEVEL_ENEMY_OBJ_STR
Definition: parselevel.h:12
int y
Definition: globals.h:22
object_t * FindObject(object_t *obj, char *name)
Definition: parseobject.c:120
char * JsmnToString(jsmntok_t *token, char *g_str)
Definition: mystrings.c:34
vec2_t * ParseToVec2(struct object_s *object, char *str)
int StrToInt(char *str)
Definition: mystrings.c:92
#define LEVEL_TILE_Y_STR
Definition: parselevel.h:11
SDL_Renderer * gRenderer
Definition: graphics.c:10
int ConvertFileToUseable(char *fileName, jsmn_parser *parser, char **stringStorage, jsmntok_t **jsmnStorage)
Definition: mystrings.c:192
ai_function_t * ParsePresetAI(object_t *obj, char *g_str)
Definition: ai_interpret.c:374
entity_t * InitNewEntity()
Definition: entity.c:235
void TouchGoal(entity_t *self, entity_t *other, int type)
Definition: entity.c:209
void DrawGeneric(entity_t *self)
Definition: entity.c:17
void FreeNonPlayerEntities()
Definition: entity.c:409
entity_t * FindCachedEntity(const char *name)
Definition: entity.c:301
#define LEVEL_TILE_X_STR
Definition: parselevel.h:10
#define LEVEL_ITEM_NAME_STR
Definition: parselevel.h:15
void SpawnInLevel()
level_t * gCurrentLevel
Definition: parselevel.c:9
#define LEVEL_AI_STR
Definition: parselevel.h:17
#define G_NAME_STR
Definition: globals.h:133
#define LEVEL_ITEM_OBJ_STR
Definition: parselevel.h:14
jsmntok_t * FindKey(jsmntok_t *token, char *key, char *g_str)
Definition: mystrings.c:10
int LoadLevel(object_t *level, char *g_str)
Definition: parselevel.c:11
#define LEVEL_POSITION_STR
Definition: parselevel.h:18
void DrawLevel()
Definition: parselevel.c:248
char ** ParseToStringArray(struct object_s *object, char *str)
sprite_t * LoadSprite(const char *name, int flags)
Definition: graphics.c:107
int x
Definition: globals.h:21
int DrawSprite(sprite_t *sprite, int *frame, vec2_t *position, SDL_Renderer *renderer)
Definition: graphics.c:152
#define LEVEL_VARIABLES_STR
Definition: parselevel.h:21
char * FindValue(struct object_s *obj, char *key, char *g_str)
Definition: mystrings.c:53
void FreeEntity(entity_t *ent)
Definition: entity.c:379
void TouchGeneric(entity_t *self, entity_t *other, int type)
Definition: entity.c:139
object_t * ParseToObject(jsmntok_t *token, char *g_str)
Definition: parseobject.c:8
void ThinkEnemy(entity_t *self)
Definition: entity.c:102
#define LEVEL_BACKGROUND_STR
Definition: parselevel.h:7
#define LEVEL_ENEMY_NAME_STR
Definition: parselevel.h:13
ai_function_t * ParseAI(object_t *obj, char *g_str, char **variables)
Definition: ai_interpret.c:261
Definition: globals.h:19