Make (Get|Set)((X|Y)Dir|R(Dir)?)|CreateObject|Hit work with floats

floating-point
Julius Michaelis 2012-04-20 22:59:17 +02:00
parent fcebef6fa1
commit f73ceb584c
7 changed files with 30 additions and 24 deletions

View File

@ -124,7 +124,7 @@ static Nillable<long> FnGetY(C4AulContext *cthr, long iPrec)
}
static C4Object *FnCreateObject(C4AulContext *cthr,
C4PropList * PropList, long iXOffset, long iYOffset, Nillable<long> owner)
C4PropList * PropList, C4Real iXOffset, C4Real iYOffset, Nillable<long> owner)
{
if (cthr->Obj) // Local object calls override
{

View File

@ -107,12 +107,17 @@ public:
#define C4REAL_ARITHMETIC_OPERATOR(op) \
/* arithmetic operations on copies */ \
inline C4Real operator op (const C4Real &rhs) const { C4Real nrv(*this); nrv op##= rhs; return nrv; } \
inline C4Real operator op (float rhs) const { C4Real nrv(*this); nrv op##= rhs; return nrv; } \
inline C4Real operator op (int rhs) const { C4Real nrv(*this); nrv op##= rhs; return nrv; } \
inline C4Real operator op (float rhs) const { C4Real nrv(*this); nrv op##= C4Real(rhs); return nrv; } \
inline C4Real operator op (int rhs) const { C4Real nrv(*this); nrv op##= C4Real(rhs); return nrv; } \
inline C4Real operator op (long rhs) const { C4Real nrv(*this); nrv op##= C4Real(rhs); return nrv; } \
/* arithmetic operations on copies, right-hand C4Real */ \
/* friends defined in the class are implicitly inline */ \
friend C4Real operator op (float lhs, const C4Real &rhs) { C4Real nrv(lhs); nrv op##= rhs; return nrv; } \
friend C4Real operator op (int lhs, const C4Real &rhs) { C4Real nrv(lhs); nrv op##= rhs; return nrv; }
friend C4Real operator op (int lhs, const C4Real &rhs) { C4Real nrv(lhs); nrv op##= rhs; return nrv; } \
friend C4Real operator op (long lhs, const C4Real &rhs) { C4Real nrv(lhs); nrv op##= rhs; return nrv; } \
inline C4Real & operator op##= (long rhs) { this->operator op##=(C4Real(rhs)); return *this; } \
inline C4Real & operator op##= (int rhs) { this->operator op##=(C4Real(rhs)); return *this; } \
inline C4Real & operator op##= (float rhs) { this->operator op##=(C4Real(rhs)); return *this; }
C4REAL_ARITHMETIC_OPERATOR(+)
C4REAL_ARITHMETIC_OPERATOR(-)

View File

@ -450,7 +450,7 @@ void C4Object::DoMovement()
// Movement Script Execution
if (fAnyContact)
{
C4AulParSet pars(C4VInt(fixtoi(oldxdir, 100)), C4VInt(fixtoi(oldydir, 100)));
C4AulParSet pars(C4VFloat(oldxdir*100), C4VFloat(oldydir*100));
if (old_ocf & OCF_HitSpeed1) Call(PSF_Hit, &pars);
if (old_ocf & OCF_HitSpeed2) Call(PSF_Hit2, &pars);
if (old_ocf & OCF_HitSpeed3) Call(PSF_Hit3, &pars);

View File

@ -4243,14 +4243,14 @@ bool C4Object::IsInLiquidCheck()
return GBackLiquid(GetX(),GetY()+Def->Float*Con/FullCon-1);
}
void C4Object::SetRotation(int32_t nr)
void C4Object::SetRotation(C4Real nr)
{
while (nr<0) nr+=360; nr%=360;
// remove solid mask
if (pSolidMaskData) pSolidMaskData->Remove(false);
// set rotation
r=nr;
fix_r=itofix(nr);
r=fixtoi(nr);
fix_r=nr;
// Update face
UpdateFace(true);
}

View File

@ -334,7 +334,7 @@ public:
void PlrFoWActualize();
void SetAudibilityAt(C4TargetFacet &cgo, int32_t iX, int32_t iY);
bool IsVisible(int32_t iForPlr, bool fAsOverlay); // return whether an object is visible for the given player
void SetRotation(int32_t nr);
void SetRotation(C4Real nr);
void PrepareDrawing(); // set blit modulation and/or additive blitting
void FinishedDrawing(); // reset any modulation
void DrawSolidMask(C4TargetFacet &cgo); // draw topface image only

View File

@ -330,12 +330,12 @@ static C4Void FnSetEntrance(C4AulObjectContext *cthr, bool e_status)
}
static C4Void FnSetXDir(C4AulObjectContext *cthr, long nxdir, long iPrec)
static C4Void FnSetXDir(C4AulObjectContext *cthr, C4Numeric nxdir, long iPrec)
{
// precision (default 10.0)
if (!iPrec) iPrec=10;
// update xdir
cthr->Obj->xdir=itofix(nxdir, iPrec);
cthr->Obj->xdir=nxdir / iPrec;
// special: negative dirs must be rounded
//if (nxdir<0) pObj->xdir += C4REAL100(-50)/iPrec;
cthr->Obj->Mobile=1;
@ -343,12 +343,12 @@ static C4Void FnSetXDir(C4AulObjectContext *cthr, long nxdir, long iPrec)
return C4Void();
}
static C4Void FnSetRDir(C4AulObjectContext *cthr, long nrdir, long iPrec)
static C4Void FnSetRDir(C4AulObjectContext *cthr, C4Numeric nrdir, long iPrec)
{
// precision (default 10.0)
if (!iPrec) iPrec=10;
// update rdir
cthr->Obj->rdir=itofix(nrdir, iPrec);
cthr->Obj->rdir=nrdir / iPrec;
// special: negative dirs must be rounded
//if (nrdir<0) pObj->rdir += C4REAL100(-50)/iPrec;
cthr->Obj->Mobile=1;
@ -356,19 +356,19 @@ static C4Void FnSetRDir(C4AulObjectContext *cthr, long nrdir, long iPrec)
return C4Void();
}
static C4Void FnSetYDir(C4AulObjectContext *cthr, long nydir, long iPrec)
static C4Void FnSetYDir(C4AulObjectContext *cthr, C4Numeric nydir, long iPrec)
{
// precision (default 10.0)
if (!iPrec) iPrec=10;
// update ydir
cthr->Obj->ydir=itofix(nydir, iPrec);
cthr->Obj->ydir=nydir / iPrec;
// special: negative dirs must be rounded
//if (nydir<0) pObj->ydir += C4REAL100(-50)/iPrec;
cthr->Obj->Mobile=1;
return C4Void();
}
static C4Void FnSetR(C4AulObjectContext *cthr, long nr)
static C4Void FnSetR(C4AulObjectContext *cthr, C4Real nr)
{
// set rotation
cthr->Obj->SetRotation(nr);
@ -620,28 +620,28 @@ static long FnGetMass(C4AulContext *cthr)
return cthr->Obj->Mass;
}
static long FnGetRDir(C4AulObjectContext *cthr, long iPrec)
static C4Real FnGetRDir(C4AulObjectContext *cthr, long iPrec)
{
if (!iPrec) iPrec = 10;
return fixtoi(cthr->Obj->rdir, iPrec);
return cthr->Obj->rdir * iPrec;
}
static long FnGetXDir(C4AulObjectContext *cthr, long iPrec)
static C4Real FnGetXDir(C4AulObjectContext *cthr, long iPrec)
{
if (!iPrec) iPrec = 10;
return fixtoi(cthr->Obj->xdir, iPrec);
return cthr->Obj->xdir * iPrec;
}
static long FnGetYDir(C4AulObjectContext *cthr, long iPrec)
static C4Real FnGetYDir(C4AulObjectContext *cthr, long iPrec)
{
if (!iPrec) iPrec = 10;
return fixtoi(cthr->Obj->ydir, iPrec);
return cthr->Obj->ydir * iPrec;
}
static long FnGetR(C4AulObjectContext *cthr)
static C4Real FnGetR(C4AulObjectContext *cthr)
{
// Adjust range
long iR = cthr->Obj->r;
C4Real iR = cthr->Obj->fix_r;
while (iR>180) iR-=360;
while (iR<-180) iR+=360;
return iR;

View File

@ -37,6 +37,7 @@ class C4Numeric {
C4Numeric(C4Real data) : val(data) {}
const C4Value& getVal() const { return val; }
C4Numeric& operator = (const C4Numeric& nValue) { val.Set(nValue.val); return *this; }
operator C4Real() const { return val.getFloat(); }
#define C4NUMERIC_GETTER(name, type) \
type name() const { return val.name (); } \
type _##name() const { return val._##name(); }