コード例 #1
0
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;
}
コード例 #2
0
ファイル: enemy.c プロジェクト: FratStar/Scratch
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;
	}
}
コード例 #3
0
//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);
	}
}
コード例 #4
0
ファイル: entity.c プロジェクト: EdConroy/LegionEngine3D
void FreeEntityList()
{
	int i;
	for (i = 0; i < MAX_ENTITIES; ++i)
	{
		FreeEntity(&Entities[i]);
	}
}
コード例 #5
0
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;
}
コード例 #6
0
ファイル: entity.c プロジェクト: EdConroy/LegionEngine3D
void FreeEntityFromList(entity* e)
{
	if (&Entities[e->index] == NULL)
		printf("No such entity exists");
	FreeEntity(&Entities[e->index]);
}
コード例 #7
0
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();
}
コード例 #8
0
ファイル: npcs.c プロジェクト: engineerOfLies/project-dark
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);
}
コード例 #9
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;
}