Skip to content

Maxis Spore API

03/11/2009

Random Spore creature

Сейчас мы по быстрому рассмотрим Spore API, который я использую в маленьком проекте. API построена на протоколе REST, постоянно дорабатывается и развивается, и возможности его, хоть и ограничены, но довольно неплохи. Документация пока скудная и частично разбросана по форумам Maxis в ответах разработчиков компании. Вот сводка о Spore API на ProgrammableWeb.


Идея моего мэшапа довольно проста: тянуть случайных существ из Spore API и конвертировать их для использования в Dwarf Fortress. Эдакое космическое сафари с миллионами разнообразных тварей. К сожалению, после конвертации они становятся уже не такими разнообразными. Некоторые вещи из Spore получить невозможно — например список внутренних органов или температуру тела (всё это используется в Dwarf Fortress). Но и с тем что есть вполне можно собирать действующих существ.

Итак, Spore API. REST означает что по определённому URL мы гарантированно получим одно и то же (stateless). Формируя URL мы формируем запрос к API, и получаем в ответе XML. URL для свойств существа будет выглядеть примерно так:

http://www.spore.com/rest/creature/500381669588

500381669588 — ID существа, которое мы получаем например в потоке «лучших существ». И в ответе мы получим следующее:

<creature>
	<status>1</status>
	<input>500381669588</input>
	<cost>2550</cost>
	<health>2.0</health>
	<height>2.2433891</height>
	<meanness>3.0</meanness>
	<cuteness>86.18176</cuteness>
	<sense>1.0</sense>
	<bonecount>34.0</bonecount>
	<footcount>2.0</footcount>
	<graspercount>0.0</graspercount>
	<basegear>0.0</basegear>
	<carnivore>0.0</carnivore>
	<herbivore>1.0</herbivore>
	<glide>5.0</glide>
	<sprint>1.0</sprint>
	<stealth>0.0</stealth>
	<bite>1.0</bite>
	<charge>3.0</charge>
	<strike>0.0</strike>
	<spit>0.0</spit>
	<sing>2.0</sing>
	<dance>0.0</dance>
	<gesture>5.0</gesture>
	<posture>0.0</posture>
</creature>

Никакого названия, описания, владельца (это всё делается другим запросом). Здесь мы получаем только основные параметры существа — количество рук и ног, тип питания, игровые характеристики. Разбирать будем с помощью SimpleXML.

function getCreatureInfo($creatureid) {
	$assetinfoservice= 'http://www.spore.com/rest/creature/' . $creatureid;
	$assetxml = getRestService($assetinfoservice);

	if ($assetxml->status == 0) {
		echo 'Returned asset is inactive' . "<br>\n";
	}

	$asset = array("cost" => $assetxml->cost ,
				 "health" => $assetxml->health ,
				 "height" => $assetxml->height ,
				 "meanness" => $assetxml->meanness ,
				 "cuteness" => $assetxml->cuteness ,
				 "sense" => $assetxml->sense ,

				 "bonecount" => $assetxml->bonecount ,
				 "footcount" => $assetxml->footcount ,
				 "graspercount" => $assetxml->graspercount ,
				 "basegear" => $assetxml->basegear ,

				 "carnivore" => $assetxml->carnivore ,
				 "herbivore" => $assetxml->herbivore ,

				 "glide" => $assetxml->glide ,
				 "sprint" => $assetxml->sprint ,
				 "stealth" => $assetxml->stealth ,

				 "bite" => $assetxml->bite ,
				 "charge" => $assetxml->charge ,
				 "strike" => $assetxml->strike ,
				 "spit" => $assetxml->spit ,

				 "feet" => IntVal($assetxml->footcount),
				 "hand" => IntVal($assetxml->graspercount),

				 "sing" => $assetxml->sing ,
				 "dance" => $assetxml->dance ,
				 "gesture" => $assetxml->gesture ,
				 "posture" => $assetxml->posture  );
	return $asset;
}

Код переделан из примера Spore API для PHP. Функция GetRestService выкачивает файл, меняет его кодировку на UTF-8 и преобразует в объект SimpleXML. Преобразовывать в UTF-8 нужно потому что, как оказалось, некоторые страницы приходят в UTF-16 (в мануале и Spore PHP API об этом не сказано), и SimpleXML не может его преобразовать. Поэтому просто пропускаем полученный XML через mb_encode().

Через Spore API мы можем получать информацию об объектах (существа, здания, машины, НЛО), их модели (т.е. из каких частей и как они собраны), и несколько потоков с возможностью фильтрации: случайные объекты, featured assets (лучшие), объекты конкретного пользователя. К сожалению текстового поиска или поиска по тегам пока нет. Но т.к. API постоянно доделывают, рано или поздно эта функция должна появиться.

Запрос модели выглядит так:

http://static.spore.com/static/model/500/482/316/500482316803.xml

В результате мы получаем огромный XML, содержащий все детали использованные при создании объекта, их позицию и масштаб, и несколько интересных свойств. Отсюда понадобится разве что цвет.

В потоках мы получаем информацию о нескольких объектах сразу — объекты выбранного пользователя или избранные объекты на сегодня. Здесь мы пока коснёмся только свойства modeltype — он означает что именно мы получили. Вот табличка для этого поля:

  • Cell: 0xdfad9f51
  • Creature: 0x9ea3031a
  • TribeCreature: 0x372e2c04
  • CivCreature: 0xccc35c46
  • SpaceCreature: 0x65672ade
  • BuildingCityHall: 0x99e92f05
  • BuildingHouse: 0x4e3f7777
  • BuildingFactory: 0x47c10953
  • BuildingEntertainment: 0x72c49181
  • VehicleMilitaryLand: 0x7d433fad
  • VehicleMilitaryWater: 0x8f963dcb
  • VehicleMilitaryAir: 0x441cd3e6
  • VehicleEconomicLand: 0xf670aa43
  • VehicleEconomicWater: 0x2a5147a9
  • VehicleEconomicAir: 0x1a4e0708
  • VehicleCulturalLand: 0x9ad7d4aa
  • VehicleCulturalWater: 0x1f2a25b6
  • VehicleCulturalAir: 0x449c040f
  • VehicleColonyLand: 0xbc1041e6
  • VehicleColonyWater: 0xc15695da
  • VehicleColonyAir: 0x2090a11b
  • VehicleUFO: 0x98e03c0d

(источник)

Добавить комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: