forked from Mirrors/openclonk
Make (Get|Set)((X|Y)Dir|R(Dir)?)|CreateObject|Hit work with floats
parent
fcebef6fa1
commit
f73ceb584c
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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(-)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(); }
|
||||
|
|
Loading…
Reference in New Issue