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_BloogletCol(CK_object *a, CK_object *b) { if (b->type == CT_Player && b->currentAction->collide) { ck_keenIgnoreVertClip = true; CK_PhysPushX(b, a); ck_keenIgnoreVertClip = false; } else if (b->type == CT_Stunner) { int color = a->user1 & 3; if (a->user1 > 3) { CK_object *gem = CK_GetNewObj(false); gem->clipped = CLIP_normal; gem->zLayer = PRIORITIES - 2; gem->type = CT6_Item; gem->posX = a->posX; gem->posY = a->posY; gem->yDirection = IN_motion_Up; gem->velY = -40; gem->user1 = color; gem->user2 = gem->gfxChunk = *CK_ItemSpriteChunks[color]; gem->user3 = gem->user2 + 2; CK_SetAction(gem, CK_GetActionByName("CK_ACT_fallingitem")); SD_PlaySound(SOUND_BLOOGLETGEM); } CK_StunCreature(a, b, CK_GetActionByName(stunnedBloogletActions[color])); } }
// 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_BipshipFly(CK_object *obj) { CK_PhysAccelHorz(obj, obj->xDirection, 20); int xdir = obj->xDirection; int ycheck = ck_keenObj->clipRects.unitY2 + 0x100 - obj->clipRects.unitY2; if (ycheck <= 0x200 && ycheck >= 0) { // Fire!! xdir = (ck_keenObj->posX < obj->posX) ? IN_motion_Left : IN_motion_Right; if (obj->xDirection == xdir && US_RndT() < SD_GetSpriteSync() * 2) { SD_PlaySound(SOUND_KEENSHOOT); CK_object *shot = CK_GetNewObj(true); shot->type = CT6_EnemyShot; shot->active = OBJ_EXISTS_ONLY_ONSCREEN; shot->zLayer = PRIORITIES - 3; if (obj->xDirection == IN_motion_Right) { shot->posX = obj->posX + 0x100; shot->velX = 64; } else { shot->posX = obj->posX; shot->velX = -64; } shot->posY = obj->posY + 0xA0; shot->velY = 16; CK_SetAction(shot, CK_GetActionByName("CK6_ACT_BipShot0")); } } int startx = obj->clipRects.tileXmid + 2 * xdir; int y = obj->clipRects.tileY1; uint16_t *tile = CA_TilePtrAtPos(startx, y, 1); for (y; y <= obj->clipRects.tileY2; y++, tile += CA_GetMapWidth()) { if (TI_ForeLeft(*tile) || TI_ForeRight(*tile)) { xdir = -xdir; goto checkTurn; } } // And turn around at ledge-ends if (!TI_ForeTop(*tile)) xdir = -xdir; checkTurn: if (obj->xDirection != xdir) { obj->xDirection = xdir; CK_SetAction2(obj, CK_GetActionByName("CK6_ACT_BipshipTurn0")); } }
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")); }
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; }
// 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_BipshipCrash(CK_object *obj) { SD_PlaySound(SOUND_BIPSHIPCRASH); // Spawn smoke CK_object *smoke = CK_GetNewObj(true); smoke->type = CT_Friendly; smoke->active = OBJ_ACTIVE; smoke->zLayer = PRIORITIES - 2; smoke->posX = obj->posX; smoke->posY = obj->posY - 0x180; CK_SetAction(smoke, CK_GetActionByName("CK6_ACT_BipshipSmoke0")); smoke->xDirection = US_RndT() < 0x80 ? IN_motion_Right : IN_motion_Left; CK_object *bip = CK_GetNewObj(true); bip->type = CT6_Bip; bip->active = OBJ_ACTIVE; bip->zLayer = PRIORITIES - 4; bip->posX = obj->posX; bip->posY = obj->posY - 0x80; bip->xDirection = US_RndT() < 0x80 ? IN_motion_Right : IN_motion_Left; CK_SetAction(bip, CK_GetActionByName("CK6_ACT_BipStand0")); }
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_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_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_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")); } }
CK_object *CK6_SpawnEnemyShot(int posX, int posY, CK_action *action) { CK_object *new_object = CK_GetNewObj(true); if (!new_object) return NULL; new_object->posX = posX; new_object->posY = posY; new_object->type = CT6_EnemyShot; new_object->active = OBJ_EXISTS_ONLY_ONSCREEN; CK_SetAction(new_object, action); if (CK_NotStuckInWall(new_object)) { return new_object; } else { CK_RemoveObj(new_object); return NULL; } }