/**
* 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;
		}
	}
Example #3
0
/**
*
* @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;
}