/* ----------------------------------------------------------------------------- Function: Parameters: Returns: Notes: ----------------------------------------------------------------------------- */ PUBLIC entity_t *SpawnActor( enemy_t which, int x, int y, dir4type dir, LevelData_t *lvl ) { entity_t *new_actor; new_actor = GetNewActor(); if( ! new_actor ) { return NULL; } new_actor->x = TILE2POS( x ); new_actor->y = TILE2POS( y ); new_actor->tilex = x; new_actor->tiley = y; assert( dir >= 0 && dir <= 4 ); new_actor->angle = dir4angle[ dir ]; new_actor->dir = dir4to8[ dir ]; new_actor->areanumber = lvl->areas[ x ][ y ]; // Com_Printf( "Actor at %i,%i had areaNum: %i\n", x, y, new_actor->areanumber ); if ( new_actor->areanumber < 0 ) { // ambush marker tiles are listed as -3 area new_actor->areanumber = 0; } assert( new_actor->areanumber >= 0 && new_actor->areanumber < NUMAREAS ); new_actor->type = which; new_actor->health = starthitpoints[ (int)skill->value ][ which ]; new_actor->sprite = Sprite_GetNewSprite(); return new_actor; }
void InitActorList (void) { int i; // // init the actor lists // for (i = 0; i < MAXACTORS; i++) { objlist[i].prev = &objlist[i + 1]; objlist[i].next = NULL; } objlist[MAXACTORS - 1].prev = NULL; objfreelist = &objlist[0]; lastobj = NULL; objcount = 0; // // give the player the first free spots // GetNewActor (); player = newobj; }
void InitActorList (void) { Sint16 i; // // init the actor lists // #if LOOK_FOR_DEAD_GUYS NumDeadGuys=0; memset(DeadGuys,0,sizeof(DeadGuys)); #endif memset(statobjlist,0,sizeof(statobjlist)); for (i=0;i<MAXACTORS;i++) { objlist[i].prev = &objlist[i+1]; objlist[i].next = NULL; } objlist[MAXACTORS-1].prev = NULL; objfreelist = &objlist[0]; lastobj = NULL; objcount = 0; // // give the player the first free spots // GetNewActor (); player = new_actor; }
boolean LoadTheGame(FILE *file,int x,int y) { int32_t oldchecksum; objtype nullobj; statobj_t nullstat; int actnum=0, i, j; int32_t checksum = 0; DiskFlopAnim(x,y); fread (&gamestate,sizeof(gamestate),1,file); checksum = DoChecksum((byte *)&gamestate,sizeof(gamestate),checksum); DiskFlopAnim(x,y); fread (&LevelRatios[0],sizeof(LRstruct)*LRpack,1,file); checksum = DoChecksum((byte *)&LevelRatios[0],sizeof(LRstruct)*LRpack,checksum); DiskFlopAnim(x,y); SetupGameLevel (); DiskFlopAnim(x,y); fread (tilemap,sizeof(tilemap),1,file); checksum = DoChecksum((byte *)tilemap,sizeof(tilemap),checksum); DiskFlopAnim(x,y); for(i=0; i<MAPSIZE; i++) { for(j=0; j<MAPSIZE; j++) { fread (&actnum,sizeof(word),1,file); checksum = DoChecksum((byte *) &actnum,sizeof(word),checksum); if(actnum&0x8000) actorat[i][j]=objlist+(actnum&0x7fff); else actorat[i][j]=(objtype *)(uintptr_t) actnum; } } fread (areaconnect,sizeof(areaconnect),1,file); fread (areabyplayer,sizeof(areabyplayer),1,file); InitActorList (); DiskFlopAnim(x,y); fread (player,sizeof(*player),1,file); player->state=(statetype *) ((uintptr_t)player->state+(uintptr_t)&s_player); /* Load all actors ? */ while (1) { DiskFlopAnim(x,y); fread (&nullobj,sizeof(nullobj),1,file); if (nullobj.active == ac_badobject) break; GetNewActor (); nullobj.state=(statetype *) ((uintptr_t)nullobj.state+(uintptr_t)&s_grdstand); /* don't copy over the links */ memcpy (newobj,&nullobj,sizeof(nullobj)-8); } DiskFlopAnim(x,y); word laststatobjnum; fread (&laststatobjnum,sizeof(laststatobjnum),1,file); laststatobj=statobjlist+laststatobjnum; checksum = DoChecksum((byte *)&laststatobjnum,sizeof(laststatobjnum),checksum); DiskFlopAnim(x,y); for(i=0; i<MAXSTATS; i++) { fread(&nullstat,sizeof(nullstat),1,file); checksum = DoChecksum((byte *)&nullstat,sizeof(nullstat),checksum); nullstat.visspot=(byte *) ((uintptr_t)nullstat.visspot+(uintptr_t)spotvis); memcpy(statobjlist+i,&nullstat,sizeof(nullstat)); } DiskFlopAnim(x,y); fread (doorposition,sizeof(doorposition),1,file); checksum = DoChecksum((byte *)doorposition,sizeof(doorposition),checksum); DiskFlopAnim(x,y); fread (doorobjlist,sizeof(doorobjlist),1,file); checksum = DoChecksum((byte *)doorobjlist,sizeof(doorobjlist),checksum); DiskFlopAnim(x,y); fread (&pwallstate,sizeof(pwallstate),1,file); checksum = DoChecksum((byte *)&pwallstate,sizeof(pwallstate),checksum); fread (&pwalltile,sizeof(pwalltile),1,file); checksum = DoChecksum((byte *)&pwalltile,sizeof(pwalltile),checksum); fread (&pwallx,sizeof(pwallx),1,file); checksum = DoChecksum((byte *)&pwallx,sizeof(pwallx),checksum); fread (&pwally,sizeof(pwally),1,file); checksum = DoChecksum((byte *)&pwally,sizeof(pwally),checksum); fread (&pwalldir,sizeof(pwalldir),1,file); checksum = DoChecksum((byte *)&pwalldir,sizeof(pwalldir),checksum); fread (&pwallpos,sizeof(pwallpos),1,file); checksum = DoChecksum((byte *)&pwallpos,sizeof(pwallpos),checksum); /* assign valid floorcodes under moved pushwalls */ if (gamestate.secretcount) { word *map, *obj; word tile, sprite; map = mapsegs[0]; obj = mapsegs[1]; for (y=0; y<mapheight; y++) for (x=0; x<mapwidth; x++) { tile = *map++; sprite = *obj++; if (sprite == PUSHABLETILE && !tilemap[x][y] && (tile < AREATILE || tile >= (AREATILE+NUMMAPS))) { if (*map >= AREATILE) tile = *map; if (*(map-1-mapwidth) >= AREATILE) tile = *(map-1-mapwidth); if (*(map-1+mapwidth) >= AREATILE) tile = *(map-1+mapwidth); if ( *(map-2) >= AREATILE) tile = *(map-2); *(map-1) = tile; *(obj-1) = 0; } } } /* set player->areanumber to the floortile you're standing on */ Thrust(0,0); fread (&oldchecksum,sizeof(oldchecksum),1,file); fread (&lastgamemusicoffset,sizeof(lastgamemusicoffset),1,file); if(lastgamemusicoffset<0) lastgamemusicoffset=0; if (oldchecksum != checksum) { Message(STR_SAVECHT1"\n" STR_SAVECHT2"\n" STR_SAVECHT3"\n" STR_SAVECHT4); IN_ClearKeysDown(); IN_Ack(); gamestate.oldscore = gamestate.score = 0; gamestate.lives = 1; gamestate.weapon = gamestate.chosenweapon = gamestate.bestweapon = wp_pistol; gamestate.ammo = 8; } return true; }