示例#1
0
int logic_loop() {
    poll_input();
    //much logic, so complicated, wow
    if (levl->bgtype == 2) update_fire(); //Very firey
    for (int ei=levl->entitycnt-1;ei>=0;ei--) {
        ENTITY *e = levl->entities+ei;
        //printf("\nstart collide %d\n",ei);
        collide(e);
        switch (e->type) {
        default:
            printf("Unknown entity type in logic loop! type: %d id: %d",e->type,ei);
        case ENTITY_TYPE_NULL:
            break;
        case ENTITY_TYPE_PLAYER:
            //e->accely += 1/128.0;
            //if (e->accely > 1/16.0) e->accely = 1/16.0;
            if (pkeys & PIG_KEY_BUTTON) e->health -= 1;
            if ((pkeys & PIG_KEY_UP) && (e->data1 & 0x0001)) e->accely = -1/6.0;
            e->accelx = 0;
            if ((pkeys & PIG_KEY_LEFT) && !(e->data1 & 0x0001)) e->accelx = -1/16.0;
            if ((pkeys & PIG_KEY_RIGHT) && !(e->data1 & 0x0001)) e->accelx = 1/16.0;
            if ((pkeys & (PIG_KEY_LEFT | PIG_KEY_RIGHT)) == (PIG_KEY_LEFT | PIG_KEY_RIGHT) && !(e->data1 & 0x0001)) e->accelx = 0;
            //printf("1 %f %f %f %f %d\n",e->y,e->accely,e->x,e->accelx,e->data1);
            do_accel(e,0,1/256.0,1/8.0);
            //printf("2 %f %f %f %f %d\n",e->y,e->accely,e->x,e->accelx,e->data1);
            /*if (pkeys & PIG_KEY_UP) e->y -= 1/16.0;
            if (pkeys & PIG_KEY_DOWN) e->y += 1/16.0;
            if (pkeys & PIG_KEY_LEFT) e->x -= 1/16.0;
            if (pkeys & PIG_KEY_RIGHT) e->x += 1/16.0;*/
            if (e->health <= 0) return 1;
            break;
        case ENTITY_TYPE_COLLECTABLE:
            for (int ci=0;ci<levl->entitycnt;ci++) {
                //printf("entity %d coll list %d ",ci,coll_list[ci]);
                if (coll_list[ci] == 0xFFFFFFFF) break;
                ENTITY* ce = levl->entities+coll_list[ci];
                //printf("entity %d coll %d\n",ei,coll_list[ci]);
                if (ce->type == ENTITY_TYPE_PLAYER) {
                    ce->data4 += (e->data2 & 0x00FF) == 7 ? -13 : (int)pow(2,(e->data2 & 0x00FF));
                    e->type = 0;
                    break;
                }
            }
            break;
        }
        //sanity chacks
        //prevent stuff from escaping the map
        if(e->x<0)e->x=0;if(e->y<0)e->y=0;if(e->x>levl->sizex-1)e->x=levl->sizex-1;if(e->y>levl->sizey-1)e->y=levl->sizey-1;
    }
    //printf("0-1 %X\t%X\n",do_collide(levl->entities+0,levl->entities+1),is_intersection(21.4545,15.584254,1,1,20,10,1,1));
    return 0;
}
示例#2
0
int
config_main(int argc, char *argv[])
{
	if (argc >= 2) {
		if (!strcmp(argv[1], "gyro")) {
			do_gyro(argc - 2, argv + 2);
		} else if (!strcmp(argv[1], "accel")) {
			do_accel(argc - 2, argv + 2);
		} else if (!strcmp(argv[1], "mag")) {
			do_mag(argc - 2, argv + 2);
		} else {
			do_device(argc - 1, argv + 1);
		}
	}
	
	errx(1, "expected a command, try 'gyro', 'accel', 'mag'");
}
示例#3
0
int
config_main(int argc, char *argv[])
{
	if (argc >= 2) {
		if (!strncmp(argv[1], "/dev/gyro",9)) {
			do_gyro(argc - 1, argv + 1);
		} else if (!strncmp(argv[1], "/dev/accel",10)) {
			do_accel(argc - 1, argv + 1);
		} else if (!strncmp(argv[1], "/dev/mag",8)) {
			do_mag(argc - 1, argv + 1);
		} else {
			do_device(argc - 1, argv + 1);
		}
	}

	errx(1, "expected a device, try '/dev/gyro', '/dev/accel', '/dev/mag'");
}
示例#4
0
int do_accel(ENTITY* e, int recur, float gravity, float gravitymax) {
    e->accely += gravity;
    if (e->accely > gravitymax) e->accely = gravitymax;
    float newx = e->x+e->accelx;
    float newy = e->y+e->accely;
    int newg = 1;
    if (e->accely > 0) {
        if (get_tile(floor(e->x),ceil(newy)) || get_tile(ceil(e->x),ceil(newy))) {
            newy = floor(newy);
            e->accely = 0;
        } else if (!(e->data1 & 0x0001)) newg = 0;
    } else if (e->accely < 0) {
        if (get_tile(floor(e->x),floor(newy)) || get_tile(ceil(e->x),floor(newy))) {
            newy = ceil(newy);
            e->accely = 0;
            newg = 0;
        }
    }
    if (e->accely != 0) newg = 0;
    if (e->accelx > 0) {
        if (get_tile(ceil(newx),floor(e->y)) || get_tile(ceil(newx),ceil(e->y))) {
            newx = floor(newx);
            e->accelx = 0;
        }
    } else if (e->accelx < 0) {
        if (get_tile(floor(newx),floor(e->y)) || get_tile(floor(newx),ceil(e->y))) {
            newx = ceil(newx);
            e->accelx = 0;
        }
    } else;
    if (ceil(newy) == newy && newy != 0) newg &= 1; else newg = 0;
    if (recur>5|!(get_tile(floor(newx),floor(newy)) || get_tile(ceil(newx),floor(newy)) || get_tile(floor(newx),ceil(newy)) || get_tile(ceil(newx),ceil(newy)))) {
        e->x = newx;
        e->y = newy;
        e->data1 = newg ? e->data1 | 0x0001 : e->data1 & 0xFFFE;
        if (newg) e->accely = 0;
        //printf("exit at recur %d\t",recur);
    } else do_accel(e, recur+1, gravity, gravitymax);
}
示例#5
0
int
config_main(int argc, char *argv[])
{
	bool is_device_cmd = argc >= 2 && (!strcmp(argv[1], "block") || !strcmp(argv[1], "unblock"));

	if (argc >= 3) {
		if (!is_device_cmd && !strncmp(argv[2], "/dev/gyro", 9)) {
			return do_gyro(argc - 1, argv + 1);

		} else if (!is_device_cmd && !strncmp(argv[2], "/dev/accel", 10)) {
			return do_accel(argc - 1, argv + 1);

		} else if (!is_device_cmd && !strncmp(argv[2], "/dev/mag", 8)) {
			return do_mag(argc - 1, argv + 1);

		} else {
			return do_device(argc - 1, argv + 1);
		}
	}

	print_usage();
	return 1;
}