Dumb-ways-to-memorize
2D game
parseentity.c
Go to the documentation of this file.
1 #include "parseentity.h"
2 #include "parseobject.h"
3 #include "mystrings.h"
4 #include <jsmn.h>
5 
6 #include <string.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 
10 //Globals
11 char *ComplexVariableNames[] = {"hazard(s)", "collisionType", "entityState", 0};
12 char *Vector2VariableNames[] = {"accel", "velocity", "position", 0};
13 char *SimpleVariableNames[] = {"sprite(s)", "health", "damage", "height", "width", "frames", 0 };
14 
15 void AddComplexMemToEnt(entity_t *ent, entity_members_complex_t member, void *value)
16 {
17  if(!value || !ent)
18  {
19  return;
20  }
21 
22  switch(member)
23  {
24  case ENTITY_MEMBER_HAZARDS: ent->mHazards = (int) value; break;
25  case ENTITY_MEMBER_COLLISION_TYPE: ent->mCollisionType = (collision_type_t) (int) value; break;
26  case ENTITY_MEMBER_ENTITY_STATE: ent->mEntityState = (entity_state_t) (int) value; break;
27  default:
28  break;
29  }
30 }
31 
32 void AddVector2Entity(entity_t *ent, entity_members_vector2_t member, vec2_t *value)
33 {
34  if(!value || !ent)
35  {
36  return;
37  }
38 
39  switch(member)
40  {
41  case ENTITY_MEMBER_ACCEL: ent->mAccel = *value; break;
42  case ENTITY_MEMBER_POSITION: ent->mPosition = *value; break;
43  case ENTITY_MEMBER_VELOCITY: ent->mVelocity = *value; break;
44  default:
45  break;
46  }
47 }
48 
49 void AddSpritesToEnt(entity_t *ent, char **files, int size)
50 {
51  int i;
52  sprite_t **checkSprite;
53  if(!files || !ent)
54  {
55  return;
56  }
57  checkSprite = (sprite_t**) malloc(sizeof(sprite_t*)*(size+1));
58  if(!checkSprite)
59  {
60  return;
61  }
62  for(i = 0; i < size; i++)
63  {
64  checkSprite[i] = LoadSprite(files[i], 0);
65  }
66  checkSprite[size] = NULL;
67  ent->mSprites = checkSprite;
68 }
69 
70 entity_t* ParseToEntity(object_t* object, char* str)
71 {
72  int i, j, position, size, heights[MAX_ANIMATIONS] = {0}, widths[MAX_ANIMATIONS] = {0}, frames[MAX_ANIMATIONS] = {0};
73  char **spriteFiles;
74  entity_t *retVal;
75  Frame *checkFrame = NULL;
76  jsmntok_t *checkTok = NULL;
77  object_t *checkObj = NULL;
78  if(!object || !str)
79  return NULL;
80  retVal = (entity_t*) malloc(sizeof(entity_t));
81  spriteFiles = (char**) malloc(sizeof(char*)*(MAX_ANIMATIONS+1));
82  memset(spriteFiles, 0, sizeof(char*)*(MAX_ANIMATIONS+1));
83  memset(retVal, 0, sizeof(entity_t));
84  retVal->mName = object->name;
85  for(i = 0; ComplexVariableNames[i]; i++)
86  {
87  if( (checkTok = FindKey(object->keys, ComplexVariableNames[i], str)) != NULL)
88  {
89  position = checkTok - object->keys;
90  ParseComplexMember(retVal, &object->values[position], str, (entity_members_complex_t)i, 1);
91 
92  checkTok = NULL;
93  }
94  else if( (checkObj = FindObject(object, ComplexVariableNames[i])) != NULL)
95  {
96  size = CountMem(checkObj->values, sizeof(jsmntok_t));
97  ParseComplexMember(retVal, checkObj->values, str, (entity_members_complex_t)i, size);
98 
99  checkObj = NULL;
100  }
101  }
102 
103  for(i = 0; Vector2VariableNames[i]; i++)
104  {
105  if( (checkObj = FindObject(object, Vector2VariableNames[i])) != NULL)
106  {
107  AddVector2Entity(retVal, (entity_members_vector2_t) i, ParseToVec2(checkObj, str));
108  }
109  }
110 
111  for(i = 0; SimpleVariableNames[i]; i++)
112  {
113  if( (checkObj = FindObject(object, SimpleVariableNames[i])) != NULL)
114  {
115  for(j = 0; checkObj->values[j].type; j++)
116  {
117  switch(i)
118  {
119  case ENTITY_MEMBER_SPRITE: spriteFiles[j] = JsmnToString(&checkObj->values[j], str); break;
120  case ENTITY_MEMBER_HEIGHT: JsmnToInt(&checkObj->values[j], str, &heights[j]); break;
121  case ENTITY_MEMBER_WIDTH: JsmnToInt(&checkObj->values[j], str, &widths[j]); break;
122  case ENTITY_MEMBER_FRAMES: JsmnToInt(&checkObj->values[j], str, &frames[j]); break;
123  default:
124  break;
125  }
126  }
127  } else if ( (checkTok = FindKey(object->keys, SimpleVariableNames[i], str)) != NULL)
128  {
129  switch(i)
130  {
131  case ENTITY_MEMBER_SPRITE: spriteFiles[0] = JsmnToString(&checkObj->values[0], str); break;
132  case ENTITY_MEMBER_HEALTH: JsmnToInt(checkTok, str, &retVal->mHealth); break;
133  case ENTITY_MEMBER_DAMAGE: JsmnToInt(checkTok, str, &retVal->mDamage); break;
134  case ENTITY_MEMBER_HEIGHT: JsmnToInt(checkTok, str, &heights[0]); break;
135  case ENTITY_MEMBER_WIDTH: JsmnToInt(checkTok, str, &widths[0]); break;
136  case ENTITY_MEMBER_FRAMES: JsmnToInt(checkTok, str, &frames[0]); break;
137  default:
138  break;
139  }
140  }
141  }
142 
143  AddSpritesToEnt(retVal, spriteFiles, CountMem(spriteFiles, sizeof(char*)));
144 
145  if(retVal->mSprites)
146  {
147  for(i = 0; retVal->mSprites[i]; i++)
148  {
149  if(!retVal->mSprites[i])
150  break;
151  checkFrame = LoadAnimation(widths[i], heights[i], retVal->mSprites[i]->mSize.x, retVal->mSprites[i]->mSize.y);
152  retVal->mSprites[i]->mFrames = frames[i] ? frames[i] : 1;
153  memcpy(&retVal->mSprites[i]->mAnimations, checkFrame, sizeof(Frame)*retVal->mSprites[i]->mFrames );
154  }
155  }
156  retVal->mNextThink = 1;
157  retVal->mCurrentFrame = 0;
158  retVal->mWeight = 1;
159  retVal->Think = ThinkGeneric;
160  retVal->Draw = DrawGeneric;
161  retVal->Touch = TouchGeneric;
162  PrintEntity(retVal);
163  return retVal;
164 }
165 
166 void ParseComplexMember(entity_t *ent, jsmntok_t* token, char *str, entity_members_complex_t member, int size)
167 {
168  int i;
169  char *temp;
170  int checkInt = 0;
171  if(!ent || !token || !str)
172  return;
173  if(member== ENTITY_MEMBER_HAZARDS)
174  {
175  for(i= 0; i < size; i++)
176  {
177  temp = JsmnToString(&token[i], str);
178  checkInt += StrToHazard(temp);
179  if(temp) free(temp);
180  }
181  AddComplexMemToEnt(ent, member, (void*)checkInt);
182  }else if(member == ENTITY_MEMBER_COLLISION_TYPE)
183  {
184  temp = JsmnToString(token, str);
185  AddComplexMemToEnt(ent, member, (void*)StrToCollisionType(temp));
186  if(temp) free(temp);
187  } else if (member == ENTITY_MEMBER_ENTITY_STATE)
188  {
189  temp = JsmnToString(token, str);
190  AddComplexMemToEnt(ent, member, (void*)StrToEntityState(temp));
191  if(temp) free(temp);
192  }
193 }
194 
195 void PrintEntity(entity_t *ent)
196 {
197  int i;
198  if(!ent)
199  {
200  printf("Print Entity given NULL Entity \n");
201  return;
202  }
203  if(!ent->mName)
204  {
205  printf("Print Entity given NULL Entity Name");
206  return;
207  }
208  printf("< Entity \n");
209  printf("Entity Name : %s \n", ent->mName);
210  printf("Entity CollisionType : %d \n", ent->mCollisionType);
211  printf("Enity State : %d \n", ent->mEntityState);
212  if(!ent->mSprites)
213  {
214  printf("No Sprites loaded \n");
215  return;
216  }
217  if(!ent->mSprites[0])
218  {
219  printf("No Sprites loaded \n");
220  return;
221  }
222  printf("Entity Sprites : %s \n", ent->mSprites[0]->name);
223  for(i = 1; ent->mSprites[i]; i++)
224  {
225  printf(" %s ", ent->mSprites[i]->name);
226  }
227  printf(" Entity > \n");
228 
229 }
Definition: jsmn.h:40
int CountMem(void *src, int size_type)
Definition: mymath.c:51
Definition: graphics.h:15
object_t * FindObject(object_t *obj, char *name)
Definition: parseobject.c:120
char * JsmnToString(jsmntok_t *token, char *g_str)
Definition: mystrings.c:34
entity_members_complex_t
Definition: parseentity.h:12
Frame * LoadAnimation(int frame_width, int frame_height, int width, int height)
Definition: graphics.c:190
vec2_t * ParseToVec2(struct object_s *object, char *str)
entity_state_t StrToEntityState(char *str)
Definition: mystrings.c:370
void AddComplexMemToEnt(entity_t *ent, entity_members_complex_t member, void *value)
Definition: parseentity.c:15
char * ComplexVariableNames[]
Definition: parseentity.c:11
#define MAX_ANIMATIONS
Definition: graphics.h:12
int StrToHazard(char *str)
Definition: mystrings.c:317
void DrawGeneric(entity_t *self)
Definition: entity.c:17
char * SimpleVariableNames[]
Definition: parseentity.c:13
collision_type_t StrToCollisionType(char *str)
Definition: mystrings.c:344
entity_state_t
Definition: globals.h:45
jsmntok_t * FindKey(jsmntok_t *token, char *key, char *g_str)
Definition: mystrings.c:10
void JsmnToInt(jsmntok_t *token, char *str, int *dst)
Definition: mystrings.c:84
entity_t * ParseToEntity(object_t *object, char *str)
Definition: parseentity.c:70
char * Vector2VariableNames[]
Definition: parseentity.c:12
void ThinkGeneric(entity_t *self)
Definition: entity.c:45
void PrintEntity(entity_t *ent)
Definition: parseentity.c:195
collision_type_t
Definition: globals.h:53
entity_members_vector2_t
Definition: parseentity.h:21
sprite_t * LoadSprite(const char *name, int flags)
Definition: graphics.c:107
void AddVector2Entity(entity_t *ent, entity_members_vector2_t member, vec2_t *value)
Definition: parseentity.c:32
void TouchGeneric(entity_t *self, entity_t *other, int type)
Definition: entity.c:139
void ParseComplexMember(entity_t *ent, jsmntok_t *token, char *str, entity_members_complex_t member, int size)
Definition: parseentity.c:166
void AddSpritesToEnt(entity_t *ent, char **files, int size)
Definition: parseentity.c:49
Definition: globals.h:19