static int modproc_signal_action3( INSTANCE * my, int * params ) { INSTANCE * i, * ctx ; if ( params[0] == ALL_PROCESS ) { i = first_instance ; while ( i ) { modproc_signal_action( i, ¶ms[1] ) ; i = i->next ; } return 0 ; } else if ( params[0] < FIRST_INSTANCE_ID ) { ctx = NULL; while ( ( i = instance_get_by_type( params[0], &ctx ) ) ) { modproc_signal_action( i, ¶ms[1] ) ; } return 0 ; } i = instance_get( params[0] ) ; if ( i ) modproc_signal_action( i, ¶ms[1] ) ; return 1; }
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 modproc_running( INSTANCE * my, int * params ) { INSTANCE * i, * ctx; if ( params[0] == 0 ) return 0; if ( params[0] >= FIRST_INSTANCE_ID ) { i = instance_get( params[0] ) ; if ( i && ( LOCDWORD( mod_proc, i, STATUS ) & ~STATUS_WAITING_MASK ) >= STATUS_RUNNING ) return 1; return 0; } ctx = NULL; while ( ( i = instance_get_by_type( params[0], &ctx ) ) ) { if ( ( LOCDWORD( mod_proc, i, STATUS ) & ~STATUS_WAITING_MASK ) >= STATUS_RUNNING ) return 1; } return 0; }
static int modproc_signal( INSTANCE * my, int * params ) { INSTANCE * i, * ctx; int fake_params[2] ; if ( params[0] == ALL_PROCESS ) { /* Signal all process but my */ int myid = LOCDWORD( mod_proc, my, PROCESS_ID ); fake_params[1] = ( params[1] >= S_TREE ) ? params[1] - S_TREE : params[1] ; i = first_instance ; while ( i ) { if ( LOCDWORD( mod_proc, i, PROCESS_ID ) != myid && ( LOCDWORD( mod_proc, i, STATUS ) & ~STATUS_WAITING_MASK ) > STATUS_KILLED ) { fake_params[0] = LOCDWORD( mod_proc, i, PROCESS_ID ) ; modproc_signal( my, fake_params ) ; } i = i->next ; } return 0 ; } else if ( params[0] < FIRST_INSTANCE_ID ) { /* Signal by type */ fake_params[1] = params[1] ; ctx = NULL; while ( ( i = instance_get_by_type( params[0], &ctx ) ) ) { fake_params[0] = LOCDWORD( mod_proc, i, PROCESS_ID ) ; modproc_signal( my, fake_params ) ; } return 0 ; } i = instance_get( params[0] ) ; if ( i ) { if (( LOCDWORD( mod_proc, i, STATUS ) & ~STATUS_WAITING_MASK ) > STATUS_KILLED ) { switch ( params[1] ) { case S_KILL: case S_KILL_FORCE: if ( params[1] == S_KILL_FORCE || !( LOCDWORD( mod_proc, i, SIGNAL_ACTION ) & SMASK_KILL ) ) LOCDWORD( mod_proc, i, STATUS ) = STATUS_KILLED ; break ; case S_WAKEUP: case S_WAKEUP_FORCE: if ( params[1] == S_WAKEUP_FORCE || !( LOCDWORD( mod_proc, i, SIGNAL_ACTION ) & SMASK_WAKEUP ) ) LOCDWORD( mod_proc, i, STATUS ) = ( LOCDWORD( mod_proc, i, STATUS ) & STATUS_WAITING_MASK ) | STATUS_RUNNING ; break ; case S_SLEEP: case S_SLEEP_FORCE: if ( params[1] == S_SLEEP_FORCE || !( LOCDWORD( mod_proc, i, SIGNAL_ACTION ) & SMASK_SLEEP ) ) LOCDWORD( mod_proc, i, STATUS ) = ( LOCDWORD( mod_proc, i, STATUS ) & STATUS_WAITING_MASK ) | STATUS_SLEEPING ; break ; case S_FREEZE: case S_FREEZE_FORCE: if ( params[1] == S_FREEZE_FORCE || !( LOCDWORD( mod_proc, i, SIGNAL_ACTION ) & SMASK_FREEZE ) ) LOCDWORD( mod_proc, i, STATUS ) = ( LOCDWORD( mod_proc, i, STATUS ) & STATUS_WAITING_MASK ) | STATUS_FROZEN ; break ; case S_KILL_TREE: case S_KILL_TREE_FORCE: if ( params[1] == S_KILL_TREE_FORCE || !( LOCDWORD( mod_proc, i, SIGNAL_ACTION ) & SMASK_KILL_TREE ) ) LOCDWORD( mod_proc, i, STATUS ) = ( LOCDWORD( mod_proc, i, STATUS ) & STATUS_WAITING_MASK ) | STATUS_KILLED ; break ; case S_WAKEUP_TREE: case S_WAKEUP_TREE_FORCE: if ( params[1] == S_WAKEUP_TREE_FORCE || !( LOCDWORD( mod_proc, i, SIGNAL_ACTION ) & SMASK_WAKEUP_TREE ) ) LOCDWORD( mod_proc, i, STATUS ) = ( LOCDWORD( mod_proc, i, STATUS ) & STATUS_WAITING_MASK ) | STATUS_RUNNING ; break ; case S_SLEEP_TREE: case S_SLEEP_TREE_FORCE: if ( params[1] == S_SLEEP_TREE_FORCE || !( LOCDWORD( mod_proc, i, SIGNAL_ACTION ) & SMASK_SLEEP_TREE ) ) LOCDWORD( mod_proc, i, STATUS ) = ( LOCDWORD( mod_proc, i, STATUS ) & STATUS_WAITING_MASK ) | STATUS_SLEEPING ; break ; case S_FREEZE_TREE: case S_FREEZE_TREE_FORCE: if ( params[1] == S_FREEZE_TREE_FORCE || !( LOCDWORD( mod_proc, i, SIGNAL_ACTION ) & SMASK_FREEZE_TREE ) ) LOCDWORD( mod_proc, i, STATUS ) = ( LOCDWORD( mod_proc, i, STATUS ) & STATUS_WAITING_MASK ) | STATUS_FROZEN ; break ; default: return 1 ; } } if ( params[1] >= S_TREE ) { fake_params[1] = params[1] ; i = instance_getson( i ) ; while ( i ) { fake_params[0] = LOCDWORD( mod_proc, i, PROCESS_ID ) ; modproc_signal( my, fake_params ) ; i = instance_getbigbro( i ) ; } } } return 1 ; }
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 ; }