Blame src/group.c

Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
#include "private.h"
Ivan Mahonin 8535a3
#include "group.h"
Ivan Mahonin 8535a3
#include "world.h"
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
struct _Group {
Ivan Mahonin 8535a3
	HeliArray sprites;
Ivan Mahonin 44355f
	HeliArray spritesSorted;
Ivan Mahonin 8535a3
};
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
Group createGroup() {
Ivan Mahonin 8eb855
	if (!heliInitialized) return NULL;
Ivan Mahonin 8535a3
	Group g = calloc(1, sizeof(*g));
Ivan Mahonin 8eb855
	heliObjectRegister(g, (HeliFreeCallback)&groupDestroy);
Ivan Mahonin 8535a3
	return g;
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin 44355f
Group createEdgesGroupEx(double x1, double y1, double x2, double y2, double borderWidth, int weightLevel) {
Ivan Mahonin 8eb855
	if (!heliInitialized) return NULL;
Ivan Mahonin 8535a3
	if (x2 < x1) { double x = x2; x2 = x1; x1 = x; }
Ivan Mahonin 8535a3
	if (y2 < y1) { double y = y2; y2 = y1; y1 = y; }
Ivan Mahonin 8535a3
	if (borderWidth < 0.1) borderWidth = 0.1;
Ivan Mahonin 8535a3
	
Ivan Mahonin 8535a3
	double b = borderWidth;
Ivan Mahonin 8535a3
	double w = x2 - x1 + b*2;
Ivan Mahonin 8535a3
	double h = y2 - y1 + b*2;
Ivan Mahonin 8535a3
	x1 -= b;
Ivan Mahonin 8535a3
	y1 -= b;
Ivan Mahonin 8535a3
	
Ivan Mahonin 8535a3
	Group g = createGroup();
Ivan Mahonin f8c1ea
	groupAdd(g, createSpriteEx(x1 + w/2, y1 + b/2, w, b));
Ivan Mahonin f8c1ea
	groupAdd(g, createSpriteEx(x1 + w/2, y2 + b/2, w, b));
Ivan Mahonin f8c1ea
	groupAdd(g, createSpriteEx(x1 + b/2, y1 + h/2, b, h));
Ivan Mahonin f8c1ea
	groupAdd(g, createSpriteEx(x2 + b/2, y1 + h/2, b, h));
Ivan Mahonin f80a0a
	groupSetMassLevel(g, weightLevel);
Ivan Mahonin 8535a3
	return g;
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
Group createEdgesGroup()
Ivan Mahonin 44355f
	{ return createEdgesGroupEx(0, 0, worldGetWidth(), worldGetHeight(), worldGetHeight(), 100); }
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
void groupDestroy(Group group) {
Ivan Mahonin 87fe10
	groupClear(group);
Ivan Mahonin 8535a3
	heliArrayDestroy(&group->sprites);
Ivan Mahonin 44355f
	heliArrayDestroy(&group->spritesSorted);
Ivan Mahonin 87fe10
	heliObjectUnregister(group);
Ivan Mahonin 8535a3
	free(group);
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
void groupDestroyEx(Group group, int destroySprites) {
Ivan Mahonin 8535a3
	groupClearEx(group, destroySprites);
Ivan Mahonin 8535a3
	groupDestroy(group);
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
void groupAdd(Group group, Sprite sprite) {
Ivan Mahonin 8935bc
	if (!sprite) return;
Ivan Mahonin 8535a3
	if (groupContains(group, sprite)) return;
Ivan Mahonin 8535a3
	heliArrayInsert(&group->sprites, -1, sprite, NULL);
Ivan Mahonin 44355f
	heliArrayInsert(&group->spritesSorted, -1, sprite, NULL);
Ivan Mahonin 502515
	heliArrayInsert(heliSpriteGetGroups(sprite), -1, group, NULL);
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
void groupRemove(Group group, Sprite sprite) {
Ivan Mahonin 8535a3
	for(int i = group->sprites.count-1; i >= 0; --i)
Ivan Mahonin 8535a3
		if (group->sprites.items[i].value == sprite)
Ivan Mahonin 8535a3
			heliArrayRemove(&group->sprites, i);
Ivan Mahonin 44355f
	for(int i = group->spritesSorted.count-1; i >= 0; --i)
Ivan Mahonin 44355f
		if (group->spritesSorted.items[i].value == sprite)
Ivan Mahonin 44355f
			heliArrayRemove(&group->spritesSorted, i);
Ivan Mahonin 8535a3
	HeliArray *groups = heliSpriteGetGroups(sprite);
Ivan Mahonin 8535a3
	for(int i = groups->count-1; i >= 0; --i)
Ivan Mahonin 8535a3
		if (groups->items[i].value == group)
Ivan Mahonin 8535a3
			heliArrayRemove(groups, i);
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
void groupClearEx(Group group, int destroySprites) {
Ivan Mahonin 8535a3
	while(groupGetCount(group) > 0) {
Ivan Mahonin 8535a3
		Sprite s = groupGet(group, 0);
Ivan Mahonin 8535a3
		groupRemove(group, s);
Ivan Mahonin 8535a3
		if (destroySprites) spriteDestroy(s);
Ivan Mahonin 8535a3
	}
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
void groupClear(Group group)
Ivan Mahonin 8535a3
	{ groupClearEx(group, FALSE); }
Ivan Mahonin 8535a3
void groupDestroyEach(Group group)
Ivan Mahonin 8535a3
	{ groupClearEx(group, TRUE); }
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
int groupContains(Group group, Sprite sprite) {
Ivan Mahonin 8535a3
	for(int i = group->sprites.count-1; i >= 0; --i)
Ivan Mahonin 8535a3
		if (group->sprites.items[i].value == sprite)
Ivan Mahonin 8535a3
			return TRUE;
Ivan Mahonin 8535a3
	return FALSE;
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
int groupGetCount(Group group)
Ivan Mahonin 8535a3
	{ return group->sprites.count; }
Ivan Mahonin 8535a3
Sprite groupGet(Group group, int i)
Ivan Mahonin 07b70f
	{ return (Sprite)heliArrayGetValue(&group->sprites, i); }
Ivan Mahonin 8535a3
Ivan Mahonin 44355f
Ivan Mahonin 44355f
Sprite groupSpriteByPoint(Group group, double x, double y, int onlyVisible) {
Ivan Mahonin 44355f
	heliSpriteSort(&group->spritesSorted);
Ivan Mahonin 44355f
	for(int i = group->spritesSorted.count - 1; i >= 0; --i) {
Ivan Mahonin 44355f
		Sprite s = (Sprite)(group->spritesSorted.items[i].value);
Ivan Mahonin 44355f
		if ((!onlyVisible || spriteGetVisible(s)) && spriteIsPointInside(s, x, y)) return s;
Ivan Mahonin 44355f
	}
Ivan Mahonin 44355f
	return NULL;
Ivan Mahonin 44355f
}
Ivan Mahonin 44355f
Ivan Mahonin f80a0a
Ivan Mahonin 6eadb0
void groupDraw(Group group) {
Ivan Mahonin 6eadb0
	heliSpriteSort(&group->spritesSorted);
Ivan Mahonin 6eadb0
	for(int i = 0; i < group->spritesSorted.count; ++i) {
Ivan Mahonin 6eadb0
		Sprite s = (Sprite)(group->spritesSorted.items[i].value);
Ivan Mahonin 6eadb0
		if (spriteGetVisible(s)) heliSpriteDraw(s);
Ivan Mahonin 6eadb0
	}
Ivan Mahonin 6eadb0
	for(int i = 0; i < group->spritesSorted.count; ++i) {
Ivan Mahonin 6eadb0
		Sprite s = (Sprite)(group->spritesSorted.items[i].value);
Ivan Mahonin 6eadb0
		if (spriteGetDebug(s)) heliSpriteDrawDebug(s);
Ivan Mahonin 6eadb0
	}
Ivan Mahonin 6eadb0
}
Ivan Mahonin 6eadb0
Ivan Mahonin 6eadb0
Ivan Mahonin f80a0a
int groupOverlap(Group group, Sprite sprite) {
Ivan Mahonin 44355f
	for(int i = 0; i < groupGetCount(group); ++i)
Ivan Mahonin f80a0a
		if (spriteOverlap(groupGet(group, i), sprite))
Ivan Mahonin 44355f
			return TRUE;
Ivan Mahonin 44355f
	return FALSE;
Ivan Mahonin 44355f
}
Ivan Mahonin 44355f
Ivan Mahonin f80a0a
int groupCollide(Group group, Sprite sprite) {
Ivan Mahonin 07b70f
	int result = FALSE;
Ivan Mahonin f80a0a
	for(int j = 0; j < 10; ++j) {
Ivan Mahonin f80a0a
		int actualCollision = FALSE;
Ivan Mahonin f80a0a
		Sprite bestSprite = NULL;
Ivan Mahonin f80a0a
		HeliCollisionInfo bestInfo = {};
Ivan Mahonin f80a0a
		for(int i = 0; i < groupGetCount(group); ++i) {
Ivan Mahonin f80a0a
			Sprite s = groupGet(group, i);
Ivan Mahonin f80a0a
			HeliCollisionInfo info = {};
Ivan Mahonin f80a0a
			if (heliSpriteCollisionCheck(s, sprite, &info)) {
Ivan Mahonin f80a0a
				if (info.actualCollision) actualCollision = TRUE;
Ivan Mahonin f80a0a
				if (!bestSprite || bestInfo.distance <= info.distance) {
Ivan Mahonin f80a0a
					bestSprite = s;
Ivan Mahonin f80a0a
					memcpy(&bestInfo, &info, sizeof(bestInfo));
Ivan Mahonin f80a0a
				}
Ivan Mahonin f80a0a
			}
Ivan Mahonin f80a0a
		}
Ivan Mahonin f80a0a
		if (!bestSprite) break;
Ivan Mahonin f80a0a
		heliSpriteCollisionApply(bestSprite, sprite, &bestInfo);
Ivan Mahonin f80a0a
		if (!actualCollision) break;
Ivan Mahonin f80a0a
		result = TRUE;
Ivan Mahonin f80a0a
	}
Ivan Mahonin 07b70f
	return result;
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin f80a0a
int groupOverlapGroup(Group a, Group b) {
Ivan Mahonin 44355f
	for(int i = 0; i < groupGetCount(b); ++i)
Ivan Mahonin f80a0a
		if (groupOverlap(a, groupGet(b, i)))
Ivan Mahonin 44355f
			return TRUE;
Ivan Mahonin 44355f
	return FALSE;
Ivan Mahonin 44355f
}
Ivan Mahonin 44355f
Ivan Mahonin f80a0a
int groupCollideGroup(Group a, Group b) {
Ivan Mahonin 07b70f
	int result = FALSE;
Ivan Mahonin 8535a3
	for(int i = 0; i < groupGetCount(b); ++i)
Ivan Mahonin f80a0a
		if (groupCollide(a, groupGet(b, i)))
Ivan Mahonin 07b70f
			result = TRUE;
Ivan Mahonin 07b70f
	return result;
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin f80a0a
int groupOverlapBetween(Group group) {
Ivan Mahonin 44355f
	for(int i = 0; i < groupGetCount(group); ++i)
Ivan Mahonin 44355f
		for(int j = i+1; j < groupGetCount(group); ++j)
Ivan Mahonin f80a0a
			if (spriteOverlap(groupGet(group, i), groupGet(group, j)))
Ivan Mahonin 44355f
				return TRUE;
Ivan Mahonin 44355f
	return FALSE;
Ivan Mahonin 44355f
}
Ivan Mahonin 44355f
Ivan Mahonin f80a0a
int groupCollideBetween(Group group) {
Ivan Mahonin f8c1ea
	int result = FALSE;
Ivan Mahonin f8c1ea
	for(int i = 0; i < groupGetCount(group); ++i)
Ivan Mahonin f8c1ea
		for(int j = i+1; j < groupGetCount(group); ++j)
Ivan Mahonin f80a0a
			if (spriteCollide(groupGet(group, i), groupGet(group, j)))
Ivan Mahonin f8c1ea
				result = TRUE;
Ivan Mahonin f8c1ea
	return result;
Ivan Mahonin f8c1ea
}
Ivan Mahonin f8c1ea
Ivan Mahonin f80a0a
void groupResetTouch(Group group) {
Ivan Mahonin f80a0a
	for(int i = 0; i < groupGetCount(group); ++i)
Ivan Mahonin f80a0a
		spriteResetTouch(groupGet(group, i));
Ivan Mahonin f80a0a
}
Ivan Mahonin f80a0a
Ivan Mahonin f8c1ea
Ivan Mahonin 8535a3
double groupGetMinDepth(Group group) {
Ivan Mahonin 8535a3
	if (groupGetCount(group) <= 0) return 0;
Ivan Mahonin 8535a3
	double md = spriteGetDepth(groupGet(group, 0));
Ivan Mahonin 8535a3
	for(int i = 1; i < groupGetCount(group); ++i) {
Ivan Mahonin 8535a3
		double d = spriteGetDepth(groupGet(group, i));
Ivan Mahonin 8535a3
		if (d < md) md = d;
Ivan Mahonin 8535a3
	}
Ivan Mahonin 8535a3
	return md;
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
double groupGetMaxDepth(Group group) {
Ivan Mahonin 8535a3
	if (groupGetCount(group) <= 0) return 0;
Ivan Mahonin 8535a3
	double md = spriteGetDepth(groupGet(group, 0));
Ivan Mahonin 8535a3
	for(int i = 1; i < groupGetCount(group); ++i) {
Ivan Mahonin 8535a3
		double d = spriteGetDepth(groupGet(group, i));
Ivan Mahonin 8535a3
		if (d > md) md = d;
Ivan Mahonin 8535a3
	}
Ivan Mahonin 8535a3
	return md;
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
Ivan Mahonin 07b70f
static void foreachInt(Group group, int value, HeliSpriteEashInt func)
Ivan Mahonin 8535a3
	{ for(int i = 0; i < groupGetCount(group); ++i) func(groupGet(group, i), value); }
Ivan Mahonin d4e89f
static void foreachUInt(Group group, unsigned int value, HeliSpriteEashUInt func)
Ivan Mahonin 8535a3
	{ for(int i = 0; i < groupGetCount(group); ++i) func(groupGet(group, i), value); }
Ivan Mahonin d4e89f
static void foreachDouble(Group group, double value, HeliSpriteEashDouble func)
Ivan Mahonin 8535a3
	{ for(int i = 0; i < groupGetCount(group); ++i) func(groupGet(group, i), value); }
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
void groupDestroyTimerEach(Group group, double lifetime)
Ivan Mahonin 502515
	{ for(int i = groupGetCount(group) - 1; i >= 0; --i) spriteDestroyTimer(groupGet(group, i), lifetime); }
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
void groupSetVisibleEach(Group group, int visible)
Ivan Mahonin 8535a3
	{ foreachInt(group, visible, &spriteSetVisible); }
Ivan Mahonin 6eadb0
void groupSetFrozenEach(Group group, int frozen)
Ivan Mahonin 6eadb0
	{ foreachInt(group, frozen, &spriteSetFrozen); }
Ivan Mahonin 6eadb0
void groupSetDebugEach(Group group, int debug)
Ivan Mahonin 6eadb0
	{ foreachInt(group, debug, &spriteSetDebug); }
Ivan Mahonin 8535a3
void groupSetWidthEach(Group group, double width)
Ivan Mahonin 8535a3
	{ foreachDouble(group, width, &spriteSetWidth); }
Ivan Mahonin 8535a3
void groupSetHeightEach(Group group, double height)
Ivan Mahonin 8535a3
	{ foreachDouble(group, height, &spriteSetHeight); }
Ivan Mahonin 8535a3
void groupSetDepthEach(Group group, double depth)
Ivan Mahonin 8535a3
	{ foreachDouble(group, depth, &spriteSetDepth); }
Ivan Mahonin f80a0a
void groupSetXEach(Group group, double x)
Ivan Mahonin f80a0a
	{ foreachDouble(group, x, &spriteSetX); }
Ivan Mahonin f80a0a
void groupSetYEach(Group group, double y)
Ivan Mahonin f80a0a
	{ foreachDouble(group, y, &spriteSetY); }
Ivan Mahonin 8535a3
void groupSetVelocityXEach(Group group, double x)
Ivan Mahonin 8535a3
	{ foreachDouble(group, x, &spriteSetVelocityX); }
Ivan Mahonin 8535a3
void groupSetVelocityYEach(Group group, double y)
Ivan Mahonin 8535a3
	{ foreachDouble(group, y, &spriteSetVelocityY); }
Ivan Mahonin f80a0a
void groupSetAccelerationXEach(Group group, double x)
Ivan Mahonin f80a0a
	{ foreachDouble(group, x, &spriteSetAccelerationX); }
Ivan Mahonin f80a0a
void groupSetAccelerationYEach(Group group, double y)
Ivan Mahonin f80a0a
	{ foreachDouble(group, y, &spriteSetAccelerationY); }
Ivan Mahonin 8535a3
void groupSetRotateToDirectionEach(Group group, int rotateToDirection)
Ivan Mahonin 8535a3
	{ foreachInt(group, rotateToDirection, &spriteSetRotateToDirection); }
Ivan Mahonin 8535a3
void groupSetRotationEach(Group group, double rotation)
Ivan Mahonin 8535a3
	{ foreachDouble(group, rotation, &spriteSetRotation); }
Ivan Mahonin 8535a3
void groupSetRotationSpeedEach(Group group, double rotationSpeed)
Ivan Mahonin 8535a3
	{ foreachDouble(group, rotationSpeed, &spriteSetRotationSpeed); }
Ivan Mahonin 8535a3
void groupSetScaleEach(Group group, double scale)
Ivan Mahonin 8535a3
	{ foreachDouble(group, scale, &spriteSetScale); }
Ivan Mahonin 8535a3
void groupSetMirrorXEach(Group group, int mirrorX)
Ivan Mahonin 8535a3
	{ foreachInt(group, mirrorX, &spriteSetMirrorX); }
Ivan Mahonin 8535a3
void groupSetMirrorYEach(Group group, int mirrorY)
Ivan Mahonin 8535a3
	{ foreachInt(group, mirrorY, &spriteSetMirrorY); }
Ivan Mahonin d4e89f
void groupSetShapeColorEach(Group group, unsigned int colorCode)
Ivan Mahonin d4e89f
	{ foreachUInt(group, colorCode, &spriteSetShapeColor); }
Ivan Mahonin d4e89f
void groupSetTintColorEach(Group group, unsigned int colorCode)
Ivan Mahonin d4e89f
	{ foreachUInt(group, colorCode, &spriteSetTintColor); }
Ivan Mahonin 44355f
void groupSetUserTagEach(Group group, int tag)
Ivan Mahonin 44355f
	{ foreachInt(group, tag, &spriteSetUserTag); }
Ivan Mahonin 44355f
Ivan Mahonin 44355f
void groupSetBounciness(Group group, double bounciness)
Ivan Mahonin 44355f
	{ foreachDouble(group, bounciness, &spriteSetBounciness); }
Ivan Mahonin 44355f
void groupSetBouncinessThreshold(Group group, double bouncinessThreshold)
Ivan Mahonin 44355f
	{ foreachDouble(group, bouncinessThreshold, &spriteSetBouncinessThreshold); }
Ivan Mahonin f80a0a
void groupSetFriction(Group group, double friction)
Ivan Mahonin f80a0a
	{ foreachDouble(group, friction, &spriteSetFriction); }
Ivan Mahonin f80a0a
void groupSetAirFriction(Group group, double friction)
Ivan Mahonin f80a0a
	{ foreachDouble(group, friction, &spriteSetAirFriction); }
Ivan Mahonin f80a0a
void groupSetMassLevel(Group group, int massLevel)
Ivan Mahonin f80a0a
	{ foreachInt(group, massLevel, &spriteSetMassLevel); }
Ivan Mahonin f80a0a
void groupSetColliderSensitiveDistance(Group group, double distance)
Ivan Mahonin f80a0a
	{ foreachDouble(group, distance, &spriteSetColliderSensitiveDistance); }
Ivan Mahonin 44355f
Ivan Mahonin 8535a3
Ivan Mahonin dba3fc
void groupSetAnimationEach(Group group, Animation animation) {
Ivan Mahonin dba3fc
	for(int i = groupGetCount(group) - 1; i >= 0 ; --i)
Ivan Mahonin dba3fc
		spriteSetAnimation(groupGet(group, i), animation);
Ivan Mahonin dba3fc
}
Ivan Mahonin dba3fc
Ivan Mahonin 8935bc
void groupSetNoAnimationEach(Group group) {
Ivan Mahonin dba3fc
	for(int i = groupGetCount(group) - 1; i >= 0 ; --i)
Ivan Mahonin 8935bc
		spriteSetNoAnimation(groupGet(group, i));
Ivan Mahonin 8935bc
}
Ivan Mahonin 8935bc
Ivan Mahonin 8535a3
void groupPointToEach(Group group, double x, double y) {
Ivan Mahonin 07b70f
	for(int i = 0; i < groupGetCount(group); ++i)
Ivan Mahonin 8535a3
		spritePointTo(groupGet(group, i), x, y);
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin 8535a3
void groupSetSpeedAndDirectionEach(Group group, double speed, double angle) {
Ivan Mahonin 07b70f
	for(int i = 0; i < groupGetCount(group); ++i)
Ivan Mahonin 8535a3
		spriteSetSpeedAndDirection(groupGet(group, i), speed, angle);
Ivan Mahonin 8535a3
}
Ivan Mahonin 8535a3
Ivan Mahonin f80a0a
void groupSetXYEach(Group group, double x, double y) {
Ivan Mahonin f80a0a
	for(int i = 0; i < groupGetCount(group); ++i)
Ivan Mahonin f80a0a
		spriteSetXY(groupGet(group, i), x, y);
Ivan Mahonin f80a0a
}
Ivan Mahonin 8535a3
void groupSetVelocityEach(Group group, double x, double y) {
Ivan Mahonin 07b70f
	for(int i = 0; i < groupGetCount(group); ++i)
Ivan Mahonin 8535a3
		spriteSetVelocityXY(groupGet(group, i), x, y);
Ivan Mahonin 8535a3
}
Ivan Mahonin f80a0a
void groupSetAccelerationEach(Group group, double x, double y) {
Ivan Mahonin f80a0a
	for(int i = 0; i < groupGetCount(group); ++i)
Ivan Mahonin f80a0a
		spriteSetAccelerationXY(groupGet(group, i), x, y);
Ivan Mahonin f80a0a
}
Ivan Mahonin 8535a3
Ivan Mahonin 44355f
Ivan Mahonin 44355f
void groupSetUserTextEach(Group group, const char *text) {
Ivan Mahonin 44355f
	for(int i = groupGetCount(group) - 1; i >= 0 ; --i)
Ivan Mahonin 44355f
		spriteSetUserText(groupGet(group, i), text);
Ivan Mahonin 44355f
}
Ivan Mahonin 44355f
Ivan Mahonin 44355f
void groupSetUserDataEach(Group group, void *data) {
Ivan Mahonin 44355f
	for(int i = groupGetCount(group) - 1; i >= 0 ; --i)
Ivan Mahonin 44355f
		spriteSetUserData(groupGet(group, i), data);
Ivan Mahonin 44355f
}
Ivan Mahonin 44355f
Ivan Mahonin 44355f
void groupSetDestroyEach(Group group, SpriteCallback destroy) {
Ivan Mahonin 44355f
	for(int i = groupGetCount(group) - 1; i >= 0 ; --i)
Ivan Mahonin 44355f
		spriteSetDestroy(groupGet(group, i), destroy);
Ivan Mahonin 44355f
}
Ivan Mahonin 44355f
Ivan Mahonin 44355f
Ivan Mahonin f8c1ea
void groupSetColliderEach(Group group, Collider type, double xOffset, double yOffset, double rotationOffset)
Ivan Mahonin f8c1ea
	{ groupSetColliderEachEx(group, type, xOffset, yOffset, rotationOffset, -1, -1, -1); }
Ivan Mahonin f8c1ea
void groupSetColliderCircleEach(Group group, double xOffset, double yOffset, double radius)
Ivan Mahonin f8c1ea
	{ groupSetColliderEachEx(group, COLLIDER_CIRCLE, xOffset, yOffset, 0, 0, 0, radius); }
Ivan Mahonin f8c1ea
void groupSetColliderRectangleEach(
Ivan Mahonin f8c1ea
	Group group, double xOffset, double yOffset, double rotationOffset,
Ivan Mahonin f8c1ea
	double width, double height, double cornersRadius )
Ivan Mahonin f8c1ea
{
Ivan Mahonin f8c1ea
	groupSetColliderEachEx(
Ivan Mahonin f8c1ea
		group, COLLIDER_RECTANGLE,
Ivan Mahonin f8c1ea
		xOffset, yOffset, rotationOffset,
Ivan Mahonin f8c1ea
		width, height, cornersRadius);
Ivan Mahonin f8c1ea
}
Ivan Mahonin f8c1ea
void groupSetColliderEachEx(
Ivan Mahonin f8c1ea
	Group group, Collider type,
Ivan Mahonin f8c1ea
	double xOffset, double yOffset, double rotationOffset,
Ivan Mahonin f8c1ea
	double width, double height, double radius)
Ivan Mahonin 8535a3
{
Ivan Mahonin 07b70f
	for(int i = 0; i < groupGetCount(group); ++i)
Ivan Mahonin f8c1ea
		spriteSetColliderEx(
Ivan Mahonin f8c1ea
			groupGet(group, i), type,
Ivan Mahonin f8c1ea
			xOffset, yOffset, rotationOffset,
Ivan Mahonin f8c1ea
			width, height, radius );
Ivan Mahonin 8535a3
}