summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/chestnut.cpp46
1 files changed, 35 insertions, 11 deletions
diff --git a/src/chestnut.cpp b/src/chestnut.cpp
index 10ff076..7ebfc4d 100644
--- a/src/chestnut.cpp
+++ b/src/chestnut.cpp
@@ -20,9 +20,12 @@ class daEnChestnut_c : public dEn_c {
int starCoinNumber;
bool ignorePlayers;
bool breaksBlocks;
+ float shakeWindow, fallWindow;
int timeSpentExploding;
+ lineSensor_s belowSensor;
+
float nearestPlayerDistance();
int onCreate();
@@ -66,6 +69,14 @@ int daEnChestnut_c::onCreate() {
breaksBlocks = ((settings & 0x2000) != 0);
objNumber = (settings & 0xF0000) >> 16;
+ if ((settings & 0x4000) != 0) {
+ shakeWindow = 96.0f;
+ fallWindow = 64.0f;
+ } else {
+ shakeWindow = 64.0f;
+ fallWindow = 32.0f;
+ }
+
// Set up models
allocator.link(-1, GameHeaps[0], 0, 0x20);
@@ -92,7 +103,7 @@ int daEnChestnut_c::onCreate() {
ActivePhysics::Info ccInfo;
ccInfo.xDistToCenter = 0.0f;
ccInfo.xDistToEdge = 12.0f * scale.x;
- ccInfo.yDistToCenter = 12.0f * scale.y;
+ ccInfo.yDistToCenter = 1.0f + (12.0f * scale.y);
ccInfo.yDistToEdge = 12.0f * scale.y;
ccInfo.category1 = 3;
@@ -171,9 +182,9 @@ void daEnChestnut_c::executeState_Idle() {
float dist = nearestPlayerDistance();
- if (dist < 32.0f)
+ if (dist < fallWindow)
doStateChange(&StateID_Fall);
- else if (dist < 64.0f)
+ else if (dist < shakeWindow)
doStateChange(&StateID_Shake);
}
@@ -191,9 +202,9 @@ void daEnChestnut_c::endState_Shake() { }
void daEnChestnut_c::executeState_Shake() {
float dist = nearestPlayerDistance();
- if (dist >= 64.0f)
+ if (dist >= shakeWindow)
doStateChange(&StateID_Idle);
- else if (dist < 32.0f)
+ else if (dist < fallWindow)
doStateChange(&StateID_Fall);
}
@@ -204,12 +215,16 @@ void daEnChestnut_c::beginState_Fall() {
int size = 12*scale.x;
- u32 sFlags = 0;
+ belowSensor.flags = SENSOR_LINE;
if (breaksBlocks)
- sFlags = SENSOR_BREAK_BLOCK | SENSOR_BREAK_BRICK;
+ belowSensor.flags |= SENSOR_10000000 | SENSOR_BREAK_BLOCK | SENSOR_BREAK_BRICK;
+ // 10000000 makes it pass through bricks
+
+ belowSensor.lineA = -size << 12;
+ belowSensor.lineB = size << 12;
+ belowSensor.distanceFromCenter = 0;
- static const lineSensor_s below(sFlags, -size << 12, size << 12, 0 << 12);
- collMgr.init(this, &below, 0, 0);
+ collMgr.init(this, &belowSensor, 0, 0);
speed.y = 0.0f;
y_speed_inc = -0.1875f;
@@ -226,7 +241,7 @@ void daEnChestnut_c::executeState_Fall() {
doSpriteMovement();
UpdateObjectPosBasedOnSpeedValuesReal();
- if (collMgr.calculateBelowCollision()) {
+ if (collMgr.calculateBelowCollision() & (~0x400000)) {
doStateChange(&StateID_Explode);
}
}
@@ -317,9 +332,18 @@ void daEnChestnut_c::spawnObject() {
acPos.y += 32.0f;
}
+ aPhysics.removeFromList();
+
OSReport("Crap %d, %d, %08x\n", objNumber, things[objNumber*2], acSettings);
- dStageActor_c::create((Actors)things[objNumber*2], acSettings, &acPos, 0, currentLayerID);
+ dStageActor_c *ac =
+ dStageActor_c::create((Actors)things[objNumber*2], acSettings, &acPos, 0, currentLayerID);
S16Vec efRot = {0,0,0};
SpawnEffect("Wm_ob_itemsndlandsmk", 0, &pos, &efRot, &scale);
+
+ if (objNumber == 0) {
+ dEn_c *en = (dEn_c*)ac;
+ en->direction = 1;
+ en->rot.y = -8192;
+ }
}