ERR ExitTestController() { FreeEntity(ship); FreeEntity(flames); FreeEntity(yoshi); int i; for(i = 0; i < bolts->size; i++) FreeEntity((Entity*)GetValue(bolts, i)); ClearList(bolts); FreeEntity(bolt); FreePixelMap(visual_debug); return 0; }
void MinorThink(Entity *self) { self->s.x += self->v.x; self->s.y += self->v.y; if(self->v.x > -2)self->v.x--; if(self->s.y < 0) { self->s.y = 0; self->v.y += 15; } if(self->s.y > screen->h - 64) { self->s.y = screen->h - 24; self->v.y -= 15; } if((self->health <= 0) &&(self->state != ST_DYING)) { self->state = ST_DYING; self->frame = 1; } else if((ThePlayer->health > 0) && (self->state != ST_DYING) && (CollisionDetect(self,ThePlayer))) { ThePlayer->health = 0; self->state = ST_DYING; self->frame = 3; } if(self->s.x < - 32) { self->shown = 0; FreeEntity(self); } switch(self->state) { case ST_DYING: if(self->frame >= 3) { FreeEntity(self); } self->frame++; break; case ST_IDLE: self->frame++; if(self->frame >= 2) self->frame = 0; break; } }
//Run After All Think Functions //This is very generic void StandarAI_Think(entity_t *ent) { entity_t *cache_ref; cpVect temp_cp; int flags; flags = ent->mData->mFlags; ent->mNextThink = gCurrentTime + ent->mData->mVariables[AI_VAR_FRAMES]*UPDATE_FRAME_DELAY; ent->mDamage = ent->mData->mVariables[AI_VAR_DAMAGE]; cache_ref = FindCachedEntity(ent->mName); //Checks are right to left if(cache_ref->mPhysicsProperties && cache_ref) { if(flags & AI_FLAG_GRAVITY) { temp_cp.x = ent->mPhysicsProperties->body->v.x; temp_cp.y = 0; cpBodySetVel(ent->mPhysicsProperties->body, temp_cp); } } //Check Data if( --ent->mData->mVariables[AI_VAR_TIME] == 0) { ent->mData->mVariables[AI_VAR_TIME] = 1; ent->mData = ent->mData->mLink; } //Kill ent if dead if(ent->mHealth <= 0) { FreeEntity(ent); } }
void FreeEntityList() { int i; for (i = 0; i < MAX_ENTITIES; ++i) { FreeEntity(&Entities[i]); } }
ERR InitTestController() { ship = NewEntity("game/entities/ship.entity"); if(ship == NULL) return 1; flames = NewEntity("game/entities/flames.entity"); if(flames == NULL) { FreeEntity(ship); return 1; } yoshi = NewEntity("game/entities/test.entity"); if(yoshi == NULL) { FreeEntity(ship); FreeEntity(flames); return 1; } bolt = NewEntity("game/entities/bolt.entity"); ship->center_x = 120; ship->center_y = 120; ship->sprite->z_index = 3; yoshi->center_x = 220; yoshi->center_y = 120; yoshi->a_speed = 2; yoshi->x_speed = 0; yoshi->y_speed = 0; yoshi->sprite->z_index = 4; UpdateEntity(ship); UpdateEntity(flames); UpdateEntity(yoshi); bolt->sprite->z_index = 1; bolts = NewList(); visual_debug = NewPixelMap(640, 480, (Vector){320, 240}, 10); ClearPMap(visual_debug); flags = (INITIALISED | CONTINUE | UPDATE | DRAW); return 0; }
void FreeEntityFromList(entity* e) { if (&Entities[e->index] == NULL) printf("No such entity exists"); FreeEntity(&Entities[e->index]); }
ERR TestControllerLoop() { while(flags & CONTINUE) { //AddForce(ship->physics_object, 0.0, 10.0, ship->physics_object->cog_x, ship->physics_object->cog_y); SDL_Event event; while(SDL_PollEvent(&event) != 0) { if(event.type == SDL_QUIT) flags ^= CONTINUE; else if(event.type == SDL_KEYDOWN && event.key.repeat == 0) switch(event.key.keysym.sym) { case SDLK_UP: flames->sprite->data[CURRENT_LOOP] ^= 1; flags ^= ENGINE; break; case SDLK_DOWN: ship->y_speed = 0.0; ship->x_speed = 0.0; break; case SDLK_LEFT: ship->a_speed = -5.0; break; case SDLK_RIGHT: ship->a_speed = 5.0; break; case SDLK_r : yoshi->center_x = 220; yoshi->center_y = 120; yoshi->x_speed = 0; yoshi->y_speed = 0; ship->center_x = 520; ship->center_y = 120; ship->x_speed = 0; ship->y_speed = 0; case SDLK_SPACE: tmp = CopyEntity(bolt); tmp->center_x = ship->center_x; tmp->center_y = ship->center_y; tmp->angle = ship->angle; tmp->x_speed = RotateOffsetX(0.0, -10.0, ship->angle); tmp->y_speed = RotateOffsetY(0.0, -10.0, ship->angle); InsertValue(tmp, bolts, 0); break; } else if(event.type == SDL_KEYUP) switch(event.key.keysym.sym) { case SDLK_UP: flames->sprite->data[CURRENT_LOOP] ^= 1; flags ^= ENGINE; break; case SDLK_DOWN: break; case SDLK_LEFT: ship->a_speed = 0.0; break; case SDLK_RIGHT: ship->a_speed = 0.0; break; case SDLK_SPACE: break; } } if(flags & UPDATE) { if(flags & ENGINE) AddForce(ship->physics_object, RotateOffsetX(0.0, -20.0, ship->angle), RotateOffsetY(0.0, -20.0, ship->angle), ship->physics_object->cog_x, ship->physics_object->cog_y); if(CheckCollision(ship->collision_object, yoshi->collision_object) != 0) { printf("BOOM\n"); //flags ^= CONTINUE; AddForce(ship->physics_object, yoshi->x_speed * yoshi->physics_object->mass, yoshi->y_speed * yoshi->physics_object->mass, ship->physics_object->cog_x, ship->physics_object->cog_y); AddForce(yoshi->physics_object, ship->x_speed * ship->physics_object->mass, ship->y_speed * ship->physics_object->mass, yoshi->physics_object->cog_x, yoshi->physics_object->cog_y); } Element* el = bolts->start; Entity* tmp = NULL; int i = 0; while(el != NULL) { tmp = (Entity*)el->value; //if(CheckCollision(ship->collision_object, tmp->collision_object) != 0) //{ // printf("BOOM\n"); // flags ^= CONTINUE; //} if(CheckCollision(yoshi->collision_object, tmp->collision_object) != 0) { AddForce(yoshi->physics_object, RotateOffsetX(0.0, -10.0, tmp->angle), RotateOffsetY(0.0, -10.0, tmp->angle), yoshi->physics_object->cog_x, yoshi->physics_object->cog_y); yoshi->sprite->zoom -= 0.5; if(yoshi->sprite->zoom < 0.5) yoshi->sprite->zoom = 0.5; FreeEntity(tmp); FreeElement(bolts, i); } i++; el = el->next; } UpdateEntity(ship); flames->angle = ship->angle; flames->center_x = ship->center_x + RotateOffsetX(0.0, ship->sprite->h * ship->sprite->zoom, ship->angle); flames->center_y = ship->center_y + RotateOffsetY(0.0, ship->sprite->h * ship->sprite->zoom, ship->angle); UpdateEntity(flames); UpdateEntity(yoshi); yoshi->sprite->zoom += 0.01; yoshi->physics_object->mass = yoshi->sprite->zoom * 100; if(yoshi->physics_object->mass < 1) yoshi->physics_object->mass = 1; yoshi->collision_object->radius = 32*yoshi->sprite->zoom; if(yoshi->collision_object->radius < 1) yoshi->collision_object->radius = 1; for(i = 0; i < bolts->size; i++) { Entity* tmp = (Entity*)GetValue(bolts, i); if(tmp->center_x < -15 || tmp->center_y < -15 || tmp->center_x > 1000 || tmp->center_y > 500) { FreeEntity(tmp); FreeElement(bolts, i); } else UpdateEntity(tmp); } } if(flags & DRAW) { ClearPMap(visual_debug); DrawEntity(ship); DrawEntityDebugInfo(visual_debug, ship); DrawEntity(flames); DrawEntity(yoshi); DrawEntityDebugInfo(visual_debug, yoshi); int i; for(i = 0; i < bolts->size; i++) { Entity* tmp = (Entity*)GetValue(bolts, i); DrawEntity(tmp); DrawEntityDebugInfo(visual_debug, tmp); } DrawPixelMap(visual_debug); Render(); } } return ExitTestController(); }
void SpawnNPCGeneric(int x, int y,int r,Object *obj) { Entity *self; char *buf; Progress *p = NULL; NPC *npc; Monster *monster; self = NewEntity(); if(self == NULL)return; if(obj != NULL) { self->objindex = obj->id; p = GetProgressByIndexMap(level.name,obj->id); if((p != NULL)&&(strcmp(p->value,"dead")==0)) { FreeEntity(self); return; } } else strcpy(self->name,"npc"); if(!GetObjKey(obj->data,"name",&buf)) { FreeEntity(self); return; } strcpy(self->name,buf); npc = GetNPCByName(self->name); if(npc == NULL) { fprintf(stderr,"unable to find NPC %s!",self->name); FreeEntity(self); return; } monster = GetMonsterByName(npc->monster); if(monster == NULL) { fprintf(stderr,"failed to retreive monster data for %s!\n",self->name); FreeEntity(self); return; } self->radius = monster->radius; self->p.x = x; self->p.y = y; self->p.z = 0; self->r.z = r; self->s.x = self->s.y = self->s.z = monster->scale; self->think = NPCThink; self->ThinkRate = 50; self->update = UpdateNPC; self->UpdateRate = 30; self->activate = NPCTalk; self->hit = NPCAlert;/*bad touch*/ self->die = NPCDie; self->texture = LoadSprite(monster->sprite,monster->sx,monster->sy); self->box.w = 1; self->box.d = 1; self->box.h = 1; self->box.x = self->box.w/2; self->box.y = self->box.h/2; self->box.z = self->box.d/2; self->shaderProg = 0; self->team = 0; memcpy(self->data,obj->data,sizeof(obj->data)); self->solid = 1; self->frame = 0; self->sightblock = 0; self->sightdist = monster->sightdistance; self->sightrange = monster->sightrange; self->takesdamage = 1; self->attackrange = 30; self->health = self->healthmax = monster->health; self->stamina = self->staminamax = monster->stamina; self->mana = self->manamax = monster->mana; self->accel = 0.25; /*to be adjusted*/ self->speed = 5 * monster->movespeed; /*to be calculated*/ self->state = MS_Idle; self->attackspeed = monster->attackspeed; if(self->attackspeed == 0)self->attackspeed = 1; SetMonsterCombatStats(self,monster,0); }
void SpawnMonsterGeneric(int x, int y,int r,Object *obj) { Entity *self; char *buf; Progress *p = NULL; Monster *monster; self = NewEntity(); if(self == NULL)return; if(obj != NULL) { strcpy(self->name,obj->name); self->objindex = obj->id; p = GetProgressByIndexMap(level.name,obj->id); if((p != NULL)&&(strcmp(p->value,"dead")==0)) { FreeEntity(self); return; } } else strcpy(self->name,"monster"); if(!GetObjKey(obj->data,"monster",&buf)) { FreeEntity(self); return; } sscanf(buf,"%s",self->name); monster = GetMonsterByName(self->name); if(monster == NULL) { fprintf(stderr,"failed to retreive monster data for %s!\n",self->name); FreeEntity(self); return; } self->radius = monster->radius; self->p.x = x; self->p.y = y; self->p.z = 0; self->r.z = r; self->s.x = self->s.y = self->s.z = monster->scale; self->think = MonsterThink; self->ThinkRate = 50; self->update = UpdateMonster; self->UpdateRate = 30; self->activate = MonsterAlert; self->touch = MonsterAlert; self->hit = MonsterAlert; self->die = MonsterDie; self->texture = LoadSprite(monster->sprite,monster->sx,monster->sy); self->shaderProg = 0; if(!GetObjKey(obj->data,"neutral",&buf)) self->team = 2; else self->team = 0; memcpy(self->data,obj->data,sizeof(obj->data)); self->solid = 1; self->frame = 0; self->sightblock = 0; self->sightdist = monster->sightdistance; self->sightrange = monster->sightrange; self->takesdamage = 1; self->health = self->healthmax = monster->health; self->stamina = self->staminamax = monster->stamina; self->mana = self->manamax = monster->mana; self->accel = 0.25; /*to be adjusted*/ self->speed = 5 * monster->movespeed; /*to be calculated*/ self->attackspeed = monster->attackspeed; self->guardstrength = monster->guardstrength; self->guardrange = monster->guardrange; if(self->attackspeed == 0)self->attackspeed = 1; SetMonsterCombatStats(self,monster,0); self->state = MS_Idle; }