/** * Creates a new crop entry. * * @param crop_vnum vnum The number to create. * @return crop_data* The new crop's prototype. */ crop_data* create_crop_table_entry(crop_vnum vnum) { void add_crop_to_table(crop_data *crop); crop_data *crop; // sanity if (crop_proto(vnum)) { log("SYSERR: Attempting to insert crop at existing vnum %d", vnum); return crop_proto(vnum); } CREATE(crop, crop_data, 1); init_crop(crop); GET_CROP_VNUM(crop) = vnum; add_crop_to_table(crop); // save index and crop file now save_index(DB_BOOT_CROP); save_library_file_for_vnum(DB_BOOT_CROP, vnum); return crop; }
/** * WARNING: This function actually deletes a crop. * * @param char_data *ch The person doing the deleting. * @param crop_vnum vnum The vnum to delete. */ void olc_delete_crop(char_data *ch, crop_vnum vnum) { void remove_crop_from_table(crop_data *crop); extern const sector_vnum climate_default_sector[NUM_CLIMATES]; obj_data *obj, *next_obj; descriptor_data *desc; struct map_data *map; room_data *room; crop_data *crop; sector_data *base = NULL; int count; if (!(crop = crop_proto(vnum))) { msg_to_char(ch, "There is no such crop %d.\r\n", vnum); return; } if (HASH_COUNT(crop_table) <= 1) { msg_to_char(ch, "You can't delete the last crop.\r\n"); return; } // remove it from the hash table first remove_crop_from_table(crop); // save base sect for later base = sector_proto(climate_default_sector[GET_CROP_CLIMATE(crop)]); // save index and crop file now save_index(DB_BOOT_CROP); save_library_file_for_vnum(DB_BOOT_CROP, vnum); // update world count = 0; LL_FOREACH(land_map, map) { room = real_real_room(map->vnum); if (map->crop_type == crop || (room && ROOM_CROP(room) == crop)) { if (!room) { room = real_room(map->vnum); } set_crop_type(room, NULL); // remove it explicitly change_terrain(room, GET_SECT_VNUM(base)); ++count; } }
/** * * @param room_data *location Where the morph affinity is happening. * @param int morph Which MORPH_x the person is trying to morph into. * @return bool TRUE if the morph passes the affinities check. */ bool morph_affinity_ok(room_data *location, int morph) { int climate = NOTHING; crop_data *cp; bool ok = TRUE; if (ROOM_SECT_FLAGGED(location, SECTF_HAS_CROP_DATA) && (cp = crop_proto(ROOM_CROP_TYPE(location)))) { climate = GET_CROP_CLIMATE(cp); } else { climate = GET_SECT_CLIMATE(SECT(location)); } if (IS_SET(morph_data[(morph)].morph_flags, MORPH_FLAG_TEMPERATE_AFFINITY) && climate != CLIMATE_TEMPERATE) { ok = FALSE; } if (IS_SET(morph_data[(morph)].morph_flags, MORPH_FLAG_ARID_AFFINITY) && climate != CLIMATE_ARID) { ok = FALSE; } if (IS_SET(morph_data[(morph)].morph_flags, MORPH_FLAG_TROPICAL_AFFINITY) && climate != CLIMATE_TROPICAL) { ok = FALSE; } return ok; }