Create extra fireballs for an exploding object
| 973 | } |
| 974 | // Create extra fireballs for an exploding object |
| 975 | void CreateExtraFireballs(object *obj, float size_scale) { |
| 976 | // Create some extra explosions to start later |
| 977 | float expl_size = obj->size * size_scale; |
| 978 | int size_add = expl_size / EXTRA_EXPLOSION_THRESHOLD; |
| 979 | int extras = size_add + (ps_rand() % 4); |
| 980 | int i; |
| 981 | if (obj->type == OBJ_BUILDING && OBJECT_OUTSIDE(obj)) |
| 982 | extras += 4; |
| 983 | // Cap at 12 |
| 984 | extras = std::min(12, extras); |
| 985 | // mprintf(0,"Creating %d extra explosions\n",extras); |
| 986 | CreateRandomSparks(extras, &obj->pos, obj->roomnum); |
| 987 | for (i = 0; i < extras; i++) { |
| 988 | vector pos = obj->pos; |
| 989 | float vals[10], add_time; |
| 990 | float upwards; |
| 991 | // Make this a billowing explosion |
| 992 | if (obj->type == OBJ_BUILDING && OBJECT_OUTSIDE(obj)) { |
| 993 | float increment = (obj->size * 1.5) / extras; |
| 994 | pos.y += (increment * i); |
| 995 | add_time = (1.0 / extras) * i; |
| 996 | upwards = 60; |
| 997 | } else { |
| 998 | pos.x += (((ps_rand() % 100) / 50.0) - 1.0) * (obj->size / 2); |
| 999 | pos.y += (((ps_rand() % 100) / 50.0) - 1.0) * (obj->size / 2); |
| 1000 | pos.z += (((ps_rand() % 100) / 50.0) - 1.0) * (obj->size / 2); |
| 1001 | add_time = .3 + ((ps_rand() % 100) / 200.0); |
| 1002 | upwards = 0; |
| 1003 | } |
| 1004 | |
| 1005 | vals[0] = pos.x; |
| 1006 | vals[1] = pos.y; |
| 1007 | vals[2] = pos.z; |
| 1008 | if (size_add > 0) { |
| 1009 | if (ps_rand() % 2) |
| 1010 | vals[3] = BIG_EXPLOSION_INDEX; |
| 1011 | else |
| 1012 | vals[3] = GetRandomMediumExplosion(); |
| 1013 | } else |
| 1014 | vals[3] = GetRandomMediumExplosion(); |
| 1015 | vals[4] = obj->roomnum; |
| 1016 | vals[5] = expl_size; |
| 1017 | vals[6] = upwards; |
| 1018 | // Bash some values for billowing explosions |
| 1019 | if ((obj->type == OBJ_BUILDING) && (OBJECT_OUTSIDE(obj))) { |
| 1020 | float norm = ((float)(i + 1)) / extras; |
| 1021 | // norm=1.0-norm; |
| 1022 | vals[3] = GetRandomBillowingExplosion(); |
| 1023 | vals[5] *= (.5 + (.5 * norm)); |
| 1024 | } |
| 1025 | |
| 1026 | CreateNewEvent(0, 0, add_time, vals, sizeof(float) * 7, DoExplosionEvent); |
| 1027 | } |
| 1028 | } |
| 1029 | // Break apart a polygon model into pieces of debris |
| 1030 | void BreakApartModel(object *obj, float explosion_mag, int death_flags) { |
| 1031 | poly_model *pm = GetPolymodelPointer(obj->rtype.pobj_info.model_num); |
no test coverage detected