// LP addition: animator void animate_items() { object_data *object; ix object_index; for (object_index= 0, object= objects; object_index < MAXIMUM_OBJECTS_PER_MAP; ++object_index, ++object) { if (SLOT_IS_USED(object) && GET_OBJECT_OWNER(object)==_object_is_item && !OBJECT_IS_INVISIBLE(object)) { auto type = object->permutation; if (get_item_kind(type) != NONE) { item_definition *ItemDef = get_item_definition(type); // LP change: added idiot-proofing if (!ItemDef) continue; shape_descriptor shape = ItemDef->base_shape; shape_animation_data *animation= get_shape_animation_data(shape); if (!animation) continue; // Randomize if non-animated; do only once if (object->facing >= 0) { if (randomize_object_sequence(object_index,shape)) { object->facing = NONE; } } // Now the animation if (object->facing >= 0) animate_object(object_index); } } } }
short count_inventory_lines(short player_index) { player_data *player= get_player_data(player_index); bool types[NUMBER_OF_ITEM_TYPES]; short count= 0; short loop; /* Clean out the header array, so we can count properly */ for(loop = 0; loop < NUMBER_OF_ITEM_TYPES; ++loop) types[loop]= false; for(loop = 0; loop<NUMBER_OF_DEFINED_ITEMS; ++loop) { if (loop==_i_knife) continue; if (player->items[loop] != NONE) { count++; types[get_item_kind(loop)]= true; } } /* Now add in the header lines.. */ for(loop= 0; loop<NUMBER_OF_ITEM_TYPES; ++loop) { if(types[loop]) count++; } return count; }
bool unretrieved_items_on_map() { bool found_item = false; object_data *object; short object_index; for (object_index= 0, object= objects; object_index<MAXIMUM_OBJECTS_PER_MAP; ++object_index, ++object) { if (SLOT_IS_USED(object) && GET_OBJECT_OWNER(object)==_object_is_item) { if (get_item_kind(object->permutation)==_item) { found_item= true; break; } } } return found_item; }
void mark_player_inventory_as_dirty( short player_index, short dirty_item) { struct player_data *player= get_player_data(player_index); /* If the dirty item is not NONE, then goto that item kind display.. */ if(dirty_item != NONE) { short item_kind= get_item_kind(dirty_item); short current_screen= GET_CURRENT_INVENTORY_SCREEN(player); /* Don't change if it is a powerup, or you are in the network statistics screen */ if(item_kind != _powerup && item_kind != current_screen) // && current_screen!=_network_statistics) { /* Goto that type of item.. */ set_current_inventory_screen(player_index, item_kind); } } SET_INVENTORY_DIRTY_STATE(player, TRUE); }
void calculate_player_item_array(short player_index, short type, short *items, short *counts, short *array_count) { player_data *player = get_player_data(player_index); short count= 0; for(ix loop = 0; loop < NUMBER_OF_DEFINED_ITEMS; ++loop) { if (loop==_i_knife) continue; if(player->items[loop] != NONE) { if(get_item_kind(loop)==type) { items[count]= loop; counts[count]= player->items[loop]; count++; } } } *array_count= count; }
static int Lua_ItemType_Get_Ball(lua_State *L) { lua_pushboolean(L, (get_item_kind(Lua_ItemType::Index(L, 1)) == _ball)); return 1; }
void handle_keyword(int tag) { bool cheated= true; switch (tag) { case _tag_health: if (local_player->suit_energy<PLAYER_MAXIMUM_SUIT_ENERGY) { local_player->suit_energy= PLAYER_MAXIMUM_SUIT_ENERGY; } else { if (local_player->suit_energy<2*PLAYER_MAXIMUM_SUIT_ENERGY) { local_player->suit_energy= 2*PLAYER_MAXIMUM_SUIT_ENERGY; } else { local_player->suit_energy= MAX(local_player->suit_energy, 3*PLAYER_MAXIMUM_SUIT_ENERGY); } } mark_shield_display_as_dirty(); break; case _tag_oxygen: local_player->suit_oxygen= MAX(local_player->suit_oxygen,PLAYER_MAXIMUM_SUIT_OXYGEN); mark_oxygen_display_as_dirty(); break; case _tag_map: dynamic_world->game_information.game_options^= (_overhead_map_shows_items|_overhead_map_shows_monsters|_overhead_map_shows_projectiles); break; case _tag_invincible: process_player_powerup(local_player_index, _i_invincibility_powerup); break; case _tag_invisible: process_player_powerup(local_player_index, _i_invisibility_powerup); break; case _tag_infravision: process_player_powerup(local_player_index, _i_infravision_powerup); break; case _tag_extravision: process_player_powerup(local_player_index, _i_extravision_powerup); break; case _tag_jump: accelerate_monster(local_player->monster_index, WORLD_ONE/10, 0, 0); break; // LP: changed these cheats and added new ones: case _tag_pistol: AddOneItemToPlayer(_i_magnum,2); AddItemsToPlayer(_i_magnum_magazine,10); break; case _tag_rifle: AddItemsToPlayer(_i_assault_rifle,10); AddItemsToPlayer(_i_assault_rifle_magazine,10); AddItemsToPlayer(_i_assault_grenade_magazine,10); break; case _tag_missile: AddItemsToPlayer(_i_missile_launcher,1); AddItemsToPlayer(_i_missile_launcher_magazine,10); break; case _tag_toaster: AddItemsToPlayer(_i_flamethrower,1); AddItemsToPlayer(_i_flamethrower_canister,10); break; case _tag_fusion: AddItemsToPlayer(_i_plasma_pistol,1); AddItemsToPlayer(_i_plasma_magazine,10); break; case _tag_pzbxay: AddItemsToPlayer(_i_alien_shotgun,1); break; case _tag_shotgun: AddOneItemToPlayer(_i_shotgun,2); AddItemsToPlayer(_i_shotgun_magazine,10); break; case _tag_smg: AddOneItemToPlayer(_i_smg,2); AddItemsToPlayer(_i_smg_ammo,10); break; case _tag_save: save_game(); break; // LP guess as to what might be good: ammo-only version of "aslag" case _tag_ammo: { short items[]= { _i_assault_rifle, _i_magnum, _i_missile_launcher, _i_flamethrower, _i_plasma_pistol, _i_alien_shotgun, _i_shotgun, _i_assault_rifle_magazine, _i_assault_grenade_magazine, _i_magnum_magazine, _i_missile_launcher_magazine, _i_flamethrower_canister, _i_plasma_magazine, _i_shotgun_magazine, _i_shotgun, _i_smg, _i_smg_ammo}; for(unsigned index= 0; index<sizeof(items)/sizeof(short); ++index) { switch(get_item_kind(items[index])) { case _ammunition: AddItemsToPlayer(items[index],10); break; } } } break; case _tag_aslag: { // LP change: added the SMG and its ammo short items[]= { _i_assault_rifle, _i_magnum, _i_missile_launcher, _i_flamethrower, _i_plasma_pistol, _i_alien_shotgun, _i_shotgun, _i_assault_rifle_magazine, _i_assault_grenade_magazine, _i_magnum_magazine, _i_missile_launcher_magazine, _i_flamethrower_canister, _i_plasma_magazine, _i_shotgun_magazine, _i_shotgun, _i_smg, _i_smg_ammo}; for(unsigned index= 0; index<sizeof(items)/sizeof(short); ++index) { switch(get_item_kind(items[index])) { case _weapon: if(items[index]==_i_shotgun || items[index]==_i_magnum) { AddOneItemToPlayer(items[index],2); } else { AddItemsToPlayer(items[index],1); } break; case _ammunition: AddItemsToPlayer(items[index],10); break; case _powerup: case _weapon_powerup: break; default: break; } process_new_item_for_reloading(local_player_index, items[index]); } } local_player->suit_energy = MAX(local_player->suit_energy, 3*PLAYER_MAXIMUM_SUIT_ENERGY); update_interface(NONE); break; default: cheated= false; break; } // / can't use computer terminals or save in the final version if we've cheated // if (cheated) SET_PLAYER_HAS_CHEATED(local_player); #if 0 if (cheated) { long final_ticks; SetSoundVol(7); play_local_sound(20110); Delay(45, &final_ticks); play_local_sound(20110); Delay(45, &final_ticks); play_local_sound(20110); } #endif return; }
short new_item(struct object_location *location,short type) { short object_index; item_definition *definition= get_item_definition(type); // LP change: added idiot-proofing if (!definition) return false; bool add_item = true; assert(sizeof(item_definitions)/sizeof(struct item_definition)==NUMBER_OF_DEFINED_ITEMS); /* Do NOT add items that are network-only in a single player game, and vice-versa */ if (dynamic_world->player_count>1) { if (definition->invalid_environments & _environment_network) add_item = false; if (get_item_kind(type)==_ball && !current_game_has_balls()) add_item = false; } else { if (definition->invalid_environments & _environment_single_player) add_item= false; } if (add_item) { /* add the object to the map */ object_index= new_map_object(location, definition->base_shape); if (object_index!=NONE) { object_data *object= get_object_data(object_index); // LP addition: using the facing direction as a flag in the "unanimated" case: // will be initially zero, but will become nonzero when initialized, // so that the shape randomization will be done only once. SET_OBJECT_OWNER(object, _object_is_item); object->permutation= type; if ((location->flags&_map_object_is_network_only) && dynamic_world->player_count<=1) { SET_OBJECT_INVISIBILITY(object, true); object->permutation= NONE; } else if ((get_item_kind(type) == _ball) && !static_world->ball_in_play) { static_world->ball_in_play = true; SoundManager::instance()->PlayLocalSound(_snd_got_ball); } /* let PLACEMENT.C keep track of how many there are */ object_was_just_added(_object_is_item, type); // and let Lua know too L_Call_Item_Created(object_index); } } else object_index = NONE; return object_index; }