Beispiel #1
0
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"));
  }
}
Beispiel #2
0
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]));
  }
}
Beispiel #3
0
// 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;
  }
}
Beispiel #4
0
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"));
	}
}
Beispiel #5
0
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"));
}
Beispiel #6
0
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"));
}
Beispiel #7
0
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"));
}
Beispiel #8
0
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;
}
Beispiel #9
0
// 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"));
}
Beispiel #10
0
// 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"));
  }
}
Beispiel #11
0
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"));
}
Beispiel #12
0
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;
}
Beispiel #13
0
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"));
}
Beispiel #14
0
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);
}
Beispiel #15
0
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);
}
Beispiel #16
0
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"));
  }
}
Beispiel #17
0
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;
	}
}