// Blooglets void CK6_SpawnBlooglet(int tileX, int tileY, int type) { CK_object *obj = CK_GetNewObj(false); obj->type = CT6_Blooglet; obj->active = OBJ_ACTIVE; obj->zLayer = PRIORITIES - 4; obj->posX = RF_TileToUnit(tileX); obj->posY = RF_TileToUnit(tileY) - 0x80; obj->xDirection = US_RndT() < 0x80 ? IN_motion_Right : IN_motion_Left; obj->yDirection = IN_motion_Down; obj->user1 = type; switch (type%4) { case 0: CK_SetAction(obj, CK_GetActionByName("CK6_ACT_BloogletRRun0")); break; case 1: CK_SetAction(obj, CK_GetActionByName("CK6_ACT_BloogletYRun0")); break; case 2: CK_SetAction(obj, CK_GetActionByName("CK6_ACT_BloogletBRun0")); break; case 3: CK_SetAction(obj, CK_GetActionByName("CK6_ACT_BloogletGRun0")); break; } }
void CK6_SpawnMapCliff(int tileX, int tileY, int dir) { CK_object *obj = CK_GetNewObj(false); obj->active = OBJ_ACTIVE; obj->clipped = CLIP_not; obj->zLayer = PRIORITIES - 2; obj->type = CT6_MapCliff; obj->clipRects.tileX1 = obj->clipRects.tileX2 = tileX; obj->clipRects.tileY1 = obj->clipRects.tileY2 = tileY; obj->user1 = dir; obj->posX = obj->clipRects.unitX1 = RF_TileToUnit(tileX); obj->clipRects.unitX2 = obj->clipRects.unitX1 + 0x100; if (dir) obj->posY = obj->clipRects.unitY1 = RF_TileToUnit(tileY+1) - 1; else obj->posY = obj->clipRects.unitY1 = RF_TileToUnit(tileY); obj->clipRects.unitY2 = obj->clipRects.unitY1 + 1; CK_SetAction(obj, CK_GetActionByName("CK6_ACT_MapCliff0")); if (ck_gameState.ep.ck6.rope == 2 && dir) { CK_object *obj = CK_GetNewObj(false); obj->active = OBJ_ACTIVE; obj->clipped = CLIP_not; obj->zLayer = PRIORITIES - 4; obj->type = CT_Friendly; obj->posX = RF_TileToUnit(tileX); obj->posY = RF_TileToUnit(tileY + 1); CK_SetAction(obj, CK_GetActionByName("CK6_ACT_RopeOnMap0")); } }
void CK6_SpawnPasscard(int tileX, int tileY) { CK_object *obj = CK_GetNewObj(false); obj->clipped = CLIP_not; obj->zLayer = PRIORITIES - 2; obj->type = CT6_Passcard; obj->posX = RF_TileToUnit(tileX); obj->posY = RF_TileToUnit(tileY); CK_SetAction(obj, CK_GetActionByName("CK6_ACT_Passcard0")); }
void CK6_SpawnBipship(int tileX, int tileY) { CK_object *obj = CK_GetNewObj(false); obj->type = CT6_Bipship; obj->active = OBJ_ACTIVE; obj->posX = RF_TileToUnit(tileX); obj->posY = RF_TileToUnit(tileY) - 0x180; obj->xDirection = US_RndT() < 0x80 ? IN_motion_Right : IN_motion_Left; obj->velX = obj->xDirection * 20; CK_SetAction(obj, CK_GetActionByName("CK6_ACT_BipshipFly0")); }
void CK6_SpawnBloog(int tileX, int tileY) { CK_object *obj = CK_GetNewObj(false); obj->type = CT6_Bloog; obj->active = OBJ_ACTIVE; obj->zLayer = PRIORITIES - 4; obj->posX = RF_TileToUnit(tileX); obj->posY = RF_TileToUnit(tileY) - 0x200; obj->xDirection = US_RndT() < 0x80 ? IN_motion_Right : IN_motion_Left; obj->yDirection = IN_motion_Down; CK_SetAction(obj, CK_GetActionByName("CK6_ACT_BloogWalk0")); }
// Orbatrices void CK6_SpawnOrbatrix(int tileX, int tileY) { CK_object *obj = CK_GetNewObj(false); obj->type = CT6_Orbatrix; obj->active = OBJ_ACTIVE; obj->zLayer = PRIORITIES - 4; obj->posX = RF_TileToUnit(tileX); obj->posY = RF_TileToUnit((tileY)) - 0x180; obj->xDirection = US_RndT() < 0x80 ? IN_motion_Right : IN_motion_Left; obj->yDirection = IN_motion_Down; obj->user4 = 1; CK_SetAction(obj, CK_GetActionByName("CK6_ACT_OrbatrixFloat0")); }
// Rocket ship void CK6_SpawnRocket(int tileX, int tileY, int dir) { if (ck_gameState.ep.ck6.inRocket == dir) { CK_object *obj = CK_GetNewObj(false); obj->active = OBJ_ACTIVE; obj->clipped = CLIP_not; obj->zLayer = PRIORITIES - 1; obj->type = CT6_Rocket; obj->posX = RF_TileToUnit(tileX); obj->posY = RF_TileToUnit(tileY); CK_SetAction(obj, CK_GetActionByName("CK6_ACT_RocketSit0")); } }
void CK6_SpawnSatellite(int tileX, int tileY) { CK_object *obj = CK_GetNewObj(false); obj->clipped = CLIP_not; obj->zLayer = PRIORITIES - 2; obj->active = OBJ_ALWAYS_ACTIVE; obj->type = CT6_Satellite; obj->posX = RF_TileToUnit(tileX); obj->posY = RF_TileToUnit(tileY); CK_SetAction(obj, CK_GetActionByName("CK6_ACT_Satellite0")); CA_SetTileAtPos(tileX, tileY, 2, 0x5B + 3); obj->user1 = 3; obj->user2 = 0x100; obj->user4 = 2; }
void CK6_SpawnSatelliteLoading(int tileX, int tileY, int dir) { CK_object *obj = CK_GetNewObj(false); obj->active = OBJ_ALWAYS_ACTIVE; obj->clipped = CLIP_not; obj->zLayer = PRIORITIES - 2; obj->type = CT6_SatelliteLoading; obj->clipRects.tileX1 = obj->clipRects.tileX2 = tileX; obj->clipRects.tileY1 = obj->clipRects.tileY2 = tileY; obj->user1 = (dir ^ 1) + 1; obj->posX = obj->clipRects.unitX1 = RF_TileToUnit(tileX); obj->clipRects.unitX2 = obj->clipRects.unitX1 + 0x100; obj->posY = obj->clipRects.unitY1 = RF_TileToUnit(tileY); obj->clipRects.unitY2 = obj->clipRects.unitY1 + 0x100; CK_SetAction2(obj, CK_GetActionByName("CK6_ACT_SatelliteInvisible0")); }
void CK6_SpawnRedStandPlatform(int tileX, int tileY) { CK_object *obj = CK_GetNewObj(false); obj->type = 6; obj->active = OBJ_ACTIVE; obj->zLayer = 0; obj->posX = RF_TileToUnit(tileX); obj->posY = obj->user1 = RF_TileToUnit(tileY); obj->xDirection = 0; obj->yDirection = 1; obj->clipped = CLIP_not; CK_SetAction(obj, CK_GetActionByName("CK6_ACT_redStandPlatform")); obj->gfxChunk = obj->currentAction->chunkLeft; CA_CacheGrChunk(obj->gfxChunk); CK_ResetClipRects(obj); }
void CK6_SpawnAxisPlatform(int tileX, int tileY, int direction, bool purple) { CK_object *obj = CK_GetNewObj(false); obj->type = 6; obj->active = OBJ_ALWAYS_ACTIVE; obj->zLayer = 0; obj->posX = RF_TileToUnit(tileX); obj->posY = RF_TileToUnit(tileY); switch (direction) { case 0: obj->xDirection = 0; obj->yDirection = -1; break; case 1: obj->xDirection = 1; obj->yDirection = 0; break; case 2: obj->xDirection = 0; obj->yDirection = 1; break; case 3: obj->xDirection = -1; obj->yDirection = 0; break; } if (purple) { obj->posX += 0x40; obj->posY += 0x40; CK_SetAction(obj, CK_GetActionByName("CK6_ACT_purpleAxisPlatform")); } else { CK_SetAction(obj, CK_GetActionByName("CK_ACT_AxisPlatform")); } // TODO: These should *not* be done here. obj->gfxChunk = obj->currentAction->chunkLeft; CA_CacheGrChunk(obj->gfxChunk); CK_ResetClipRects(obj); }
void CK6_SpawnGrabbiter(int tileX, int tileY) { CK_object *obj = CK_GetNewObj(false); obj->active = OBJ_ACTIVE; obj->clipped = CLIP_not; obj->zLayer = PRIORITIES - 2; obj->type = CT6_Grabbiter; obj->posX = RF_TileToUnit(tileX); obj->posY = RF_TileToUnit(tileY); if (ck_gameState.ep.ck6.sandwich == 2) { CK_SetAction(obj, CK_GetActionByName("CK6_ACT_GrabbiterNapping0")); } else { CK_SetAction(obj, CK_GetActionByName("CK6_ACT_GrabbiterHungry0")); } }
void CK6_MapKeenThrowRope(CK_object *obj) { CK_object *rope = CK_GetNewObj(false); rope->active = OBJ_ACTIVE; rope->clipped = CLIP_not; rope->zLayer = PRIORITIES - 4; rope->type = CT_Friendly; rope->posX = RF_TileToUnit(obj->clipRects.tileX2); rope->posY = obj->posY - 0x200; CK_SetAction(rope, CK_GetActionByName("CK6_ACT_RopeOnMap0")); obj->type = CT_Player; obj->gfxChunk = 192; }
void CK6_RocketFly(CK_object *obj) { if (!ck_nextX && !ck_nextY) { if (!SD_SoundPlaying()) SD_PlaySound(SOUND_ROCKETFLY); int delta = SD_GetSpriteSync() * 32; // Will we reach a new tile? if (obj->user2 > delta) { // No... keep moving in the same direction. obj->user2 -= delta; int dirX = ck_infoplaneArrowsX[obj->user1]; if (dirX == 1) { // Moving right. ck_nextX += delta; } else if (dirX == -1) { // Moving left ck_nextX -= delta; } int dirY = ck_infoplaneArrowsY[obj->user1]; if (dirY == 1) { // Moving down ck_nextY += delta; } else if (dirY == -1) { // Moving up ck_nextY -= delta; } } else { // Move to next tile. int dirX = ck_infoplaneArrowsX[obj->user1]; if (dirX == 1) { // Moving right. ck_nextX += obj->user2; } else if (dirX == -1) { // Moving left ck_nextX -= obj->user2; } int dirY = ck_infoplaneArrowsY[obj->user1]; if (dirY == 1) { // Moving down ck_nextY += obj->user2; } else if (dirY == -1) { // Moving up ck_nextY -= obj->user2; } int tileX = (uint16_t)RF_UnitToTile(obj->posX + ck_nextX); int tileY = (uint16_t)RF_UnitToTile(obj->posY + ck_nextY); obj->user1 = CA_TileAtPos(tileX, tileY, 2) - 0x5B; if ((obj->user1 < 0) || (obj->user1 > 8)) { obj->posX += ck_nextX; obj->posY += ck_nextY; CK_SetAction2(obj, CK_GetActionByName("CK6_ACT_RocketSit0")); ck_keenObj->posX = RF_TileToUnit(tileX + 1) + 0x10; ck_keenObj->posY = RF_TileToUnit(tileY + 1); ck_keenObj->type = CT_Player; ck_keenObj->gfxChunk = 0xBD; ck_keenObj->clipped = CLIP_normal; CK_SetAction(ck_keenObj, CK_GetActionByName("CK_ACT_MapKeenStart")); ck_gameState.ep.ck6.inRocket ^= 1; return; } delta -= obj->user2; obj->user2 = 256 - delta; // Move in the new direction. dirX = ck_infoplaneArrowsX[obj->user1]; if (dirX == 1) { // Moving right. ck_nextX += delta; } else if (dirX == -1) { // Moving left ck_nextX -= delta; } dirY = ck_infoplaneArrowsY[obj->user1]; if (dirY == 1) { // Moving down ck_nextY += delta; } else if (dirY == -1) { // Moving up ck_nextY -= delta; } } } }