void powerup_basic(int redadd, int greenadd, int blueadd, int score, const char *format, ...) { va_list args; PALETTE_FLASH_ADD(redadd,greenadd,blueadd); va_start(args, format ); HUD_init_message_va(HM_DEFAULT, format, args); va_end(args); add_points_to_score(score); }
void powerup_basic(int redadd, int greenadd, int blueadd, int score, char *format, ...) { char text[120]; va_list args; va_start(args, format ); vsprintf(text, format, args); va_end(args); PALETTE_FLASH_ADD(redadd,greenadd,blueadd); HUD_init_message(text); //mprintf_powerup_info(); add_points_to_score(score); }
object *object_create_explosion_sub(object *objp, short segnum, vms_vector * position, fix size, int vclip_type, fix maxdamage, fix maxdistance, fix maxforce, int parent ) { int objnum; object *obj; objnum = obj_create( OBJ_FIREBALL,vclip_type,segnum,position,&vmd_identity_matrix,size, CT_EXPLOSION,MT_NONE,RT_FIREBALL); if (objnum < 0 ) { mprintf((1, "Can't create object in object_create_explosion_sub.\n")); return NULL; } obj = &Objects[objnum]; //mprintf( 0, "Fireball created at %d, %d, %d\n", obj->pos.x, obj->pos.y, obj->pos.z ); //now set explosion-specific data obj->lifeleft = Vclip[vclip_type ].play_time; obj->ctype.expl_info.spawn_time = -1; obj->ctype.expl_info.delete_objnum = -1; obj->ctype.expl_info.delete_time = -1; if (maxdamage > 0) { fix dist, force; vms_vector pos_hit, vforce; fix damage; int i; object * obj0p = &Objects[0]; // -- now legal for badass explosions on a wall. Assert(objp != NULL); for (i=0; i<=Highest_object_index; i++ ) { // Weapons used to be affected by badass explosions, but this introduces serious problems. // When a smart bomb blows up, if one of its children goes right towards a nearby wall, it will // blow up, blowing up all the children. So I remove it. MK, 09/11/94 if ( (obj0p->type == OBJ_CNTRLCEN) || (obj0p->type==OBJ_PLAYER) || ((obj0p->type==OBJ_ROBOT) && ((Objects[parent].type != OBJ_ROBOT) || (Objects[parent].id != obj0p->id)))) { dist = vm_vec_dist_quick( &obj0p->pos, &obj->pos ); // Make damage be from 'maxdamage' to 0.0, where 0.0 is 'maxdistance' away; if ( dist < maxdistance ) { if (object_to_object_visibility(obj, obj0p, FQ_TRANSWALL)) { damage = maxdamage - fixmuldiv( dist, maxdamage, maxdistance ); force = maxforce - fixmuldiv( dist, maxforce, maxdistance ); // Find the force vector on the object vm_vec_sub( &vforce, &obj0p->pos, &obj->pos ); vm_vec_normalize_quick(&vforce); vm_vec_scale(&vforce, force ); // Find where the point of impact is... ( pos_hit ) vm_vec_scale(vm_vec_sub(&pos_hit, &obj->pos, &obj0p->pos), fixdiv(obj0p->size, obj0p->size + dist)); switch ( obj0p->type ) { case OBJ_ROBOT: phys_apply_force(obj0p,&vforce); // When a robot gets whacked by a badass force, he looks towards it because robots tend to get blasted from behind. { vms_vector neg_vforce; neg_vforce.x = vforce.x * -2 * (7 - Difficulty_level)/8; neg_vforce.y = vforce.y * -2 * (7 - Difficulty_level)/8; neg_vforce.z = vforce.z * -2 * (7 - Difficulty_level)/8; phys_apply_rot(obj0p,&neg_vforce); } if ( obj0p->shields >= 0 ) { if (apply_damage_to_robot(obj0p, damage, parent)) if ((objp != NULL) && (parent == Players[Player_num].objnum)) add_points_to_score(Robot_info[obj0p->id].score_value); } break; case OBJ_CNTRLCEN: if ( obj0p->shields >= 0 ) { apply_damage_to_controlcen(obj0p, damage, parent ); } break; case OBJ_PLAYER: { object * killer=NULL; vms_vector vforce2; if ((objp != NULL) && (Game_mode & GM_MULTI) && (objp->type == OBJ_PLAYER)) { // mprintf((0, "Damaged by player %d's explosion.\n", objp->id)); killer = objp; } vforce2 = vforce; if (parent > -1 ) { killer = &Objects[parent]; if (killer != ConsoleObject) // if someone else whacks you, cut force by 2x vforce2.x /= 2; vforce2.y /= 2; vforce2.z /= 2; } vforce2.x /= 2; vforce2.y /= 2; vforce2.z /= 2; phys_apply_force(obj0p,&vforce); phys_apply_rot(obj0p,&vforce2); if ( obj0p->shields >= 0 ) apply_damage_to_player(obj0p, killer, damage ); } break; default: Int3(); // Illegal object type } // end switch } else { ; // mprintf((0, "No badass: robot=%2i, dist=%7.3f, maxdistance=%7.3f .\n", i, f2fl(dist), f2fl(maxdistance))); } // end if (object_to_object_visibility... } // end if (dist < maxdistance) } obj0p++; } // end for } // end if (maxdamage... // mprintf(0, "\n"); return obj; }