void AInventory::BecomeItem () { if (!(flags & (MF_NOBLOCKMAP|MF_NOSECTOR))) { UnlinkFromWorld (nullptr); flags |= MF_NOBLOCKMAP|MF_NOSECTOR; LinkToWorld (nullptr); } RemoveFromHash (); flags &= ~MF_SPECIAL; ChangeStatNum(STAT_INVENTORY); // stop all sounds this item is playing. for(int i = 1;i<=7;i++) S_StopSound(this, i); SetState (FindState("Held")); }
void AInventory::BecomePickup () { if (Owner != NULL) { Owner->RemoveInventory (this); } if (flags & (MF_NOBLOCKMAP|MF_NOSECTOR)) { UnlinkFromWorld (); flags &= ~(MF_NOBLOCKMAP|MF_NOSECTOR); LinkToWorld (); P_FindFloorCeiling (this); } flags = (GetDefault()->flags | MF_DROPPED) & ~MF_COUNTITEM; renderflags &= ~RF_INVISIBLE; SetState (SpawnState); }
void AInventory::BecomeItem () { if (!(flags & (MF_NOBLOCKMAP|MF_NOSECTOR))) { UnlinkFromWorld (); if (sector_list) { P_DelSeclist (sector_list); sector_list = NULL; } flags |= MF_NOBLOCKMAP|MF_NOSECTOR; LinkToWorld (); } RemoveFromHash (); flags &= ~MF_SPECIAL; SetState (FindState("Held")); }
bool APathFollower::Interpolate () { fixed_t dx = 0, dy = 0, dz = 0; if ((args[2] & 8) && Time > 0.f) { dx = x; dy = y; dz = z; } if (CurrNode->Next==NULL) return false; UnlinkFromWorld (); if (args[2] & 1) { // linear x = FLOAT2FIXED(Lerp (FIXED2FLOAT(CurrNode->x), FIXED2FLOAT(CurrNode->Next->x))); y = FLOAT2FIXED(Lerp (FIXED2FLOAT(CurrNode->y), FIXED2FLOAT(CurrNode->Next->y))); z = FLOAT2FIXED(Lerp (FIXED2FLOAT(CurrNode->z), FIXED2FLOAT(CurrNode->Next->z))); } else { // spline if (CurrNode->Next->Next==NULL) return false; x = FLOAT2FIXED(Splerp (FIXED2FLOAT(PrevNode->x), FIXED2FLOAT(CurrNode->x), FIXED2FLOAT(CurrNode->Next->x), FIXED2FLOAT(CurrNode->Next->Next->x))); y = FLOAT2FIXED(Splerp (FIXED2FLOAT(PrevNode->y), FIXED2FLOAT(CurrNode->y), FIXED2FLOAT(CurrNode->Next->y), FIXED2FLOAT(CurrNode->Next->Next->y))); z = FLOAT2FIXED(Splerp (FIXED2FLOAT(PrevNode->z), FIXED2FLOAT(CurrNode->z), FIXED2FLOAT(CurrNode->Next->z), FIXED2FLOAT(CurrNode->Next->Next->z))); } LinkToWorld (); if (args[2] & 6) { if (args[2] & 8) { if (args[2] & 1) { // linear dx = CurrNode->Next->x - CurrNode->x; dy = CurrNode->Next->y - CurrNode->y; dz = CurrNode->Next->z - CurrNode->z; } else if (Time > 0.f) { // spline dx = x - dx; dy = y - dy; dz = z - dz; } else { int realarg = args[2]; args[2] &= ~(2|4|8); Time += 0.1f; dx = x; dy = y; dz = z; Interpolate (); Time -= 0.1f; args[2] = realarg; dx = x - dx; dy = y - dy; dz = z - dz; x -= dx; y -= dy; z -= dz; } if (args[2] & 2) { // adjust yaw angle = R_PointToAngle2 (0, 0, dx, dy); } if (args[2] & 4) { // adjust pitch; use floats for precision float fdx = FIXED2FLOAT(dx); float fdy = FIXED2FLOAT(dy); float fdz = FIXED2FLOAT(-dz); float dist = (float)sqrt (fdx*fdx + fdy*fdy); float ang = dist != 0.f ? (float)atan2 (fdz, dist) : 0; pitch = (angle_t)(ang * 2147483648.f / PI); } } else { if (args[2] & 2) { // interpolate angle float angle1 = (float)CurrNode->angle; float angle2 = (float)CurrNode->Next->angle; if (angle2 - angle1 <= -2147483648.f) { float lerped = Lerp (angle1, angle2 + 4294967296.f); if (lerped >= 4294967296.f) { angle = (angle_t)(lerped - 4294967296.f); } else { angle = (angle_t)lerped; } } else if (angle2 - angle1 >= 2147483648.f) { float lerped = Lerp (angle1, angle2 - 4294967296.f); if (lerped < 0.f) { angle = (angle_t)(lerped + 4294967296.f); } else { angle = (angle_t)lerped; } } else { angle = (angle_t)Lerp (angle1, angle2); } } if (args[2] & 1) { // linear if (args[2] & 4) { // interpolate pitch pitch = FLOAT2FIXED(Lerp (FIXED2FLOAT(CurrNode->pitch), FIXED2FLOAT(CurrNode->Next->pitch))); } } else { // spline if (args[2] & 4) { // interpolate pitch pitch = FLOAT2FIXED(Splerp (FIXED2FLOAT(PrevNode->pitch), FIXED2FLOAT(CurrNode->pitch), FIXED2FLOAT(CurrNode->Next->pitch), FIXED2FLOAT(CurrNode->Next->Next->pitch))); } } } } return true; }
void AActor::Serialize (FArchive &arc) { Super::Serialize (arc); if (arc.IsStoring ()) { arc << x << y << z << pitch << angle << roll << (int)sprite << frame << effects << floorz << ceilingz << radius << height << momx << momy << momz << (int)type << tics << state << flags << flags2 << health << movedir << visdir << movecount << target->netid << lastenemy->netid << reactiontime << threshold << player << lastlook << tracer->netid << tid << goal->netid << (unsigned)0 << translucency << waterlevel; spawnpoint.Serialize (arc); } else { unsigned dummy; arc >> x >> y >> z >> pitch >> angle >> roll >> (int&)sprite >> frame >> effects >> floorz >> ceilingz >> radius >> height >> momx >> momy >> momz >> (int&)type >> tics >> state >> flags >> flags2 >> health >> movedir >> visdir >> movecount >> target->netid >> lastenemy->netid >> reactiontime >> threshold >> player >> lastlook >> tracer->netid >> tid >> goal->netid >> dummy >> translucency >> waterlevel; DWORD trans; arc >> trans; spawnpoint.Serialize (arc); if(type >= NUMMOBJTYPES) I_Error("Unknown object type in saved game"); if(sprite >= NUMSPRITES) I_Error("Unknown sprite in saved game"); info = &mobjinfo[type]; touching_sectorlist = NULL; LinkToWorld (); AddToHash (); } }
bool APathFollower::Interpolate () { fixed_t dx = 0, dy = 0, dz = 0; if ((args[2] & 8) && Time > 0.f) { dx = X(); dy = Y(); dz = Z(); } if (CurrNode->Next==NULL) return false; UnlinkFromWorld (); fixed_t x, y, z; if (args[2] & 1) { // linear x = FLOAT2FIXED(Lerp (FIXED2FLOAT(CurrNode->X()), FIXED2FLOAT(CurrNode->Next->X()))); y = FLOAT2FIXED(Lerp (FIXED2FLOAT(CurrNode->Y()), FIXED2FLOAT(CurrNode->Next->Y()))); z = FLOAT2FIXED(Lerp (FIXED2FLOAT(CurrNode->Z()), FIXED2FLOAT(CurrNode->Next->Z()))); } else { // spline if (CurrNode->Next->Next==NULL) return false; x = FLOAT2FIXED(Splerp (FIXED2FLOAT(PrevNode->X()), FIXED2FLOAT(CurrNode->X()), FIXED2FLOAT(CurrNode->Next->X()), FIXED2FLOAT(CurrNode->Next->Next->X()))); y = FLOAT2FIXED(Splerp (FIXED2FLOAT(PrevNode->Y()), FIXED2FLOAT(CurrNode->Y()), FIXED2FLOAT(CurrNode->Next->Y()), FIXED2FLOAT(CurrNode->Next->Next->Y()))); z = FLOAT2FIXED(Splerp (FIXED2FLOAT(PrevNode->Z()), FIXED2FLOAT(CurrNode->Z()), FIXED2FLOAT(CurrNode->Next->Z()), FIXED2FLOAT(CurrNode->Next->Next->Z()))); } SetXYZ(x, y, z); LinkToWorld (); if (args[2] & 6) { if (args[2] & 8) { if (args[2] & 1) { // linear dx = CurrNode->Next->X() - CurrNode->X(); dy = CurrNode->Next->Y() - CurrNode->Y(); dz = CurrNode->Next->Z() - CurrNode->Z(); } else if (Time > 0.f) { // spline dx = x - dx; dy = y - dy; dz = z - dz; } else { int realarg = args[2]; args[2] &= ~(2|4|8); Time += 0.1f; dx = x; dy = y; dz = z; Interpolate (); Time -= 0.1f; args[2] = realarg; dx = x - dx; dy = y - dy; dz = z - dz; x -= dx; y -= dy; z -= dz; SetXYZ(x, y, z); } if (args[2] & 2) { // adjust yaw angle = R_PointToAngle2 (0, 0, dx, dy); } if (args[2] & 4) { // adjust pitch; use floats for precision double fdx = FIXED2DBL(dx); double fdy = FIXED2DBL(dy); double fdz = FIXED2DBL(-dz); double dist = sqrt (fdx*fdx + fdy*fdy); double ang = dist != 0.f ? atan2 (fdz, dist) : 0; pitch = (fixed_t)RAD2ANGLE(ang); } } else { if (args[2] & 2) { // interpolate angle float angle1 = (float)CurrNode->angle; float angle2 = (float)CurrNode->Next->angle; if (angle2 - angle1 <= -2147483648.f) { float lerped = Lerp (angle1, angle2 + 4294967296.f); if (lerped >= 4294967296.f) { angle = xs_CRoundToUInt(lerped - 4294967296.f); } else { angle = xs_CRoundToUInt(lerped); } } else if (angle2 - angle1 >= 2147483648.f) { float lerped = Lerp (angle1, angle2 - 4294967296.f); if (lerped < 0.f) { angle = xs_CRoundToUInt(lerped + 4294967296.f); } else { angle = xs_CRoundToUInt(lerped); } } else { angle = xs_CRoundToUInt(Lerp (angle1, angle2)); } } if (args[2] & 1) { // linear if (args[2] & 4) { // interpolate pitch pitch = FLOAT2FIXED(Lerp (FIXED2FLOAT(CurrNode->pitch), FIXED2FLOAT(CurrNode->Next->pitch))); } } else { // spline if (args[2] & 4) { // interpolate pitch pitch = FLOAT2FIXED(Splerp (FIXED2FLOAT(PrevNode->pitch), FIXED2FLOAT(CurrNode->pitch), FIXED2FLOAT(CurrNode->Next->pitch), FIXED2FLOAT(CurrNode->Next->Next->pitch))); } } } } return true; }
void AActor::Serialize (FArchive &arc) { Super::Serialize (arc); if (arc.IsStoring ()) { arc << x << y << z << pitch << angle << roll << sprite << frame << effects << floorz << ceilingz << radius << height << momx << momy << momz << type << tics << state << flags << health << movedir << visdir << movecount << target->netid << lastenemy->netid << reactiontime << threshold << player << lastlook << tracer->netid << tid << goal->netid << (unsigned)0 << translucency << waterlevel; if (translation) arc << (DWORD)(translation - translationtables); else arc << (DWORD)0xffffffff; spawnpoint.Serialize (arc); } else { unsigned dummy; arc >> x >> y >> z >> pitch >> angle >> roll >> sprite >> frame >> effects >> floorz >> ceilingz >> radius >> height >> momx >> momy >> momz >> type >> tics >> state >> flags >> health >> movedir >> visdir >> movecount >> target->netid >> lastenemy->netid >> reactiontime >> threshold >> player >> lastlook >> tracer->netid >> tid >> goal->netid >> dummy >> translucency >> waterlevel; DWORD trans; arc >> trans; if (trans == (DWORD)0xffffffff) translation = NULL; else translation = translationtables + trans; spawnpoint.Serialize (arc); info = &mobjinfo[type]; touching_sectorlist = NULL; LinkToWorld (); AddToHash (); } }
void AActor::Serialize (FArchive &arc) { Super::Serialize (arc); if (arc.IsStoring ()) { int playerid = player ? player->id : 0; arc << x << y << z << pitch << angle << roll << (int)sprite << frame << effects << floorz << ceilingz << radius << height << momx << momy << momz << (int)type << tics << state << flags << flags2 << special1 << special2 << health << movedir << visdir << movecount /*<< target ? target->netid : 0*/ /*<< lastenemy ? lastenemy->netid : 0*/ << reactiontime << threshold << playerid << lastlook /*<< tracer ? tracer->netid : 0*/ << tid << special << args[0] << args[1] << args[2] << args[3] << args[4] /*<< goal ? goal->netid : 0*/ << (unsigned)0 << translucency << waterlevel; if (translation) arc << (DWORD)(translation - translationtables); else arc << (DWORD)0xffffffff; spawnpoint.Serialize (arc); } else { unsigned dummy; unsigned playerid; arc >> x >> y >> z >> pitch >> angle >> roll >> (int&)sprite >> frame >> effects >> floorz >> ceilingz >> radius >> height >> momx >> momy >> momz >> (int&)type >> tics >> state >> flags >> flags2 >> special1 >> special2 >> health >> movedir >> visdir >> movecount /*>> target->netid*/ /*>> lastenemy->netid*/ >> reactiontime >> threshold >> playerid >> lastlook /*>> tracer->netid*/ >> tid >> special >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] /*>> goal->netid*/ >> dummy >> translucency >> waterlevel; DWORD trans; arc >> trans; if (trans == (DWORD)0xffffffff) translation = NULL; else translation = translationtables + trans; spawnpoint.Serialize (arc); if(type >= NUMMOBJTYPES) I_Error("Unknown object type in saved game"); if(sprite >= NUMSPRITES) I_Error("Unknown sprite in saved game"); info = &mobjinfo[type]; touching_sectorlist = NULL; LinkToWorld (); AddToHash (); if(playerid && validplayer(idplayer(playerid))) { player = &idplayer(playerid); player->mo = ptr(); player->camera = player->mo; } } }
AActor::AActor (fixed_t ix, fixed_t iy, fixed_t iz, mobjtype_t itype) : x(0), y(0), z(0), snext(NULL), sprev(NULL), angle(0), sprite(SPR_UNKN), frame(0), pitch(0), roll(0), effects(0), bnext(NULL), bprev(NULL), subsector(NULL), floorz(0), ceilingz(0), radius(0), height(0), momx(0), momy(0), momz(0), validcount(0), type(MT_UNKNOWNTHING), info(NULL), tics(0), state(NULL), flags(0), flags2(0), special1(0), special2(0), health(0), movedir(0), movecount(0), visdir(0), reactiontime(0), threshold(0), player(NULL), lastlook(0), inext(NULL), iprev(NULL), translation(NULL), translucency(0), waterlevel(0), onground(0), touching_sectorlist(NULL), deadtic(0), oldframe(0), rndindex(0), netid(0), tid(0) { state_t *st; // Fly!!! fix it in P_RespawnSpecial if ((unsigned int)itype >= NUMMOBJTYPES) { I_Error ("Tried to spawn actor type %d\n", itype); } self.init(this); info = &mobjinfo[itype]; type = itype; x = ix; y = iy; radius = info->radius; height = P_ThingInfoHeight(info); flags = info->flags; flags2 = info->flags2; health = info->spawnhealth; translucency = info->translucency; rndindex = M_Random(); if (multiplayer && serverside) netid = ServerNetID.ObtainNetID(); if (sv_skill != sk_nightmare) reactiontime = info->reactiontime; if (clientside) lastlook = P_Random() % MAXPLAYERS_VANILLA; else lastlook = P_Random() % MAXPLAYERS; // do not set the state with P_SetMobjState, // because action routines can not be called yet st = &states[info->spawnstate]; state = st; tics = st->tics; sprite = st->sprite; frame = st->frame; touching_sectorlist = NULL; // NULL head of sector list // phares 3/13/98 // set subsector and/or block links LinkToWorld (); if(!subsector) return; floorz = subsector->sector->floorheight; ceilingz = subsector->sector->ceilingheight; if (iz == ONFLOORZ) { z = floorz; } else if (iz == ONCEILINGZ) { z = ceilingz - height; } else if (flags2 & MF2_FLOATBOB) { z = floorz + iz; // artifact z passed in as height } else { z = iz; } }
bool APathFollower::Interpolate () { DVector3 dpos(0, 0, 0); FLinkContext ctx; if ((args[2] & 8) && Time > 0.f) { dpos = Pos(); } if (CurrNode->Next==NULL) return false; UnlinkFromWorld (&ctx); DVector3 newpos; if (args[2] & 1) { // linear newpos.X = Lerp(CurrNode->X(), CurrNode->Next->X()); newpos.Y = Lerp(CurrNode->Y(), CurrNode->Next->Y()); newpos.Z = Lerp(CurrNode->Z(), CurrNode->Next->Z()); } else { // spline if (CurrNode->Next->Next==NULL) return false; newpos.X = Splerp(PrevNode->X(), CurrNode->X(), CurrNode->Next->X(), CurrNode->Next->Next->X()); newpos.Y = Splerp(PrevNode->Y(), CurrNode->Y(), CurrNode->Next->Y(), CurrNode->Next->Next->Y()); newpos.Z = Splerp(PrevNode->Z(), CurrNode->Z(), CurrNode->Next->Z(), CurrNode->Next->Next->Z()); } SetXYZ(newpos); LinkToWorld (&ctx); if (args[2] & 6) { if (args[2] & 8) { if (args[2] & 1) { // linear dpos.X = CurrNode->Next->X() - CurrNode->X(); dpos.Y = CurrNode->Next->Y() - CurrNode->Y(); dpos.Z = CurrNode->Next->Z() - CurrNode->Z(); } else if (Time > 0.f) { // spline dpos = newpos - dpos; } else { int realarg = args[2]; args[2] &= ~(2|4|8); Time += 0.1f; dpos = newpos; Interpolate (); Time -= 0.1f; args[2] = realarg; dpos = newpos - dpos; newpos -= dpos; SetXYZ(newpos); } if (args[2] & 2) { // adjust yaw Angles.Yaw = dpos.Angle(); } if (args[2] & 4) { // adjust pitch; use floats for precision double dist = dpos.XY().Length(); Angles.Pitch = dist != 0.f ? VecToAngle(dist, -dpos.Z) : 0.; } } else { if (args[2] & 2) { // interpolate angle DAngle angle1 = CurrNode->Angles.Yaw.Normalized180(); DAngle angle2 = angle1 + deltaangle(angle1, CurrNode->Next->Angles.Yaw); Angles.Yaw = Lerp(angle1.Degrees, angle2.Degrees); } if (args[2] & 1) { // linear if (args[2] & 4) { // interpolate pitch Angles.Pitch = Lerp(CurrNode->Angles.Pitch.Degrees, CurrNode->Next->Angles.Pitch.Degrees); } } else { // spline if (args[2] & 4) { // interpolate pitch Angles.Pitch = Splerp(PrevNode->Angles.Pitch.Degrees, CurrNode->Angles.Pitch.Degrees, CurrNode->Next->Angles.Pitch.Degrees, CurrNode->Next->Next->Angles.Pitch.Degrees); } } } } return true; }