static void collide_world(sprite_t *this_sprite, int x, int y) { sprite_t *s; s = sprite_create(&explosion,NULL); sprite_set_pos(s,x,y); sprite_group_insert(effects_group,s); sprite_kill(this_sprite); }
static enum msgret message(void *obj, msg_t msg) { sprite_t *s = obj; switch (msg.type) { case MSG_UPDATE: if (s->pos.x + 2*CLOUD_OFFSET < 0 || s->pos.x - 2*CLOUD_OFFSET > current_level->width) /* sprite is off screen, remove it */ sprite_kill(s); break; default: return MSG_RET_UNKNOWN; break; } return MSG_RET_ACK; }
static void collide(sprite_t *this_sprite, sprite_t *other_sprite, int x, int y) { sprite_t *s; float n[2]; if (other_sprite->type == &missile) return; s = sprite_create(&dsmoke,NULL); sprite_set_pos(s,x,y); sprite_get_vel(this_sprite, n); s->anim_p = ((vangle(n) + 128) & 255)/8 ; sprite_get_vel(other_sprite,n); sprite_set_vel(s,n); sprite_group_insert(effects_group,s); sprite_kill(this_sprite); }
static enum msgret message(void *obj, msg_t msg) { sprite_t *s = obj; switch(msg.type) { case MSG_UPDATE: update(s); break; case MSG_DEACTIVATE: s->flags |= SPRITE_PAUSED; s->state = DRACO_GLIDE; break; case MSG_KILL: create_effect(&explosion,s->pos); sprite_kill(s); break; default: return MSG_RET_UNKNOWN; break; } return MSG_RET_ACK; }
static void sigget(sprite_t *s, int signal, void *data) { float v[2] = {0,0}; sprite_t *p; float r[2]; int sigabs; switch(signal) { case SIGNAL_CANCONTROL: *(int *)data = !(s->state & SPRITE_CRASHING); break; case SIGNAL_DAMAGE: ((mech_sprite_t *)s)->damage += *(int *)data; break; case SIGNAL_UP: s->state |= SPRITE_UP; s->state &= ~SPRITE_DOWN; break; case -SIGNAL_UP: s->state &= ~SPRITE_UP; break; case SIGNAL_DOWN: s->state |= SPRITE_DOWN; s->state &= ~SPRITE_UP; break; case -SIGNAL_DOWN: s->state &= ~SPRITE_DOWN; break; case SIGNAL_KILL: create_effect(&explosion,s->x,s->y); sprite_kill(s); break; default: break; } }
void scorekeeper() { char cbuf[500]; char cbuf2[40]; sprite_t *s; int i; update_teams_score(nbTeams,nbPlayers); int endOfGame=0; int maxscore = 0; /** une équipe atteint le score max**/ for (i = 0; i < nbTeams; i++){ if (teams[i].points>=max_points) endOfGame=1; if (teams[i].points>maxscore) maxscore=teams[i].points; } /** le temps est écoulé **/ if (sprite_global.game_clock>timeToStop) endOfGame=1; if(endOfGame){ sprintf(cbuf,"Les gagnants sont :\n"); for (i = 0; i < nbTeams; i++){ if(teams[i].points==maxscore){ /*<string-array name="colors"> <item>vert Clair</item> <item>Rouge</item> <item>Bleu</item> <item>Jaune</item> <item>Turquoise</item> <item>Violet</item> <item>Orange</item> <item>Gris</item> <item>Vert Foncé</item> <item>Bleu Foncé</item> </string-array>*/ switch (i){ case 0: sprintf(cbuf2," Les Verts Clairs \n"); break; case 1: sprintf(cbuf2," Les Rouges \n"); break; case 2: sprintf(cbuf2," Les Bleus \n"); break; case 3: sprintf(cbuf2," Les Jaunes \n"); break; case 4: sprintf(cbuf2," Les Turquoises \n"); break; case 5: sprintf(cbuf2," Les Violets \n"); break; case 6: sprintf(cbuf2," Les Oranges \n"); break; case 7: sprintf(cbuf2," Les Gris \n"); break; case 8: sprintf(cbuf2," Les Verts Foncés \n"); break; case 9: sprintf(cbuf2," Les Bleus Foncés \n"); break; default: break; } //sprintf(cbuf2," Team %d\n",i); strcat(cbuf,cbuf2); } } sprintf(cbuf2,"\n\n %d points\n",maxscore); strcat(cbuf,cbuf2); message_time(cbuf,10); message_time("Starting in 3",1); message_time("Starting in 2",1); message_time("Starting in 1",1); message_time("GO !",1); init_spawn_delays(); int j; for (j = 0; j< nbTeams; j++){ teams[j].points=0; } for (j = 0; j < playerCount; j++){ players[j].points=0; sprite_kill(players[j].sprite); } timeToStop=sprite_global.game_clock+1000*cfgnum("game.max_duration",60); return; } for (i = 0; i < playerCount; i++) { if (!sprite_isvalid(&(players[i].controller->target))) { if (!players[i].spawnTimer){ sprite_release(&(players[i].sprite)); sprite_timer_set(&(players[i].spawnTimer),players[i].timeBeforeRespawn); printf("timer set player %d %d\n", i ,players[i].timeBeforeRespawn ); }else{ if (sprite_timer_finished(players[i].spawnTimer)){ s = sprite_create(players[i].sprite_type,&players[i]); sprite_aquire(s, &(players[i].sprite)); sprite_aquire(players[i].sprite, &(players[i].controller->target)); assert(sprite_isvalid(&(players[i].controller->target))); s = players[i].sprite; sprite_group_insert(mech_group, s); sprite_set_pos(s, players[i].startpos[0], players[i].startpos[1]); players[i].spawnTimer=NULL; } } } } }
static void sigget(sprite_t *s, int signal, void *data) { float v[2] = {0,0}; sprite_t *p; float r[2]; int sigabs; switch(signal) { case SIGNAL_CANCONTROL: *(int *)data = !(s->state & PLANE_CRASHING); break; case SIGNAL_DAMAGE: ((mech_sprite_t *)s)->damage += *(int *)data; ((player_t*)s->owner)->damage=(100*((mech_sprite_t *)s)->damage)/hitpoints; break; case SIGNAL_LAST_ENNEMI: ((player_t*)s->owner)->lastEnnemi=(player_t*)data; break; case SIGNAL_ACCELERATE: s->state |= PLANE_ACCELERATING; break; case -SIGNAL_ACCELERATE: s->state &= ~PLANE_ACCELERATING; break; case SIGNAL_UP: s->state |= PLANE_UP; s->state &= ~PLANE_DOWN; break; case -SIGNAL_UP: s->state &= ~PLANE_UP; break; case SIGNAL_DOWN: s->state |= PLANE_DOWN; s->state &= ~PLANE_UP; break; case -SIGNAL_DOWN: s->state &= ~PLANE_DOWN; break; case SIGNAL_FIRE: /* create bullet */ if (sprite_timer_finished(((struct biplane*)s)->gun_timer) && !(s->state & PLANE_CRASHING)) { sound_effect(&sound_gunfire,s->x,s->y); p = sprite_create(((struct biplane*)s)->bullet_type,s->owner); //p->owner=s->owner; sprite_group_insert(bullet_group,p); r[0] = mech_heading((mech_sprite_t *)s)[0]; r[1] = mech_heading((mech_sprite_t *)s)[1]; vmul(r,21); /* Find start of bullet in clumsy way */ vrot(r,-9); sprite_set_pos(p,s->x + r[0],s->y + r[1]); sprite_get_vel(s,v); vmadd(v,200,mech_heading((mech_sprite_t *)s)); sprite_set_vel(p,v); /* cannot fire again in some time */ sprite_timer_set(&(((struct biplane*)s)->gun_timer),bullet_delay); } break; case SIGNAL_NUM0: /* create bomb */ if (sprite_timer_finished(((struct biplane*)s)->bomb_timer) && (!(s->state & PLANE_CRASHING)) && (((struct biplane*)s)->nr_bombs > 0)) { ((struct biplane*)s)->nr_bombs--; p = sprite_create(&bomb,s->owner); p->anim_p = s->anim_p; ((mech_sprite_t *)p)->angle = ((mech_sprite_t *)s)->angle; r[0] = mech_heading((mech_sprite_t *)s)[0]; r[1] = mech_heading((mech_sprite_t *)s)[1]; vmul(r,14); vrot(r,-80); sprite_set_pos(p,s->x + r[0],s->y + r[1]); sprite_get_vel(s,v); vmadd(v,5,r); sprite_set_vel(p,v); sprite_group_insert(bomb_group,p); sprite_timer_set(&(((struct biplane*)s)->bomb_timer), bomb_delay); } break; case SIGNAL_NUM1: /* jump ship */ if (sprite_timer_finished(((struct biplane*)s)->bomb_timer) && (!(s->state & PLANE_CRASHING))) { p = sprite_create(¶chute,NULL); r[0] = mech_heading((mech_sprite_t *)s)[0]; r[1] = mech_heading((mech_sprite_t *)s)[1]; vmul(r,14); vrot(r,80); sprite_set_pos(p,s->x + r[0],s->y + r[1]); sprite_get_vel(s,v); vmadd(v,5,r); sprite_set_vel(p,v); sprite_group_insert(mech_group,p); sprite_timer_set(&(((struct biplane*)s)->bomb_timer),bomb_delay); } break; case SIGNAL_KILL: create_effect(&explosion,s->x,s->y); sprite_kill(s); break; case SIGNAL_ISHARMLESS: if (s->state & PLANE_CRASHING) ((struct signal_reply *)data)->reply = 1; break; case SIGNAL_STATSTRING://TTODO : useless ? sprintf(data,"%i bombs",((struct biplane*)s)->nr_bombs); break; default: break; } }
static void frame_trigger(sprite_t *s) { sprite_kill(s); }