void instance_get_bbox( INSTANCE * i, GRAPH * gr, REGION * dest ) { REGION *region; int x, y, r ; int scalex, scaley ; r = LOCINT32( librender, i, REGIONID ) ; if ( r > 0 && r < 32 ) region = ®ions[ r ] ; else region = ®ions[ 0 ]; x = LOCINT32( librender, i, COORDX ) ; y = LOCINT32( librender, i, COORDY ) ; RESOLXY( librender, i, x, y ); scalex = LOCINT32( librender, i, GRAPHSIZEX ); scaley = LOCINT32( librender, i, GRAPHSIZEY ); if ( scalex == 100 && scaley == 100 ) scalex = scaley = LOCINT32( librender, i, GRAPHSIZE ); gr_get_bbox( dest, region, x, y, LOCDWORD( librender, i, FLAGS ) ^ LOCDWORD( librender, i, XGRAPH_FLAGS ), LOCDWORD( librender, i, XGRAPH ) ? 0 : LOCINT32( librender, i, ANGLE ), scalex, scaley, gr ) ; }
static int compare_instances( const void * ptr1, const void * ptr2 ) { const INSTANCE * i1 = *( const INSTANCE ** )ptr1 ; const INSTANCE * i2 = *( const INSTANCE ** )ptr2 ; int ret = LOCDWORD( libscroll, i2, COORDZ ) - LOCDWORD( libscroll, i1, COORDZ ); return !ret ? LOCDWORD( libscroll, i1, PROCESS_ID ) - LOCDWORD( libscroll, i2, PROCESS_ID ) : ret; }
static int modproc_let_me_alone( INSTANCE * my, int * params ) { INSTANCE * i = first_instance ; while ( i ) { if ( i != my && ( LOCDWORD( mod_proc, i, STATUS ) & ~STATUS_WAITING_MASK ) != STATUS_DEAD ) LOCDWORD( mod_proc, i, STATUS ) = ( LOCDWORD( mod_proc, i, STATUS ) & STATUS_WAITING_MASK ) | STATUS_KILLED ; i = i->next ; } if ( LOCDWORD( mod_proc, my, STATUS ) > STATUS_KILLED ) LOCDWORD( mod_proc, my, STATUS ) = STATUS_RUNNING; return 1 ; }
static void _modproc_kill_all() { INSTANCE * i = first_instance ; while ( i ) { LOCDWORD( mod_proc, i, STATUS ) = STATUS_KILLED ; i = i->next ; } }
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; }
void draw_instance_at( INSTANCE * i, REGION * region, int x, int y, GRAPH * dest ) { GRAPH * map ; int16_t * blend_table = NULL ; int flags ; int scalex, scaley ; int alpha ; int blendop; PALETTE * palette = NULL; int paletteid; map = instance_graph( i ) ; if ( !map ) return ; flags = ( LOCDWORD( librender, i, FLAGS ) ^ LOCDWORD( librender, i, XGRAPH_FLAGS ) ); if (( alpha = LOCDWORD( librender, i, ALPHA ) ) != 255 ) { if ( alpha <= 0 ) return ; else if ( alpha < 255 ) flags |= B_ALPHA | ( alpha << B_ALPHA_SHIFT ); } scalex = LOCINT32( librender, i, GRAPHSIZEX ); scaley = LOCINT32( librender, i, GRAPHSIZEY ); if ( scalex == 100 && scaley == 100 ) scalex = scaley = LOCINT32( librender, i, GRAPHSIZE ); if (( blendop = LOCDWORD( librender, i, BLENDOP ) ) ) { blend_table = map->blend_table; map->blend_table = ( int16_t * ) blendop; } if (( paletteid = LOCDWORD( librender, i, PALETTEID ) ) ) { palette = map->format->palette ; map->format->palette = ( PALETTE * ) paletteid; } /* XGRAPH does not rotate destination graphic. WARNING: don't remove "scalex != 100 || scaley != 100 ||" from begin the next condition */ if ( scalex != 100 || scaley != 100 || ( LOCINT32( librender, i, ANGLE ) && !LOCDWORD( librender, i, XGRAPH ) ) ) { gr_rotated_blit( dest, region, x, y, flags, LOCDWORD( librender, i, XGRAPH ) ? 0 : LOCINT32( librender, i, ANGLE ), scalex, scaley, map ) ; } else { gr_blit( dest, region, x, y, flags, map ) ; } if ( paletteid ) map->format->palette = palette; if ( blendop ) map->blend_table = blend_table; }
static int get_bbox( REGION * bbox, INSTANCE * proc ) { GRAPH * b ; int x, y ; int scalex, scaley ; b = instance_graph( proc ) ; if ( !b ) return 0 ; scalex = LOCINT32( mod_grproc, proc, GRAPHSIZEX ); scaley = LOCINT32( mod_grproc, proc, GRAPHSIZEY ); if ( scalex == 100 && scaley == 100 ) scalex = scaley = LOCINT32( mod_grproc, proc, GRAPHSIZE ); x = LOCINT32( mod_grproc, proc, COORDX ) ; y = LOCINT32( mod_grproc, proc, COORDY ) ; RESOLXY( mod_grproc, proc, x, y ); gr_get_bbox( bbox, 0, x, y, LOCDWORD( mod_grproc, proc, FLAGS ) & ( B_HMIRROR | B_VMIRROR ), LOCINT32( mod_grproc, proc, ANGLE ), scalex, scaley, b ) ; return 1 ; }
GRAPH * instance_graph( INSTANCE * i ) { int * xgraph, c, a ; if (( xgraph = ( int * ) LOCDWORD( librender, i, XGRAPH ) ) ) // Get offset of XGRAPH table { c = *xgraph++; // Get number of graphs ids in XGRAPH table if ( c ) { // Normalize ANGLE a = LOCINT32( librender, i, ANGLE ) % 360000 ; if ( a < 0 ) a += 360000 ; // Get graph id in XGRAPH table to draw c = xgraph[a * c / 360000] ; // If graph id value is negative, then graphic must be mirrored if ( c < 0 ) { c = -c; LOCDWORD( librender, i, XGRAPH_FLAGS ) = B_HMIRROR; } else { LOCDWORD( librender, i, XGRAPH_FLAGS ) = 0; } // Get GRAPH * to draw return bitmap_get( LOCDWORD( librender, i, FILEID ), c ) ; } } // Get GRAPH * to draw if (( c = LOCDWORD( librender, i, GRAPHID ) ) ) { return bitmap_get( LOCDWORD( librender, i, FILEID ), c ) ; } return 0 ; // No graph to draw }
static void draw_at( GRAPH * dest, int x, int y, REGION * r, INSTANCE * i ) { GRAPH * map ; int scalex, scaley; scalex = LOCINT32( mod_grproc, i, GRAPHSIZEX ); scaley = LOCINT32( mod_grproc, i, GRAPHSIZEY ); if ( scalex == 100 && scaley == 100 ) scalex = scaley = LOCINT32( mod_grproc, i, GRAPHSIZE ); map = instance_graph( i ) ; if ( !map ) return ; // PATCH - XGRAPH DOES NOT ROTATE DESTINATION GRAPHIC if ( LOCINT32( mod_grproc, i, ANGLE ) || scaley != 100 || scalex != 100 ) { if ( LOCDWORD( mod_grproc, i, XGRAPH ) && scalex == 100 && scaley == 100 ) { gr_blit( dest, r, x, y, LOCDWORD( mod_grproc, i, FLAGS ) & ( B_HMIRROR | B_VMIRROR ), map ) ; } else { if ( LOCDWORD( mod_grproc, i, XGRAPH ) ) { gr_rotated_blit( dest, r, x, y, LOCDWORD( mod_grproc, i, FLAGS ) & ( B_HMIRROR | B_VMIRROR ), 0, scalex, scaley, map ) ; } else { gr_rotated_blit( dest, r, x, y, LOCDWORD( mod_grproc, i, FLAGS ) & ( B_HMIRROR | B_VMIRROR ), LOCINT32( mod_grproc, i, ANGLE ), scalex, scaley, map ) ; } } } else { gr_blit( dest, r, x, y, LOCDWORD( mod_grproc, i, FLAGS ) & ( B_HMIRROR | B_VMIRROR ), map ) ; } }
void __bgdexport( librender, instance_create_hook )( INSTANCE * r ) { /* COORZ is 0 when a new instance is created */ LOCDWORD( librender, r, OBJECTID ) = gr_new_object( /* LOCINT32( librender, r, COORDZ ) */ 0, draw_instance_info, draw_instance, r ); }
void scroll_update( int n ) { int x0, y0, x1, y1, cx, cy, w, h, speed ; REGION bbox; GRAPH * gr, * graph, * back; SCROLL_EXTRA_DATA * data; if ( n < 0 || n > 9 ) return ; if ( !scrolls[n].active || !scrolls[n].region || !scrolls[n].graphid ) return ; graph = scrolls[n].graphid ? bitmap_get( scrolls[n].fileid, scrolls[n].graphid ) : 0 ; back = scrolls[n].backid ? bitmap_get( scrolls[n].fileid, scrolls[n].backid ) : 0 ; if ( !graph ) return ; // El fondo de scroll no existe if ( scrolls[n].backid && !back ) return ; // Grafico no existe data = &(( SCROLL_EXTRA_DATA * ) &GLODWORD( libscroll, SCROLLS ) )[n] ; w = scrolls[n].region->x2 - scrolls[n].region->x + 1 ; h = scrolls[n].region->y2 - scrolls[n].region->y + 1 ; scrolls[n].z = data->z ; scrolls[n].ratio = data->ratio ; scrolls[n].camera = instance_get( data->camera ) ; scrolls[n].speed = data->speed ; if ( data->follows < 0 || data->follows > 9 ) scrolls[n].follows = 0 ; else scrolls[n].follows = &scrolls[data->follows] ; if ( data->region1 < 0 || data->region1 > 31 ) scrolls[n].region1 = 0 ; else scrolls[n].region1 = ®ions[data->region1] ; if ( data->region2 < 0 || data->region2 > 31 ) scrolls[n].region2 = 0 ; else scrolls[n].region2 = ®ions[data->region2] ; /* Actualiza las variables globales (perseguir la camara, etc) */ if ( scrolls[n].follows ) { if ( scrolls[n].ratio ) { data->x0 = scrolls[n].follows->x0 * 100 / scrolls[n].ratio ; data->y0 = scrolls[n].follows->y0 * 100 / scrolls[n].ratio ; } else { data->x0 = scrolls[n].follows->x0 ; data->y0 = scrolls[n].follows->y0 ; } } if ( scrolls[n].camera ) { /* Mira a ver si entra dentro de la region 1 o 2 */ speed = scrolls[n].speed ; if ( scrolls[n].speed == 0 ) speed = 9999999 ; /* Update speed */ if (( gr = instance_graph( scrolls[n].camera ) ) ) { instance_get_bbox( scrolls[n].camera, gr, &bbox ); x0 = bbox.x - data->x0 ; y0 = bbox.y - data->y0 ; x1 = bbox.x2 - data->x0 ; y1 = bbox.y2 - data->y0 ; if ( scrolls[n].region1 && ( x0 < scrolls[n].region1->x2 && y0 < scrolls[n].region1->y2 && x1 > scrolls[n].region1->x && y1 > scrolls[n].region1->y ) ) { speed = 0 ; } else if ( scrolls[n].region2 ) { if ( x0 > scrolls[n].region2->x2 ) speed = ( x0 - scrolls[n].region2->x2 ); if ( y0 > scrolls[n].region2->y2 ) speed = ( y0 - scrolls[n].region2->y2 ); if ( x1 < scrolls[n].region2->x ) speed = ( scrolls[n].region2->x - x1 ); if ( y1 < scrolls[n].region2->y ) speed = ( scrolls[n].region2->y - y1 ); } } /* Forzar a que esté en el centro de la ventana */ cx = LOCDWORD( libscroll, scrolls[n].camera, COORDX ) ; cy = LOCDWORD( libscroll, scrolls[n].camera, COORDY ) ; RESOLXY( libscroll, scrolls[n].camera, cx, cy ); cx -= w / 2 ; cy -= h / 2 ; if ( data->x0 < cx ) data->x0 = MIN( data->x0 + speed, cx ) ; if ( data->y0 < cy ) data->y0 = MIN( data->y0 + speed, cy ) ; if ( data->x0 > cx ) data->x0 = MAX( data->x0 - speed, cx ) ; if ( data->y0 > cy ) data->y0 = MAX( data->y0 - speed, cy ) ; } /* Scrolls no cíclicos y posición del background */ if ( graph ) { if ( !( scrolls[n].flags & GRAPH_HWRAP ) ) data->x0 = MAX( 0, MIN( data->x0, ( int )graph->width - w ) ) ; if ( !( scrolls[n].flags & GRAPH_VWRAP ) ) data->y0 = MAX( 0, MIN( data->y0, ( int )graph->height - h ) ) ; } if ( scrolls[n].ratio ) { data->x1 = data->x0 * 100 / scrolls[n].ratio ; data->y1 = data->y0 * 100 / scrolls[n].ratio ; } if ( back ) { if ( !( scrolls[n].flags & BACK_HWRAP ) ) data->x1 = MAX( 0, MIN( data->x1, ( int )back->width - w ) ) ; if ( !( scrolls[n].flags & BACK_VWRAP ) ) data->y1 = MAX( 0, MIN( data->y1, ( int )back->height - h ) ) ; } /* Actualiza la posición del scroll según las variables globales */ scrolls[n].posx0 = data->x0 ; scrolls[n].posy0 = data->y0 ; scrolls[n].x0 = data->x0 % ( int32_t ) graph->width ; scrolls[n].y0 = data->y0 % ( int32_t ) graph->height ; if ( scrolls[n].x0 < 0 ) scrolls[n].x0 += graph->width ; if ( scrolls[n].y0 < 0 ) scrolls[n].y0 += graph->height ; if ( back ) { scrolls[n].x1 = data->x1 % ( int32_t ) back->width ; scrolls[n].y1 = data->y1 % ( int32_t ) back->height ; if ( scrolls[n].x1 < 0 ) scrolls[n].x1 += back->width ; if ( scrolls[n].y1 < 0 ) scrolls[n].y1 += back->height ; } }
void __bgdexport( librender, instance_destroy_hook )( INSTANCE * r ) { if ( LOCDWORD( librender, r, OBJECTID ) ) gr_destroy_object( LOCDWORD( librender, r, OBJECTID ) ); }
INSTANCE * instance_getsmallbro( INSTANCE * i ) { return instance_get( LOCDWORD( i, SMALLBRO ) ) ; }
INSTANCE * instance_getson( INSTANCE * i ) { return instance_get( LOCDWORD( i, SON ) ) ; }
INSTANCE * instance_new( PROCDEF * proc, INSTANCE * father ) { INSTANCE * r, * brother; int n, pid; if ( ( pid = instance_getid() ) == -1 ) return NULL; r = ( INSTANCE * ) calloc( 1, sizeof( INSTANCE ) ) ; assert( r ) ; r->pridata = ( int * ) malloc( proc->private_size + 4 ) ; r->pubdata = ( int * ) malloc( proc->public_size + 4 ) ; r->locdata = ( int * ) malloc( local_size + 4 ) ; r->code = proc->code ; r->codeptr = proc->code ; r->exitcode = proc->exitcode ; r->errorcode = proc->errorcode ; r->proc = proc ; r->call_level = 0 ; r->switchval = 0; r->switchval_string = 0; r->cased = 0; r->breakpoint = 0 ; r->private_size = proc->private_size ; r->public_size = proc->public_size ; r->first_run = 1 ; if ( proc->private_size > 0 ) memcpy( r->pridata, proc->pridata, proc->private_size ) ; if ( proc->public_size > 0 ) memcpy( r->pubdata, proc->pubdata, proc->public_size ) ; if ( local_size > 0 ) memcpy( r->locdata, localdata, local_size ) ; /* Inicializa datos de jerarquia */ LOCDWORD( r, PROCESS_TYPE ) = proc->type ; LOCDWORD( r, PROCESS_ID ) = pid ; LOCDWORD( r, SON ) = 0 ; LOCDWORD( r, SMALLBRO ) = 0 ; if ( father ) { LOCDWORD( r, FATHER ) = LOCDWORD( father, PROCESS_ID ) ; brother = instance_get( LOCDWORD( father, SON ) ) ; if ( brother ) { LOCDWORD( r, BIGBRO ) = LOCDWORD( brother, PROCESS_ID ) ; LOCDWORD( brother, SMALLBRO ) = pid ; } else { LOCDWORD( r, BIGBRO ) = 0 ; } LOCDWORD( father, SON ) = pid ; } else { LOCDWORD( r, FATHER ) = 0 ; LOCDWORD( r, BIGBRO ) = 0 ; } /* Cuenta los usos de las variables tipo cadena */ for ( n = 0; n < proc->string_count; n++ ) string_use( PRIDWORD( r, proc->strings[n] ) ) ; /* Strings privadas */ for ( n = 0; n < proc->pubstring_count; n++ ) string_use( PUBDWORD( r, proc->pubstrings[n] ) ) ; /* Strings publicas */ for ( n = 0; n < local_strings; n++ ) string_use( LOCDWORD( r, localstr[n] ) ) ; /* Strings locales */ r->prev = NULL ; r->next = first_instance ; if ( first_instance ) first_instance->prev = r; first_instance = r ; instance_add_to_list_by_id( r, pid ); instance_add_to_list_by_instance( r ); instance_add_to_list_by_type( r, proc->type ); instance_add_to_list_by_priority( r, 0 ); /* The called_by pointer should be set only when the caller * is waiting for this process to return */ r->called_by = NULL; r->stack = malloc( STACK_SIZE ); r->stack_ptr = &r->stack[1]; r->stack[0] = STACK_SIZE; /* Initialize list pointers */ LOCDWORD( r, STATUS ) = STATUS_RUNNING; if ( instance_create_hook_count ) for ( n = 0; n < instance_create_hook_count; n++ ) instance_create_hook_list[n]( r ); return r ; }
static int modproc_signal_action( INSTANCE * my, int * params ) { int action = params[1]; if ( my ) { switch ( params[0] ) { case S_KILL: switch ( action ) { case S_IGN: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) |= SMASK_KILL; break; case S_DFL: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) &= ~SMASK_KILL; break; } break ; case S_WAKEUP: switch ( action ) { case S_IGN: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) |= SMASK_WAKEUP; break; case S_DFL: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) &= ~SMASK_WAKEUP; break; } break ; case S_SLEEP: switch ( action ) { case S_IGN: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) |= SMASK_SLEEP; break; case S_DFL: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) &= ~SMASK_SLEEP; break; } break ; case S_FREEZE: switch ( action ) { case S_IGN: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) |= SMASK_FREEZE; break; case S_DFL: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) &= ~SMASK_FREEZE; break; } break ; case S_KILL_TREE: switch ( action ) { case S_IGN: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) |= SMASK_KILL_TREE; break; case S_DFL: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) &= ~SMASK_KILL_TREE; break; } break ; case S_WAKEUP_TREE: switch ( action ) { case S_IGN: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) |= SMASK_WAKEUP_TREE; break; case S_DFL: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) &= ~SMASK_WAKEUP_TREE; break; } break ; case S_SLEEP_TREE: switch ( action ) { case S_IGN: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) |= SMASK_SLEEP_TREE; break; case S_DFL: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) &= ~SMASK_SLEEP_TREE; break; } break ; case S_FREEZE_TREE: switch ( action ) { case S_IGN: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) |= SMASK_FREEZE_TREE; break; case S_DFL: LOCDWORD( mod_proc, my, SIGNAL_ACTION ) &= ~SMASK_FREEZE_TREE; break; } break ; } } return 1 ; }
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 ; }
void __bgdexport( mod_grproc, process_exec_hook )( INSTANCE * r ) { LOCDWORD( mod_grproc, r, GRPROC_ID_SCAN ) = 0; LOCDWORD( mod_grproc, r, GRPROC_TYPE_SCAN ) = 0; LOCDWORD( mod_grproc, r, GRPROC_CONTEXT ) = 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 ; }
static int check_collision_with_mouse( INSTANCE * proc1, int colltype ) { REGION bbox1, bbox2 ; int x, y, mx, my ; static GRAPH * bmp = NULL; switch ( colltype ) { case COLLISION_BOX: case COLLISION_CIRCLE: if ( !get_bbox( &bbox2, proc1 ) ) return 0 ; case COLLISION_NORMAL: break; default: return 0; } mx = GLOINT32( mod_grproc, MOUSEX ) ; my = GLOINT32( mod_grproc, MOUSEY ) ; /* Checks the process's bounding box to optimize checking (only for screen-type objects) */ if ( LOCDWORD( mod_grproc, proc1, CTYPE ) == C_SCREEN ) { switch ( colltype ) { case COLLISION_NORMAL: if ( !get_bbox( &bbox2, proc1 ) ) return 0 ; if ( bbox2.x > mx || bbox2.x2 < mx || bbox2.y > my || bbox2.y2 < my ) return 0 ; break; case COLLISION_BOX: if ( bbox2.x <= mx && bbox2.x2 >= mx && bbox2.y <= my && bbox2.y2 >= my ) return 1; return 0; break; case COLLISION_CIRCLE: { int cx1, cy1, dx1, dy1; cx1 = bbox2.x + ( dx1 = ( bbox2.x2 - bbox2.x + 1 ) ) / 2 ; cy1 = bbox2.y + ( dy1 = ( bbox2.y2 - bbox2.y + 1 ) ) / 2 ; if ( get_distance( cx1, cy1, 0, mx, my, 0 ) < ( dx1 + dy1 ) / 4 ) return 1; return 0; break; } } } /* Creates a temporary bitmap (only once) */ if ( colltype == COLLISION_NORMAL ) { /* maybe must force this to 32 bits */ if ( bmp && bmp->format->depth != sys_pixel_format->depth ) { bitmap_destroy( bmp ); bmp = NULL; } if ( !bmp ) bmp = bitmap_new( 0, 2, 1, sys_pixel_format->depth ) ; if ( !bmp ) return 0 ; memset( bmp->data, 0, bmp->pitch * bmp->height ) ; } /* Retrieves process information */ bbox1.x = 0 ; bbox1.x2 = 1 ; bbox1.y = 0 ; bbox1.y2 = 0 ; x = LOCINT32( mod_grproc, proc1, COORDX ) ; y = LOCINT32( mod_grproc, proc1, COORDY ) ; RESOLXY( mod_grproc, proc1, x, y ); /* Scroll-type process: check for each region */ if ( LOCDWORD( mod_grproc, proc1, CTYPE ) == C_SCROLL ) { SCROLL_EXTRA_DATA * data; scrolldata * scroll; int i; if ( GLOEXISTS( mod_grproc, SCROLLS ) ) { int cnumber = LOCDWORD( mod_grproc, proc1, CNUMBER ); if ( !cnumber ) cnumber = 0xffffffff ; for ( i = 0 ; i < 10 ; i++ ) { data = &(( SCROLL_EXTRA_DATA * ) & GLODWORD( mod_grproc, SCROLLS ) )[i] ; scroll = ( scrolldata * ) data->reserved[0]; if ( scroll && scroll->active && ( cnumber & ( 1 << i ) ) ) { REGION * r = scroll->region; switch ( colltype ) { case COLLISION_NORMAL: if ( r->x > mx || r->x2 < mx || r->y > my || r->y2 < my ) continue; draw_at( bmp, x + r->x - mx - scroll->posx0, y + r->y - my - scroll->posy0, &bbox1, proc1 ); switch ( sys_pixel_format->depth ) { case 8: if ( *( uint8_t * )bmp->data ) return 1; break; case 16: if ( *( uint16_t * )bmp->data ) return 1; break; case 32: if ( *( uint32_t * )bmp->data ) return 1; break; } break; case COLLISION_BOX: if ( bbox2.x <= scroll->posx0 + r->x + mx && bbox2.x2 >= scroll->posx0 + r->x + mx && bbox2.y <= scroll->posy0 + r->y + my && bbox2.y2 >= scroll->posy0 + r->y + my ) return 1; break; case COLLISION_CIRCLE: { int cx1, cy1, dx1, dy1; cx1 = bbox2.x + ( dx1 = ( bbox2.x2 - bbox2.x + 1 ) ) / 2 ; cy1 = bbox2.y + ( dy1 = ( bbox2.y2 - bbox2.y + 1 ) ) / 2 ; if ( get_distance( cx1, cy1, 0, r->x + mx + scroll->posx0, r->y + my + scroll->posy0, 0 ) < ( dx1 + dy1 ) / 4 ) return 1; break; } } } } } return 0; } switch ( colltype ) { case COLLISION_NORMAL: /* Collision check (blits into temporary space and checks the resulting pixel) */ draw_at( bmp, x - mx, y - my, &bbox1, proc1 ) ; switch ( sys_pixel_format->depth ) { case 8: if ( *( uint8_t * )bmp->data ) return 1; break; case 16: if ( *( uint16_t * )bmp->data ) return 1; break; case 32: if ( *( uint32_t * )bmp->data ) return 1; break; } break; case COLLISION_BOX: if ( bbox2.x <= mx && bbox2.x2 >= mx && bbox2.y <= my && bbox2.y2 >= my ) return 1; break; case COLLISION_CIRCLE: { int cx1, cy1, dx1, dy1; cx1 = bbox2.x + ( dx1 = ( bbox2.x2 - bbox2.x + 1 ) ) / 2 ; cy1 = bbox2.y + ( dy1 = ( bbox2.y2 - bbox2.y + 1 ) ) / 2 ; if ( get_distance( cx1, cy1, 0, mx, my, 0 ) < ( dx1 + dy1 ) / 4 ) return 1; break; } } return 0 ; }
void scroll_draw( int n, REGION * clipping ) { int nproc, x, y, cx, cy ; static INSTANCE ** proclist = 0; static int proclist_reserved = 0; int proclist_count; REGION r; int status; GRAPH * graph, * back, * dest = NULL; SCROLL_EXTRA_DATA * data; INSTANCE * i; if ( n < 0 || n > 9 ) return ; if ( !scrolls[n].active || !scrolls[n].region || !scrolls[n].graphid ) return ; graph = scrolls[n].graphid ? bitmap_get( scrolls[n].fileid, scrolls[n].graphid ) : NULL ; back = scrolls[n].backid ? bitmap_get( scrolls[n].fileid, scrolls[n].backid ) : NULL ; if ( !graph ) return ; // El fondo de scroll no existe if ( scrolls[n].backid && !back ) return ; // Grafico no existe dest = scrolls[n].destid ? bitmap_get( scrolls[n].destfile, scrolls[n].destid ) : NULL ; data = &(( SCROLL_EXTRA_DATA * ) & GLODWORD( libscroll, SCROLLS ) )[n] ; /* Dibuja el fondo */ r = *scrolls[n].region; if ( !dest && clipping ) region_union( &r, clipping ); if ( back ) { if ( back->ncpoints > 0 && back->cpoints[0].x >= 0 ) { cx = back->cpoints[0].x ; cy = back->cpoints[0].y ; } else { cx = back->width / 2 ; cy = back->height / 2 ; } y = scrolls[n].region->y - scrolls[n].y1 ; while ( y < scrolls[n].region->y2 ) { x = scrolls[n].region->x - scrolls[n].x1 ; while ( x < scrolls[n].region->x2 ) { gr_blit( dest, &r, x + cx, y + cy, data->flags2, back ) ; x += back->width ; } y += back->height ; } } /* Dibuja el primer plano */ if ( graph->ncpoints > 0 && graph->cpoints[0].x >= 0 ) { cx = graph->cpoints[0].x ; cy = graph->cpoints[0].y ; } else { cx = graph->width / 2 ; cy = graph->height / 2 ; } y = scrolls[n].region->y - scrolls[n].y0 ; while ( y < scrolls[n].region->y2 ) { x = scrolls[n].region->x - scrolls[n].x0 ; while ( x < scrolls[n].region->x2 ) { gr_blit( dest, &r, x + cx, y + cy, data->flags1, graph ) ; x += graph->width ; } y += graph->height ; } /* Crea una lista ordenada de instancias a dibujar */ i = first_instance ; proclist_count = 0 ; while ( i ) { if ( LOCDWORD( libscroll, i, CTYPE ) == C_SCROLL && ( (( status = LOCDWORD( libscroll, i, STATUS ) ) & ~STATUS_WAITING_MASK ) == STATUS_RUNNING || ( status & ~STATUS_WAITING_MASK ) == STATUS_FROZEN ) ) { if ( LOCDWORD( libscroll, i, CNUMBER ) && !( LOCDWORD( libscroll, i, CNUMBER ) & ( 1 << n ) ) ) { i = i->next ; continue ; } if ( proclist_count == proclist_reserved ) { proclist_reserved += 16 ; proclist = ( INSTANCE ** ) realloc( proclist, sizeof( INSTANCE * ) * proclist_reserved ) ; } proclist[proclist_count++] = i ; } i = i->next ; } if ( proclist_count ) { /* Ordena la listilla */ qsort( proclist, proclist_count, sizeof( INSTANCE * ), compare_instances ) ; /* Visualiza los procesos */ for ( nproc = 0 ; nproc < proclist_count ; nproc++ ) { x = LOCDWORD( libscroll, proclist[nproc], COORDX ) ; y = LOCDWORD( libscroll, proclist[nproc], COORDY ) ; RESOLXY( libscroll, proclist[nproc], x, y ); draw_instance_at( proclist[nproc], &r, x - scrolls[n].posx0 + scrolls[n].region->x, y - scrolls[n].posy0 + scrolls[n].region->y, dest ) ; } } }
int draw_instance_info( INSTANCE * i, REGION * region, int * z, int * drawme ) { GRAPH * graph; * drawme = 0; LOCDWORD( librender, i, GRAPHPTR ) = ( int )( graph = instance_graph( i ) ); if ( !graph ) { /* region->x = -2; region->y = -2; region->x2 = -2; region->y2 = -2; */ return 0; } int changed; int status; int coordz, coordx, coordy; status = ( LOCDWORD( librender, i, STATUS ) & ~STATUS_WAITING_MASK ) ; coordz = LOCINT32( librender, i, COORDZ ); /* Si tiene grafico o xgraph o (ctype == 0 y esta corriendo o congelado) */ if ( LOCDWORD( librender, i, CTYPE ) == C_SCREEN && ( status == STATUS_RUNNING || status == STATUS_FROZEN ) ) * drawme = 1; coordx = LOCINT32( librender, i, COORDX ); coordy = LOCINT32( librender, i, COORDY ); RESOLXY( librender, i, coordx, coordy ); changed = graph->modified || LOCINT32( librender, i, SAVED_COORDX ) != coordx || LOCINT32( librender, i, SAVED_COORDY ) != coordy || LOCINT32( librender, i, SAVED_COORDZ ) != coordz || LOCDWORD( librender, i, SAVED_GRAPHID ) != LOCDWORD( librender, i, GRAPHID ) || LOCINT32( librender, i, SAVED_ANGLE ) != LOCINT32( librender, i, ANGLE ) || LOCDWORD( librender, i, SAVED_ALPHA ) != LOCDWORD( librender, i, ALPHA ) || LOCDWORD( librender, i, SAVED_BLENDOP ) != LOCDWORD( librender, i, BLENDOP ) || LOCINT32( librender, i, SAVED_GRAPHSIZE ) != LOCINT32( librender, i, GRAPHSIZE ) || LOCINT32( librender, i, SAVED_GRAPHSIZEX ) != LOCINT32( librender, i, GRAPHSIZEX ) || LOCINT32( librender, i, SAVED_GRAPHSIZEY ) != LOCINT32( librender, i, GRAPHSIZEY ) || LOCDWORD( librender, i, SAVED_FLAGS ) != LOCDWORD( librender, i, FLAGS ) || LOCDWORD( librender, i, SAVED_FILEID ) != LOCDWORD( librender, i, FILEID ) || LOCDWORD( librender, i, SAVED_XGRAPH ) != LOCDWORD( librender, i, XGRAPH ) || ( graph->ncpoints && ( LOCDWORD( librender, i, SAVED_CENTERX ) != graph->cpoints[0].x || LOCDWORD( librender, i, SAVED_CENTERY ) != graph->cpoints[0].y ) ) ; if ( changed ) { /* Update key */ * z = coordz; LOCINT32( librender, i, SAVED_COORDX ) = coordx; LOCINT32( librender, i, SAVED_COORDY ) = coordy; LOCINT32( librender, i, SAVED_COORDZ ) = coordz; LOCDWORD( librender, i, SAVED_GRAPHID ) = LOCDWORD( librender, i, GRAPHID ); LOCINT32( librender, i, SAVED_ANGLE ) = LOCINT32( librender, i, ANGLE ); LOCDWORD( librender, i, SAVED_ALPHA ) = LOCDWORD( librender, i, ALPHA ); LOCDWORD( librender, i, SAVED_BLENDOP ) = LOCDWORD( librender, i, BLENDOP ); LOCINT32( librender, i, SAVED_GRAPHSIZE ) = LOCINT32( librender, i, GRAPHSIZE ); LOCINT32( librender, i, SAVED_GRAPHSIZEX ) = LOCINT32( librender, i, GRAPHSIZEX ); LOCINT32( librender, i, SAVED_GRAPHSIZEY ) = LOCINT32( librender, i, GRAPHSIZEY ); LOCDWORD( librender, i, SAVED_FLAGS ) = LOCDWORD( librender, i, FLAGS ); LOCDWORD( librender, i, SAVED_FILEID ) = LOCDWORD( librender, i, FILEID ); LOCDWORD( librender, i, SAVED_XGRAPH ) = LOCDWORD( librender, i, XGRAPH ); if ( graph->ncpoints ) { LOCDWORD( librender, i, SAVED_CENTERX ) = graph->cpoints[0].x; LOCDWORD( librender, i, SAVED_CENTERY ) = graph->cpoints[0].y; } else { LOCDWORD( librender, i, SAVED_CENTERX ) = CPOINT_UNDEFINED; LOCDWORD( librender, i, SAVED_CENTERY ) = CPOINT_UNDEFINED; } instance_get_bbox( i, graph, region ); return 1; } return changed; }
INSTANCE * instance_duplicate( INSTANCE * father ) { INSTANCE * r, * brother ; int n, pid ; uint32_t type ; if ( ( pid = instance_getid() ) == -1 ) return NULL; r = ( INSTANCE * ) calloc( 1, sizeof( INSTANCE ) ) ; assert( r ) ; r->pridata = ( int * ) malloc( father->private_size + 4 ) ; r->pubdata = ( int * ) malloc( father->public_size + 4 ) ; r->locdata = ( int * ) malloc( local_size + 4 ) ; r->code = father->code ; r->codeptr = father->codeptr ; r->exitcode = father->exitcode ; r->errorcode = father->errorcode ; r->proc = father->proc ; r->call_level = father->call_level ; r->switchval = 0; r->switchval_string = 0; r->cased = 0; r->breakpoint = 0 ; r->private_size = father->private_size ; r->public_size = father->public_size ; r->first_run = 1 ; if ( father->private_size > 0 ) memcpy( r->pridata, father->pridata, r->private_size ) ; if ( father->public_size > 0 ) memcpy( r->pubdata, father->pubdata, r->public_size ) ; if ( local_size > 0 ) memcpy( r->locdata, father->locdata, local_size ) ; /* Inicializa datos de jerarquia */ /* Crea el proceso clónico como si lo hubiera llamado el padre */ type = LOCDWORD( father, PROCESS_TYPE ) ; LOCDWORD( r, PROCESS_ID ) = pid ; LOCDWORD( r, SON ) = 0 ; LOCDWORD( r, SMALLBRO ) = 0 ; LOCDWORD( r, FATHER ) = LOCDWORD( father, PROCESS_ID ) ; brother = instance_get( LOCDWORD( father, SON ) ) ; if ( brother ) { LOCDWORD( r, BIGBRO ) = LOCDWORD( brother, PROCESS_ID ) ; LOCDWORD( brother, SMALLBRO ) = pid ; } else { LOCDWORD( r, BIGBRO ) = 0 ; } LOCDWORD( father, SON ) = pid ; /* Actualiza las cuentas de uso de las cadenas */ for ( n = 0; n < r->proc->string_count; n++ ) string_use( PRIDWORD( r, r->proc->strings[n] ) ) ; /* Strings privadas */ for ( n = 0; n < r->proc->pubstring_count; n++ ) string_use( PUBDWORD( r, r->proc->pubstrings[n] ) ) ; /* Strings publicas */ for ( n = 0; n < local_strings; n++ ) string_use( LOCDWORD( r, localstr[n] ) ) ; /* Strings locales */ r->prev = NULL ; r->next = first_instance ; if ( first_instance ) first_instance->prev = r; first_instance = r ; instance_add_to_list_by_id( r, pid ); instance_add_to_list_by_instance( r ); instance_add_to_list_by_type( r, type ); instance_add_to_list_by_priority( r, LOCINT32( r, PRIORITY ) ); /* The called_by pointer should be set only when the caller * is waiting for this process to return */ r->called_by = NULL; r->stack = malloc( father->stack[0] ); memmove(r->stack, father->stack, (int)father->stack_ptr - (int)father->stack); r->stack_ptr = &r->stack[1]; /* Initialize list pointers */ LOCDWORD( r, STATUS ) = STATUS_RUNNING; if ( instance_create_hook_count ) for ( n = 0; n < instance_create_hook_count; n++ ) instance_create_hook_list[n]( r ); return r ; }
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 ; }
INSTANCE * instance_getfather( INSTANCE * i ) { return instance_get( LOCDWORD( i, FATHER ) ) ; }
static int modproc_get_status( INSTANCE * my, int * params ) { INSTANCE * i ; if ( !params[0] || !( i = instance_get( params[0] ) ) ) return 0; return LOCDWORD( mod_proc, i, STATUS ) ; }
INSTANCE * instance_getbigbro( INSTANCE * i ) { return instance_get( LOCDWORD( i, BIGBRO ) ) ; }
void __bgdexport( mod_proc, process_exec_hook )( INSTANCE * r ) { LOCDWORD( mod_proc, r, TYPE_SCAN ) = 0; LOCDWORD( mod_proc, r, ID_SCAN ) = 0; LOCDWORD( mod_proc, r, CONTEXT ) = 0; }
void instance_destroy( INSTANCE * r ) { INSTANCE * father, * bigbro, * smallbro; int n ; LOCDWORD( r, STATUS ) = STATUS_RUNNING; if ( instance_destroy_hook_count ) for ( n = 0; n < instance_destroy_hook_count; n++ ) instance_destroy_hook_list[n]( r ); /* Actualiza la cuenta de referencia de las variables tipo string */ for ( n = 0 ; n < r->proc->string_count ; n++ ) string_discard( PRIDWORD( r, r->proc->strings[n] ) ) ; /* Strings privadas */ for ( n = 0 ; n < r->proc->pubstring_count ; n++ ) string_discard( PUBDWORD( r, r->proc->pubstrings[n] ) ) ; /* Strings publicas */ for ( n = 0 ; n < local_strings ; n++ ) string_discard( LOCDWORD( r, localstr[n] ) ) ; /* Strings locales */ /* Actualiza árbol de jerarquias */ bigbro = instance_get( LOCDWORD( r, BIGBRO ) ) ; /* Tengo hermano mayor? */ if ( bigbro ) LOCDWORD( bigbro, SMALLBRO ) = LOCDWORD( r, SMALLBRO ) ; /* El hermano menor de mi hermano mayor es mi hermano menor */ smallbro = instance_get( LOCDWORD( r, SMALLBRO ) ) ; /* Tengo hermano menor? */ if ( smallbro ) LOCDWORD( smallbro, BIGBRO ) = LOCDWORD( r, BIGBRO ) ; /* El hermano mayor de mi hermano menor es mi hermano mayor */ father = instance_get( LOCDWORD( r, FATHER ) ) ; /* Tengo padre? */ if ( father && instance_get( LOCDWORD( father, SON ) ) == r ) LOCDWORD( father, SON ) = LOCDWORD( r, BIGBRO ); /* Si tengo padre y soy el hijo menor, mi hermano mayor pasa a ser el menor hijo de mi padre */ /* Quita la instancia de la lista */ if ( r->prev ) r->prev->next = r->next ; if ( r->next ) r->next->prev = r->prev ; if ( first_instance == r ) first_instance = r->next ; /* Remove the instance from all hash lists */ instance_remove_from_list_by_id( r, LOCDWORD( r, PROCESS_ID ) ); instance_remove_from_list_by_instance( r ); instance_remove_from_list_by_type( r, LOCDWORD( r, PROCESS_TYPE ) ); instance_remove_from_list_by_priority( r ); if ( r->stack ) free( r->stack ) ; if ( r->locdata ) free( r->locdata ) ; if ( r->pubdata ) free( r->pubdata ) ; if ( r->pridata ) free( r->pridata ) ; free( r ) ; }
static int grproc_get_real_point( INSTANCE * my, int * params ) { GRAPH * b ; int x, y, r, centerx, centery, px = 0, py = 0, rx = 0, ry = 0 ; int _angle = 0, angle = 0; b = instance_graph( my ) ; if ( !b ) return 0 ; /* Point 0 is the graphic center, but it may be not defined */ if ( params[0] == 0 && ( b->ncpoints == 0 || b->cpoints[0].x == CPOINT_UNDEFINED ) ) { if ( b->ncpoints == 0 ) bitmap_add_cpoint( b, b->width / 2, b->height / 2 ); else { b->cpoints[0].x = b->width / 2; b->cpoints[0].y = b->height / 2; } } else if (( uint32_t )params[0] >= b->ncpoints || params[0] < 0) return 0 ; if ( b->cpoints[params[0]].x == CPOINT_UNDEFINED && b->cpoints[params[0]].y == CPOINT_UNDEFINED ) return 0; r = LOCINT32( mod_grproc, my, REGIONID ) ; if ( r < 0 || r > 31 ) r = 0 ; if ( b->cpoints[0].x != CPOINT_UNDEFINED && b->cpoints[0].y != CPOINT_UNDEFINED ) { centerx = b->cpoints[0].x ; centery = b->cpoints[0].y ; } else { centerx = b->width / 2 ; centery = b->height / 2 ; } if ( LOCINT32( mod_grproc, my, ANGLE ) != 0 && !LOCDWORD( mod_grproc, my, XGRAPH ) ) { _angle = angle = LOCINT32( mod_grproc, my, ANGLE ) ; } /* if ( b->cpoints[params[0]].x >= 0 ) { if ( LOCDWORD( mod_grproc, my, FLAGS ) & B_HMIRROR ) px = centerx - b->cpoints[params[0]].x - 1 ; else px = b->cpoints[params[0]].x - centerx ; if ( LOCDWORD( mod_grproc, my, FLAGS ) & B_VMIRROR ) py = centery - b->cpoints[params[0]].y - 1 ; else py = b->cpoints[params[0]].y - centery ; } else px = py = 0 ; */ if ( params[0] > 0 ) { px = b->cpoints[params[0]].x - centerx ; py = b->cpoints[params[0]].y - centery ; if ( LOCDWORD( mod_grproc, my, FLAGS ) & B_HMIRROR ) { if (_angle) { py = (centery - b->cpoints[params[0]].y) ; angle = 90000 + ( 90000 - angle ); } else px = (centerx - b->cpoints[params[0]].x) ; } if ( LOCDWORD( mod_grproc, my, FLAGS ) & B_VMIRROR ) { if (_angle) { px = (centerx - b->cpoints[params[0]].x) ; angle = 360000 + ( 180000 - angle ); } else py = (centery - b->cpoints[params[0]].y) ; } } if ( LOCINT32( mod_grproc, my, GRAPHSIZEX ) == 100 && LOCINT32( mod_grproc, my, GRAPHSIZEY ) == 100 ) { if ((( int )LOCINT32( mod_grproc, my, GRAPHSIZE ) ) > 0 ) { // Corrected a bug from the casting that rounded to 0 px = ( int )( px * ( LOCINT32( mod_grproc, my, GRAPHSIZE ) / 100.0F ) ) ; py = ( int )( py * ( LOCINT32( mod_grproc, my, GRAPHSIZE ) / 100.0F ) ) ; } } else { // Adding size_x/size_y control if ( LOCINT32( mod_grproc, my, GRAPHSIZEX ) > 0 ) px = ( int )( px * ( LOCINT32( mod_grproc, my, GRAPHSIZEX ) / 100.0F ) ) ; if ( LOCINT32( mod_grproc, my, GRAPHSIZEY ) > 0 ) py = ( int )( py * ( LOCINT32( mod_grproc, my, GRAPHSIZEY ) / 100.0F ) ) ; } if ( angle ) { float cos_angle = ( float ) cos( angle * M_PI / -180000.0 ); float sin_angle = ( float ) sin( angle * M_PI / -180000.0 ); rx = ( int )(( double )px * cos_angle - ( double )py * sin_angle ) ; ry = ( int )(( double )px * sin_angle + ( double )py * cos_angle ) ; px = rx ; py = ry ; } x = LOCINT32( mod_grproc, my, COORDX ) ; y = LOCINT32( mod_grproc, my, COORDY ) ; RESOLXY( mod_grproc, my, x, y ); rx = x + px ; ry = y + py ; if ( LOCINT32( mod_grproc, my, RESOLUTION ) > 0 ) { rx *= LOCINT32( mod_grproc, my, RESOLUTION ); ry *= LOCINT32( mod_grproc, my, RESOLUTION ); } else if ( LOCINT32( mod_grproc, my, RESOLUTION ) < 0 ) { rx /= -LOCINT32( mod_grproc, my, RESOLUTION ); ry /= -LOCINT32( mod_grproc, my, RESOLUTION ); } *( int * )params[1] = rx ; *( int * )params[2] = ry ; return 1 ; }