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; }
/** * Creates and sets up the hero entity * @return The hero entity created */ Entity_T *SetupHero() { int i, x; const GLfloat SPRITE_WIDTH = 32.0f / 128; const GLfloat SPRITE_HEIGHT = 48.0f / 192; Rect frames[20]; Animation_T animations[MAX_ANIMATIONS]; Entity_T *e = NewEntity(); e->currentAnimation = 0; e->currentFrame = 0; e->sprite = NewSprite(); e->body = cpBodyNew(100.0f, 100.0f); e->size.x = TILE_WIDTH; e->size.y = 1.5f * TILE_HEIGHT; e->shape = cpBoxShapeNew(e->body, e->size.x/2, e->size.y/2); for(i = 0;i < 20;i++) { frames[i].x = (i % 4) * SPRITE_WIDTH; frames[i].y = 1.0f - (i/4+1) * SPRITE_HEIGHT; frames[i].w = SPRITE_WIDTH; frames[i].h = SPRITE_HEIGHT; } for(x = 0;x < 4;x++) { animations[x].numFrames = 1; animations[x].frames[0] = x*4; animations[x].frameLengths[0] = 100; animations[x].flags = ANIMFLAG_NONE; } for(x = 4;x < 8;x++){ animations[x].numFrames = 4; for(i = 0;i < 4;i++){ animations[x].frames[i] = (x-4)*4+i; animations[x].frameLengths[i] = 100; } animations[x].flags = ANIMFLAG_NONE; } SetupSprite(e->sprite, "hero.png", frames, 20, animations, 8); //Set up the hero's inner light e->light = NewLight(); e->light->brightness = 0.75f; e->light->color.x = 1.0f; e->light->color.y = .95f; e->light->color.z = 0.5f; e->light->span = TILE_WIDTH / 2; e->light->offset.x = TILE_WIDTH / 2; e->light->offset.y = 0; SET_FLAG(e->flags, ENTFLAG_LIGHT); e->next = NULL; return e; }
Entity_T *SetupMonster(int monster) { int i, x; const GLfloat SPRITE_WIDTH = 32.0f / 128; const GLfloat SPRITE_HEIGHT = 48.0f / 192; Rect frames[20]; Animation_T animations[MAX_ANIMATIONS]; Entity_T *e = NewEntity(); e->currentAnimation = 0; e->currentFrame = 0; e->sprite = NewSprite(); e->body = cpBodyNew(1.0f, 1.0f); e->size.x = 3* TILE_WIDTH; e->size.y = 3 * 1.5f * TILE_HEIGHT; e->shape = cpBoxShapeNew(e->body, e->size.x/2, e->size.y/2); for(i = 0;i < 20;i++) { frames[i].x = (i % 4) * SPRITE_WIDTH; frames[i].y = 1.0f - (i/4+1) * SPRITE_HEIGHT; frames[i].w = SPRITE_WIDTH; frames[i].h = SPRITE_HEIGHT; } for(x = 0;x < 4;x++) { animations[x].numFrames = 1; animations[x].frames[0] = x*4; animations[x].frameLengths[0] = 100; animations[x].flags = ANIMFLAG_NONE; } for(x = 4;x < 8;x++){ animations[x].numFrames = 4; for(i = 0;i < 4;i++){ animations[x].frames[i] = (x-4)*4+i; animations[x].frameLengths[i] = 100; } animations[x].flags = ANIMFLAG_NONE; } //TODO: Kludgy as heck, redo later. switch(monster){ case 0: SetupSprite(e->sprite, "monster0.png", frames, 20, animations, 8); break; case 1: SetupSprite(e->sprite, "monster1.png", frames, 20, animations, 8); break; } return e; }
//-------------------------------------------------------------------------- LoadEntResult Server::LoadEntity(const VeChar8* pcName, const VeChar8* pcSearchIndex, EntityS** ppkOut) { VeUInt32 u32Type = _EntNameToType(pcName); if(u32Type == VE_INFINITE) { if(ppkOut) *ppkOut = NULL; return LOAD_ENT_TYPE_NOT_EXIST; } else { if(u32Type >= m_kEntityCacheArray.Size()) { m_kEntityCacheArray.Resize(u32Type + 1); } EntityCache& kCache = m_kEntityCacheArray[u32Type]; VeStringMap<EntityS*>::iterator it = kCache.m_kIndexMap.Find(pcSearchIndex); if(it) { if(ppkOut) *ppkOut = *it; return LOAD_ENT_EXIST; } else { EntityS* pkEnt = NewEntity(pcName, pcSearchIndex); if(pkEnt) { if(pkEnt->OnLoad()) { pkEnt->m_pkCache = &kCache; kCache.m_kIndexMap[pcSearchIndex] = pkEnt; kCache.m_kWildEntities.AttachBack(pkEnt->m_kServerNode); if(ppkOut) *ppkOut = pkEnt; return LOAD_ENT_S_OK; } else { VE_SAFE_DELETE(pkEnt); if(ppkOut) *ppkOut = NULL; return LOAD_ENT_E_FAIL; } } else { if(ppkOut) *ppkOut = NULL; return LOAD_ENT_E_FAIL; } } } }
Entity_T *SetupObject(int object) { int i, x; const GLfloat SPRITE_WIDTH = 32.0f / 128; const GLfloat SPRITE_HEIGHT = 48.0f / 192; Rect frames[20]; Animation_T animations[MAX_ANIMATIONS]; Entity_T *e = NewEntity(); e->currentAnimation = 0; e->currentFrame = 0; e->sprite = NewSprite(); e->body = cpBodyNew(1.0f, 1.0f); e->size.x = TILE_WIDTH; e->size.y = 1.5f * TILE_HEIGHT; e->shape = cpBoxShapeNew(e->body, e->size.x/2, e->size.y/2); frames[0].x = 0; frames[0].y = 0; frames[0].w = 1; frames[0].h = 1; animations[0].numFrames = 1; animations[0].frames[0] = 0; animations[0].frameLengths[0] = 100; animations[0].flags = ANIMFLAG_NONE; //TODO: Kludgy as heck, redo later. switch(object){ case 0: SetupSprite(e->sprite, "torch.png", frames, 1, animations, 1); e->light = NewLight(); e->light->color.x = 1.0f; e->light->color.y = 0.0f; e->light->color.z = 1.0f; e->light->brightness = 0.75f; e->light->span = TILE_WIDTH * .75f; e->light->offset.x = TILE_WIDTH / 2; e->light->offset.y = 0; SET_FLAG(e->flags, ENTFLAG_LIGHT); e->currentAnimation = 0; e->currentFrame = 0; e->dir = ENTDIR_DOWN; break; } return e; }
//-------------------------------------------------------------------------- void ServerAgent::EntityUpdate(BitStream& kStream) { VEString kName; kStream >> kName; EntityC* pkEntity(NULL); VeStringMap<EntityC*>::iterator it = m_kEntityMap.Find(kName); if(it) { pkEntity = *it; } else { pkEntity = NewEntity(kName); m_kEntityMap[kName] = pkEntity; m_kEntityList.AttachBack(pkEntity->m_kNode); } pkEntity->Update(kStream); if(!it) pkEntity->OnLoad(); VeDebugOutputString("EntityUpdated"); }
TurtleShell* NewTurtleShell () { Entity *ent = NewEntity (); TurtleShell *self = TURTLE_SHELL(ent); ent->type = ET_BULLET | ET_SHELL; ent->collWith = ET_ENEMY | ET_PLAYER | ET_MAP | ET_BULLET; // callbacks ent->Update = UpdateCb; ent->Render = RenderCb; ent->HandleCollision = HandleCollision; TURTLE_SHELL (ent)->animTimer=0; ent->bounds.type = BT_AABB; ent->bounds.half = Vec2f(20,8); return self; }
void SpawnHeavy(Entity *owner, int x, int y, int weapon, int group) { Entity *newent = NULL; newent = NewEntity(); { fprintf(stderr,"Unable to generate enemy entity; %s",SDL_GetError()); return; } strcpy(newent->EntName,"MinorShip\0"); newent->sprite = LoadSprite("images/enemies/heas.ysheet.png",48,48); SDL_SetColorKey(newent->sprite->image, SDL_SRCCOLORKEY , SDL_MapRGB(newent->sprite->image->format, 0,0,0)); newent->owner = owner; // newent->update = UpdateEnemy; newent->think = HeavyThink; //newent->UpdateRate = 45; newent->ThinkRate = 45; newent->Unit_Type = group; newent->frame = 0; newent->fcount = 0; newent->frate = 1; newent->state = ST_IDLE; newent->healthmax = 20; newent->health = 20; newent->takedamage = 1; newent->s.x = x; newent->s.y = y; newent->currentweapon = 0; newent->v.x = 0; newent->v.y = 0; newent->enemy = 1; newent->Boundingbox.x = 8; newent->Boundingbox.y = 12; newent->Boundingbox.w = 36; newent->Boundingbox.h = 26; }
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; }