static int modproc_get_id( INSTANCE * my, int * params ) { INSTANCE * ptr = first_instance, ** ctx ; if ( !params[0] ) { LOCDWORD( mod_proc, my, TYPE_SCAN ) = 0 ; if ( LOCDWORD( mod_proc, my, ID_SCAN ) ) { ptr = instance_get( LOCDWORD( mod_proc, my, ID_SCAN ) ) ; if ( ptr ) ptr = ptr->next ; } while ( ptr ) { if (( LOCDWORD( mod_proc, ptr, STATUS ) & ~STATUS_WAITING_MASK ) >= STATUS_RUNNING ) { LOCDWORD( mod_proc, my, ID_SCAN ) = LOCDWORD( mod_proc, ptr, PROCESS_ID ) ; return LOCDWORD( mod_proc, ptr, PROCESS_ID ) ; } ptr = ptr->next ; } return 0 ; } LOCDWORD( mod_proc, my, ID_SCAN ) = 0 ; /* Check if already in scan by type and we reach limit */ ctx = ( INSTANCE ** ) LOCADDR( mod_proc, my, CONTEXT ); /* if ( !*ctx && LOCDWORD( mod_proc, my, TYPE_SCAN ) ) { LOCDWORD( mod_proc, my, TYPE_SCAN ) = 0; return 0; } */ /* Check if type change from last call */ if ( LOCDWORD( mod_proc, my, TYPE_SCAN ) != params[0] ) { *ctx = NULL; LOCDWORD( mod_proc, my, TYPE_SCAN ) = params[0]; } while ( ( ptr = instance_get_by_type( params[0], ctx ) ) ) { if ( /*ptr != my &&*/ ( LOCDWORD( mod_proc, ptr, STATUS ) & ~STATUS_WAITING_MASK ) >= STATUS_RUNNING ) { return LOCDWORD( mod_proc, ptr, PROCESS_ID ) ; } } return 0 ; }
static int __collision( INSTANCE * my, int id, int colltype ) { INSTANCE * ptr, ** ctx ; int status, p ; int ( *colfunc )( INSTANCE *, GRAPH *, REGION *, INSTANCE * ); REGION bbox1 ; GRAPH * bmp1 ; if ( id == -1 ) return ( check_collision_with_mouse( my, colltype ) ) ? 1 : 0 ; switch ( colltype ) { case COLLISION_NORMAL: colfunc = check_collision; break; case COLLISION_BOX: colfunc = check_collision_box; break; case COLLISION_CIRCLE: colfunc = check_collision_circle; break; default: return 0; } bmp1 = instance_graph( my ) ; if ( !bmp1 ) return 0 ; instance_get_bbox( my, bmp1, &bbox1 ); int ctype = LOCDWORD( mod_grproc, my, CTYPE ); /* Checks only for a single instance */ if ( id >= FIRST_INSTANCE_ID ) return ( ( ( ptr = instance_get( id ) ) && ctype == LOCDWORD( mod_grproc, ptr, CTYPE ) ) ? colfunc( my, bmp1, &bbox1, ptr ) : 0 ) ; /* we must use full list of instances or get types from it */ ptr = first_instance ; if ( !id ) { LOCDWORD( mod_grproc, my, GRPROC_TYPE_SCAN ) = 0 ; if ( ( p = LOCDWORD( mod_grproc, my, GRPROC_ID_SCAN ) ) ) { ptr = instance_get( p ) ; if ( ptr ) ptr = ptr->next ; } while ( ptr ) { if ( ptr != my && ctype == LOCDWORD( mod_grproc, ptr, CTYPE ) && ( ( status = ( LOCDWORD( mod_grproc, ptr, STATUS ) & ~STATUS_WAITING_MASK ) ) == STATUS_RUNNING || status == STATUS_FROZEN ) && colfunc( my, bmp1, &bbox1, ptr ) ) { LOCDWORD( mod_grproc, my, GRPROC_ID_SCAN ) = LOCDWORD( mod_grproc, ptr, PROCESS_ID ) ; return LOCDWORD( mod_grproc, ptr, PROCESS_ID ) ; } ptr = ptr->next ; } return 0 ; } LOCDWORD( mod_grproc, my, GRPROC_ID_SCAN ) = 0 ; /* Check if already in scan by type and we reach limit */ ctx = ( INSTANCE ** ) LOCADDR( mod_grproc, my, GRPROC_CONTEXT ); if ( LOCDWORD( mod_grproc, my, GRPROC_TYPE_SCAN ) != id ) /* Check if type change from last call */ { *ctx = NULL; LOCDWORD( mod_grproc, my, GRPROC_TYPE_SCAN ) = id; } while ( ( ptr = instance_get_by_type( id, ctx ) ) ) { if ( ptr != my && ctype == LOCDWORD( mod_grproc, ptr, CTYPE ) && ( ( status = ( LOCDWORD( mod_grproc, ptr, STATUS ) & ~STATUS_WAITING_MASK ) ) == STATUS_RUNNING || status == STATUS_FROZEN ) && colfunc( my, bmp1, &bbox1, ptr ) ) { return LOCDWORD( mod_grproc, ptr, PROCESS_ID ) ; } } return 0 ; }