Initialize a weapon Returns 1 if ok, 0 if error
| 963 | // Initialize a weapon |
| 964 | // Returns 1 if ok, 0 if error |
| 965 | int ObjInitWeapon(object *objp) { |
| 966 | weapon *weap; |
| 967 | int ret = 1; |
| 968 | ASSERT(objp->type == OBJ_WEAPON); |
| 969 | |
| 970 | if (objp->id < 0 || objp->id >= MAX_WEAPONS) |
| 971 | return 0; |
| 972 | |
| 973 | weap = &Weapons[objp->id]; |
| 974 | ASSERT(weap->used > 0); |
| 975 | // Set up shields |
| 976 | objp->shields = 0; |
| 977 | // Set up control info |
| 978 | SetObjectControlType(objp, CT_WEAPON); |
| 979 | // Not tracking anything |
| 980 | objp->ctype.laser_info.track_handle = OBJECT_HANDLE_NONE; |
| 981 | // Set up physics info |
| 982 | objp->movement_type = MT_PHYSICS; |
| 983 | objp->mtype.phys_info.mass = weap->phys_info.mass; |
| 984 | objp->mtype.phys_info.drag = weap->phys_info.drag; |
| 985 | objp->mtype.phys_info.rotdrag = weap->phys_info.rotdrag; |
| 986 | objp->mtype.phys_info.flags = weap->phys_info.flags; |
| 987 | |
| 988 | objp->mtype.phys_info.full_rotthrust = weap->phys_info.full_rotthrust; |
| 989 | objp->mtype.phys_info.full_thrust = weap->phys_info.full_thrust; |
| 990 | objp->mtype.phys_info.rotvel = weap->phys_info.rotvel; |
| 991 | // objp->mtype.phys_info.rot_thrust = weap->phys_info.full_rot_thrust; |
| 992 | objp->mtype.phys_info.wiggle_amplitude = weap->phys_info.wiggle_amplitude; |
| 993 | objp->mtype.phys_info.wiggles_per_sec = weap->phys_info.wiggles_per_sec; |
| 994 | objp->mtype.phys_info.num_bounces = weap->phys_info.num_bounces; |
| 995 | objp->mtype.phys_info.coeff_restitution = weap->phys_info.coeff_restitution; |
| 996 | objp->lifeleft = weap->life_time; |
| 997 | objp->lifetime = weap->life_time; |
| 998 | objp->ctype.laser_info.thrust_left = weap->thrust_time; |
| 999 | objp->ctype.laser_info.last_drop_time = 0; |
| 1000 | objp->mtype.phys_info.hit_die_dot = weap->phys_info.hit_die_dot; |
| 1001 | // Set impact stuff |
| 1002 | objp->impact_size = weap->impact_size; |
| 1003 | objp->impact_time = weap->impact_time; |
| 1004 | objp->impact_player_damage = weap->impact_player_damage; |
| 1005 | objp->impact_generic_damage = weap->impact_generic_damage; |
| 1006 | objp->impact_force = weap->impact_force; |
| 1007 | // Set up a few flags |
| 1008 | objp->mtype.phys_info.flags |= PF_NO_COLLIDE_PARENT; |
| 1009 | objp->flags |= OF_USES_LIFELEFT; |
| 1010 | // Set up rendering info |
| 1011 | objp->render_type = RT_WEAPON; |
| 1012 | |
| 1013 | if (!((weap->flags & WF_IMAGE_BITMAP) || (weap->flags & WF_IMAGE_VCLIP))) { |
| 1014 | objp->rtype.pobj_info.model_num = weap->fire_image_handle; |
| 1015 | objp->rtype.pobj_info.dying_model_num = -1; |
| 1016 | PageInPolymodel(weap->fire_image_handle, OBJ_WEAPON, &weap->size); |
| 1017 | |
| 1018 | objp->rtype.pobj_info.subobj_flags = 0xFFFFFFFF; |
| 1019 | objp->flags |= OF_POLYGON_OBJECT; |
| 1020 | } else if (weap->flags & WF_IMAGE_VCLIP) { |
| 1021 | PageInVClip(weap->fire_image_handle); |
| 1022 | } |
no test coverage detected