 |
Zombot (Клиент для игры Зомби ферма) [Обсуждение] - Свободное обсуждение - Ваши идеи, вопросы и ответы на тему браузерных игр и социальных сетей |
04.01.2015, 17:26
|
#3811
|
|
|
|
|
|
Разведчик
|
 Регистрация: 25.02.2013
 Сообщений: 1
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
я и говорю зажрались, без реала, этих коллекций хватает, а если не хватает зб есть много способов чтобы их заиметь не мне вас учить, конечно не накупить теперь рыбаков с мозгами и не заставить ими все острова), хотя и это возможно при фанатизме
|
|
|
|
06.01.2015, 16:30
|
#3812
|
|
|
|
|
|
Разведчик
|
 Регистрация: 22.03.2012
 Сообщений: 3
 Популярность: 12
 Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Ох, как же трудно избавится от хитросплетения классов и упростить код... Но силы пока не покидают меня  connection.py выпилил практически полностью, используя пакет requests.
скоро доберусь до game_types.py, хочу от него избавиться. Надо определиться, в каком виде ворочать данными, может работать просто с json, используя запросы xpath?
Добавлено через 14 минут
Проблемы с юникодом вообще выносят мозг...
Последний раз редактировалось ruslanische; 06.01.2015 в 16:44.
Причина: Добавлено сообщение
|
|
|
|
06.01.2015, 16:55
|
#3813
|
|
|
|
|
|
Разведчик
|
 Регистрация: 17.02.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
|
06.01.2015, 17:07
|
#3814
|
|
|
|
|
|
Разведчик
|
 Регистрация: 22.03.2012
 Сообщений: 3
 Популярность: 12
 Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
|
07.01.2015, 02:11
|
#3815
|
|
|
|
|
|
Разведчик
|
 Регистрация: 29.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
|
07.01.2015, 11:56
|
#3816
|
|
|
|
|
|
Разведчик
|
 Регистрация: 24.03.2013
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
Здравствуйте! Хочу обратиться к Вам за помощью, очень надеюсь, что Вы мне не откажете. На сегодняшний день у меня на руках 4 бота: пиратский, копалка, и две разных сеялки. В каждой из них есть свой функционал, которого нет в других. Все они собраны разными людьми. Спаять в одно целое мне не под силу, поэтому я решил обратиться к Вам. Вы вместе делаете одно большое дело: с одной стороны упрощая игру себе, с другой - познавая программирование на практике в прикладных целях. Вероятно, существует версия программы, объединяющая все возможности в одной сборке, можно у Вас ее попросить?
Поделитесь, пожалуйста, со мной!
P.S. Всех с Новым Годом! |
|
 |
|
 |
|
Можете кинуть копателя?
|
|
|
|
07.01.2015, 14:43
|
#3817
|
|
|
|
|
|
Разведчик
|
 Регистрация: 22.03.2012
 Сообщений: 3
 Популярность: 12
 Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
|
эт правильно, он мне давно не нравится. лишняя писанина.
|
|
 |
|
 |
|
Как писал megabyte0, можно от него избавиться, использую dict as obj, но это тоже костыли. Я просто переделываю на обычный dict (что нативно для питона). Но будет немного топорно смотреться, но мне так почему-то понятнее:
Код:
game_state = self.__game_engine.game_state_new #dict
start_time = time.time()
objects = game_state['params']['event']['gameObjects']
plants = []
for object in objects:
if object['type'] == u'plant':
plants.append(object)
time_1 = time.time()-start_time
self.save_game_state(start_response)
start_time = time.time()
objects2 = self.__game_state_.get_game_loc().get_game_objects()
plants = self.__game_state_.get_game_loc().get_all_objects_by_type(u'plant')
time_2 = time.time()-start_time
Если сравнить скорость, то get_all_objects_by_type() проигрывает в 25 раз простому dict.
Добавлено через 48 минут
Может кто еще подсказать, зачем в классе GameTimer хранится client_time?
Код:
random.seed()
self._client_time = long(random.randrange(2800, 4000))
Нафига? Может какие подводные камни? Вот так можно?
Код:
class GameTimer(object):
def __init__(self):
# время старта клиента
self._start_time = time.time()
# Возвращает время работы бота в милисекундах
def _get_current_client_time(self):
return long((time.time() - self._start_time) * 1000)
def has_elapsed(self, time):
return int(time) <= self._get_current_client_time()
Последний раз редактировалось ruslanische; 07.01.2015 в 15:31.
Причина: Добавлено сообщение
|
|
|
|
08.01.2015, 10:04
|
#3818
|
|
|
|
|
|
Разведчик
|
 Регистрация: 29.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
|
10.01.2015, 17:02
|
#3819
|
|
|
|
|
|
Разведчик
|
 Регистрация: 29.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 8 раз(а) в 5 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
|
Как писал megabyte0, можно от него избавиться, использую dict as obj, но это тоже костыли.
|
|
 |
|
 |
|
Можете пояснить, чем именно? Это тот же dict, по быстродействию где-то в пару раз, но именно! Посмотрите на кодинг.
Куда проще и нативнее поставить точку, чем ворочать [' и '] , это очень неудобно лично мне в процессе кодинга. Больше низачем dict as an obj не нужен, разумеется.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
|
start_time = time.time()
|
|
 |
|
 |
|
time.clock() советуют, точность слегка выше, порядка 1us
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
|
используя пакет requests.
|
|
 |
|
 |
|
Keep-alive будет? Оо, спасибо
Ну Вы опять на C/php пишете? На питоне короче:
Код:
plants=filter(lambda(x):x['type'] == u'plant',objects)
, либо используя ленивые итераторы. Хотя, конечно, никто не мешает писать "сделай так" (4 строчки) вместо "я хочу" (одной), приемлемо и то, и то, разумеется.
А в game_types я уже писал, assertы вставлены. Что меня разок спасало от посылки ереси на сервер. Опять, если правильно кодить, то они не нужны.
И гляньте потом на game_engine.Game.handle_event ? Очень хочется перенести необходимость изменений оттуда в сами реализации потомков BaseActor.
По просьбе выкладываю свой костыль для rects
Используя этот костыль, Вы полностью принимаете, что написан он слишком небезопасно относительно будущих возможных изменений compositions.soc .
Это мы меняем в item_reader, заменяем старые методы полностью, добавляем новые, которые нужно:
Код:
def load(self,filename,url,get_data,file_descr):
last_modified_time = self._getModificationTime(filename)
if not self.__ignore_errors:
data = Connection(url).getChangedDocument(
data=get_data,
last_client_time=last_modified_time
)
else:
while 1:
try:
print 'Download %s...'%file_descr.lower()
data = Connection(url).getChangedDocument(
data=get_data,
last_client_time=last_modified_time
)
print '%s downloaded!'%(file_descr[0].upper()+file_descr[1:].lower())
break
except Exception as e:
print 'Refresh download... '#+'['+(' '*60)+']'+('\b'*61),
## for i in xrange(60):
## time.sleep(20)
## print '\b.',
## print ''
return data
def download(self, filename):
data=self.load(filename,url= 'http://java.shadowlands.ru/zombievk/items',
get_data={'lang': 'ru'},file_descr="items")
with open(filename, 'w') as f:
f.write(data.encode('utf-8'))
def compositions_load(self,filename):
data = self.load(filename, url='http://s.shadowlands.ru/zombievk-res/res/compositions.soc',
get_data=None,file_descr='compositions')
with open(filename, 'wb') as f:
f.write(data)
def compositions_read(self,filename):
with open(filename,'rb') as f:
data=f.read()
data=zlib.decompress(data)
beg_end_table=[]
in_str = '\x20' <= data[0] <= '\x7f'
for i,s in enumerate(data):
in_str_old = in_str
in_str = '\x20' <= s <= '\x7f'
if in_str and not in_str_old:
beg = i
if in_str_old and not in_str:
end = i
if end - beg == ord(data[beg-1]) and end - beg > 1:
beg_end_table.append((data[beg:end],beg,end))
#rects={s:tuple(sum(ord(data[end+4*i+1+(3-j)])<<(j*8) for j in xrange(4)) for i in xrange(4)) for (s,beg,end) in beg_end_table}
rects={s:tuple((-(2**32) if ord(data[end+4*i+1])&0x80 else 0)+sum(ord(data[end+4*i+1+(3-j)])<<(j*8) for j in xrange(4)) for i in xrange(4)) for (s,beg,end) in beg_end_table}
order=['rectX','rectY','rectW','rectH']
for obj in self.content_dict.values():
if 'objAnim' in obj:
obj['rects']=[dict(zip(order,rects[objAnim])) for objAnim in obj['objAnim'] if objAnim in rects]
Это в game_engine.Game.start , меняем 2 верхние строчки из этих четырех на эти четыре
Код:
item_reader.download('items.txt')
item_reader.read('items.txt')
item_reader.compositions_load('compositions.soc')
item_reader.compositions_read('compositions.soc')
И это в connection.Connection.__readContent
эту строчку
Код:
content = content.decode(encoding)
меняем на эти две
Код:
if encoding:
content = content.decode(encoding)
и вроде всё.
, который может помочь при посадке деревьев. Подобная практика вроде уже была.
P.S. Спасибо уважаемому vhyrix за идею просто найти строчку с objAnim в compositions
Последний раз редактировалось megabyte0; 11.01.2015 в 14:07.
Причина: поправлен код compositions_read
|
|
|
|
11.01.2015, 01:16
|
#3820
|
|
|
|
|
|
Разведчик
|
 Регистрация: 04.02.2013
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
|
По просьбе выкладываю свой костыль для rects
|
|
 |
|
 |
|
Что я сделал не так? Не хочет работать
Screenshot_18.jpg
Может что-то в GameItemReader не так ?
PHP код:
from game_state.game_event import dict2obj
import json
import logging
import os
import time
from connection import Connection
import pprint
from settings import Settings
class MyPrettyPrinter(pprint.PrettyPrinter):
def format(self, obj, context, maxlevels, level):
if isinstance(obj, unicode):
return (obj.encode('utf8'), True, False)
return pprint.PrettyPrinter.format(self, obj,
context, maxlevels, level)
class GameItemReader():
def __init__(self):
self.content_dict = {}
settings = Settings()
self.__ignore_errors = settings.get_ignore_errors()
def get(self, item_id):
item_id = str(item_id).lstrip('@')
return dict2obj(self.content_dict[item_id])
def get_name(self, item):
return self.get(item.item).name
def read(self, filename):
with open(filename) as f:
self.contents = json.load(f)
for content in self.contents:
if 'id' not in content:
logging.debug(u"there is no id: %s" % content)
else:
self.content_dict[content['id']] = content
def _getModificationTime(self, filename):
try:
return time.localtime(os.path.getmtime(filename))
except OSError: # no such file
return None
def load(self,filename,url,get_data,file_descr):
last_modified_time = self._getModificationTime(filename)
if not self.__ignore_errors:
data = Connection(url).getChangedDocument(
data=get_data,
last_client_time=last_modified_time
)
else:
while 1:
try:
print 'Download %s...'%file_descr.lower()
data = Connection(url).getChangedDocument(
data=get_data,
last_client_time=last_modified_time
)
print '%s downloaded!'%(file_descr[0].upper()+file_descr[1:].lower())
break
except Exception as e:
print 'Refresh download... '#+'['+(' '*60)+']'+('\b'*61),
## for i in xrange(60):
## time.sleep(20)
## print '\b.',
## print ''
return data
def download(self, filename):
data=self.load(filename,url= 'http://java.shadowlands.ru/zombievk/items',
get_data={'lang': 'ru'},file_descr="items")
with open(filename, 'w') as f:
f.write(data.encode('utf-8'))
def compositions_load(self,filename):
data = self.load(filename, url='http://s.shadowlands.ru/zombievk-res/res/compositions.soc',
get_data=None,file_descr='compositions')
with open(filename, 'wb') as f:
f.write(data)
def compositions_read(self,filename):
with open(filename,'rb') as f:
data=f.read()
data=zlib.decompress(data)
beg_end_table=[]
in_str = '\x20' <= data[0] <= '\x7f'
for i,s in enumerate(data):
in_str_old = in_str
in_str = '\x20' <= s <= '\x7f'
if in_str and not in_str_old:
beg = i
if in_str_old and not in_str:
end = i
if end - beg == ord(data[beg-1]) and end - beg > 1:
beg_end_table.append((data[beg:end],beg,end))
rects={s:tuple(sum(ord(data[end+4*i+1+(3-j)])<<(j*8) for j in xrange(4)) for i in xrange(4)) for (s,beg,end) in beg_end_table}
order=['rectX','rectY','rectW','rectH']
for obj in self.content_dict.values():
if 'objAnim' in obj:
obj['rects']=[dict(zip(order,rects[objAnim])) for objAnim in obj['objAnim'] if objAnim in rects]
class LogicalItemReader(object):
'defines item ids and names that are available to use'
def __init__(self, game_item_reader):
self._item_reader = game_item_reader
def get_avail_names(self, game_state):
return sorted(self.__get_items_available(game_state).keys())
def get_by_name(self, item_name):
items = self.__get_name_to_item()
if item_name in items:
return items[item_name]
def is_item_available(self, item, game_state):
level = game_state.get_state().level
location_id = game_state.get_game_loc().get_location_id()
location = self._item_reader.get(location_id)
allowed_here = (not hasattr(location, 'allowCompositionIds') or \
item.id in location.allowCompositionIds) and \
(not hasattr(item, 'locations') or \
location_id in item.locations)
is_a_type = item.type == self._get_item_type()
allowed_for_level = not hasattr(item, 'level') or item.level <= level
return is_a_type and allowed_here and allowed_for_level
def __get_name_to_item(self):
items = {}
item_ids = self._get_all_item_ids()
for item_id in item_ids:
item = self._item_reader.get(item_id)
items[item.name] = item
return items
def __get_items_available(self, game_state):
items = self.__get_name_to_item()
items = {k: v for k, v in items.iteritems()\
if self.is_item_available(v, game_state)}
return items
def _get_all_item_ids(self):
raise NotImplementedError # inherit and implement
def _get_item_type(self):
raise NotImplementedError # inherit and implement
|
|
|
|
11.01.2015, 01:18
|
#3821
|
|
|
|
|
|
Разведчик
|
 Регистрация: 25.02.2013
 Сообщений: 1
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
|
Что я сделал не так? Не хочет работать
Вложение 60717
Может что-то в GameItemReader не так ?
PHP код:
from game_state.game_event import dict2obj
import json
import logging
import os
import time
from connection import Connection
import pprint
from settings import Settings
class MyPrettyPrinter(pprint.PrettyPrinter):
def format(self, obj, context, maxlevels, level):
if isinstance(obj, unicode):
return (obj.encode('utf8'), True, False)
return pprint.PrettyPrinter.format(self, obj,
context, maxlevels, level)
class GameItemReader():
def __init__(self):
self.content_dict = {}
settings = Settings()
self.__ignore_errors = settings.get_ignore_errors()
def get(self, item_id):
item_id = str(item_id).lstrip('@')
return dict2obj(self.content_dict[item_id])
def get_name(self, item):
return self.get(item.item).name
def read(self, filename):
with open(filename) as f:
self.contents = json.load(f)
for content in self.contents:
if 'id' not in content:
logging.debug(u"there is no id: %s" % content)
else:
self.content_dict[content['id']] = content
def _getModificationTime(self, filename):
try:
return time.localtime(os.path.getmtime(filename))
except OSError: # no such file
return None
def load(self,filename,url,get_data,file_descr):
last_modified_time = self._getModificationTime(filename)
if not self.__ignore_errors:
data = Connection(url).getChangedDocument(
data=get_data,
last_client_time=last_modified_time
)
else:
while 1:
try:
print 'Download %s...'%file_descr.lower()
data = Connection(url).getChangedDocument(
data=get_data,
last_client_time=last_modified_time
)
print '%s downloaded!'%(file_descr[0].upper()+file_descr[1:].lower())
break
except Exception as e:
print 'Refresh download... '#+'['+(' '*60)+']'+('\b'*61),
## for i in xrange(60):
## time.sleep(20)
## print '\b.',
## print ''
return data
def download(self, filename):
data=self.load(filename,url= 'http://java.shadowlands.ru/zombievk/items',
get_data={'lang': 'ru'},file_descr="items")
with open(filename, 'w') as f:
f.write(data.encode('utf-8'))
def compositions_load(self,filename):
data = self.load(filename, url='http://s.shadowlands.ru/zombievk-res/res/compositions.soc',
get_data=None,file_descr='compositions')
with open(filename, 'wb') as f:
f.write(data)
def compositions_read(self,filename):
with open(filename,'rb') as f:
data=f.read()
data=zlib.decompress(data)
beg_end_table=[]
in_str = '\x20' <= data[0] <= '\x7f'
for i,s in enumerate(data):
in_str_old = in_str
in_str = '\x20' <= s <= '\x7f'
if in_str and not in_str_old:
beg = i
if in_str_old and not in_str:
end = i
if end - beg == ord(data[beg-1]) and end - beg > 1:
beg_end_table.append((data[beg:end],beg,end))
rects={s:tuple(sum(ord(data[end+4*i+1+(3-j)])<<(j*8) for j in xrange(4)) for i in xrange(4)) for (s,beg,end) in beg_end_table}
order=['rectX','rectY','rectW','rectH']
for obj in self.content_dict.values():
if 'objAnim' in obj:
obj['rects']=[dict(zip(order,rects[objAnim])) for objAnim in obj['objAnim'] if objAnim in rects]
class LogicalItemReader(object):
'defines item ids and names that are available to use'
def __init__(self, game_item_reader):
self._item_reader = game_item_reader
def get_avail_names(self, game_state):
return sorted(self.__get_items_available(game_state).keys())
def get_by_name(self, item_name):
items = self.__get_name_to_item()
if item_name in items:
return items[item_name]
def is_item_available(self, item, game_state):
level = game_state.get_state().level
location_id = game_state.get_game_loc().get_location_id()
location = self._item_reader.get(location_id)
allowed_here = (not hasattr(location, 'allowCompositionIds') or \
item.id in location.allowCompositionIds) and \
(not hasattr(item, 'locations') or \
location_id in item.locations)
is_a_type = item.type == self._get_item_type()
allowed_for_level = not hasattr(item, 'level') or item.level <= level
return is_a_type and allowed_here and allowed_for_level
def __get_name_to_item(self):
items = {}
item_ids = self._get_all_item_ids()
for item_id in item_ids:
item = self._item_reader.get(item_id)
items[item.name] = item
return items
def __get_items_available(self, game_state):
items = self.__get_name_to_item()
items = {k: v for k, v in items.iteritems()\
if self.is_item_available(v, game_state)}
return items
def _get_all_item_ids(self):
raise NotImplementedError # inherit and implement
def _get_item_type(self):
raise NotImplementedError # inherit and implement
|
|
 |
|
 |
|
импортировать zlib не пробовал?
|
|
|
|
11.01.2015, 01:39
|
#3822
|
|
|
|
|
|
Разведчик
|
 Регистрация: 04.02.2013
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
|
импортировать zlib не пробовал?
|
|
 |
|
 |
|
Спасибо=)) Все оказалось на столько просто!
Добавлено
Влючил посадку
Снова ошибка
fiAcGQ4QM04.jpg
Помогите ее решить)
Добавлено
Старая сажалка, судя по всему не подходит?
PHP код:
# coding=utf-8
import logging
from game_actors_and_handlers.base import BaseActor
from game_state.game_event import dict2obj, obj2dict
import copy
logger = logging.getLogger(__name__)
class TreePlant(BaseActor):
def perform_action(self):
min_money = 150000 # оставляем денег
# Что где сажаем u'FT_CHERRY', u'FT_APPLE', u'FT_MANDARINE', u'FT_SKULL' GROUND
plant_tree = {
#u'main':u'FT_CHERRY', # Домашний
u'isle_03':u'FT_CHERRY', # Любви
u'isle_02':u'FT_CHERRY', # Майя
u'isle_x':u'FT_CHERRY', # X
u'isle_faith':u'FT_CHERRY', # Веры
u'isle_hope':u'FT_CHERRY', # Надежды
u'isle_scary':u'FT_CHERRY', # Страшный
u'isle_alpha':u'FT_CHERRY', # Альфа
u'isle_omega':u'FT_CHERRY', # Омега
u'isle_sand':u'FT_CHERRY', # Песочный
u'isle_polar':u'FT_CHERRY', # Полярной ночи
u'isle_wild':u'FT_CHERRY', # Дремучий
u'isle_mobile':u'FT_CHERRY', # Мобильный
u'isle_ufo':u'FT_CHERRY', # НЛО
u'isle_dream':u'FT_CHERRY', # Мечты
u'isle_scarecrow':u'FT_CHERRY', # Пик Админа
u'isle_elephant':u'FT_CHERRY', # Ужасный
u'isle_emerald':u'FT_CHERRY', # Город Призрак
u'isle_monster':u'FT_CHERRY', # Чудовища
u'isle_halloween':u'FT_CHERRY', # Лысая гора
u'isle_light':u'FT_CHERRY_WHITE', # Вишневый
#
############### Платные ###############
#
u'isle_01':u'FT_CHERRY', # Секретный
u'isle_small':u'FT_CHERRY', # Маленькой ёлочки
u'isle_star':u'FT_CHERRY', # Звездный
u'isle_large':u'FT_CHERRY', # Большой ёлки
u'isle_moon':u'FT_CHERRY', # Лунный
u'isle_giant':u'FT_CHERRY', # Гигантов
u'isle_xxl':u'FT_CHERRY', # Огромной ёлки
u'isle_desert':u'FT_CHERRY', # Необитаемый
################ Подземелья ###########
#u'un_01':u'UN_FERN', #Подножье
#u'un_02':u'UN_FERN', #Пещеры зу
#u'un_05':u'UN_FERN', #Нижнее Днище
#u'un_07':u'UN_FERN', #Хрустальный
#u'un_09':u'UN_FERN', #Склад хакера
}
current_loc = self._get_game_state().get_location_id()
if not current_loc in plant_tree:
#logger.info(u"Пропускаем "+current_loc)
return 1
need = plant_tree [current_loc]
need = self._get_item_reader().get(need)
space_crd = self.space(current_loc, need)
if space_crd == []: return 1
build_cost = self._get_item_reader().get(need.id).buyCoins
next_id = max([_i.maxGameObjectId for _i in self._get_game_state().get_state().locationInfos] +[_m.id for _m in self._get_game_location().get_game_objects()]) + 1
num = 0
buy = []
if space_crd:
for k in space_crd:
if len(k) == 5:
x = int(k[:3])
y = int(k[3:])
elif len(k) == 4:
if current_loc == u'main' and int(k[:2])<13:
x = int(k[:3])
y = int(k[3:])
else:
x = int(k[:2])
y = int(k[2:])
elif len(k) == 2:
x = int(k[:1])
y = int(k[1:])
else:
#if k[0] == '8' or k[0] == '9':
if current_loc != u'main' and (k[0] == '8' or k[0] == '9'):
x = int(k[:1])
y = int(k[1:])
else:
x = int(k[:2])
y = int(k[2:])
if self._get_game_state().get_state().gameMoney > min_money:
num += 1
buy_event = {"x":x,"y":y,"action":"buy","itemId":need.id,"type":"item","objId":next_id}
buy.append(buy_event)
#self._get_events_sender().send_game_events([buy])
self._get_game_state().get_state().gameMoney -= build_cost
#logger.info(u''+str(num)+u" Сажаем "+need.id+u" на X: "+str(x)+u", Y: "+str(y))
self._get_game_state().get_state().gameObjects.append(dict2obj({u'rotate': u'0L', u'fruitingCount': u'25L', u'fertilized': False, u'item': u'@'+need.id, u'jobFinishTime': u'79200000', u'jobStartTime': u'0', u'y': str(y), u'x': str(x), u'type': u'fruitTree', u'id': next_id}))
next_id += 1
if num > 0:
self._get_events_sender().send_game_events(buy)
logger.info(u'Посадили %d %s' %(num,need.id))
def space(self, location, need):
for rect in list(need.rects):
if rect.rectW > 0 and rect.rectH > 0:
need.w = int(rect.rectW)
need.h = int(rect.rectH)
crd, bad_crd = self.get_coords(location)
obj_cache = {}
space_crd = []
"""
file = open('space.txt', 'a')
logger.info(u'Объект crd:')
logger.info(str(obj2dict(crd)).encode('utf-8'))
logger.info(' ')
file.write(u'Объект crd: \n'.encode('utf-8'))
file.write(str(obj2dict(crd))+'\n'.encode('utf-8'))
file.write(u' \n')
file.write(u'Начальные bad_crd: \n'.encode('utf-8'))
file.write(str(obj2dict(bad_crd))+'\n'.encode('utf-8'))
file.write(u' \n')
"""
#перебор объектов на острове
objects = self._get_game_location().get_game_objects()
for object in list(objects):
if not hasattr(object, 'x') or not hasattr(object, 'item'):
continue
x = object.x
y = object.y
if not object.item in obj_cache:
object_item = self._get_item_reader().get(object.item)
obj_cache[object.item] = object_item
else:
object_item = obj_cache[object.item]
sms = u'Занято '+object_item.name+str(x)+' '+str(y)+u' размеры: '+str(object_item.rects)+'\n'
#file.write(sms.encode('utf-8'))
for rect in list(object_item.rects):
h = rect.rectH
if rect.rectX < 0:
x = int(x) + rect.rectX
w = rect.rectW + (rect.rectX*-1)
else:
w = rect.rectW + rect.rectX
if rect.rectY < 0:
y = int(y) + rect.rectY
h = rect.rectH + (rect.rectY*-1)
else:
h = rect.rectH + rect.rectY
for ix in range(w):
for iy in range(h):
k = str(int(x) + ix)+''+str(int(y) + iy)
if not k in bad_crd:
bad_crd.append(k)
"""
logger.info(u'Добавляем занятые координаты '+str(x)+' '+str(ix)+' '+str(y)+' '+str(iy)+' : '+k)
sms = u'Добавляем занятые координаты '+str(x)+' '+str(ix)+' '+str(y)+' '+str(iy)+' : '+k+'\n'
file.write(sms.encode('utf-8'))
"""
"""
#logger.info(str(obj2dict(bad_crd)).encode('utf-8'))
file.write(u'Полные bad_crd: \n'.encode('utf-8'))
file.write(str(obj2dict(bad_crd))+'\n'.encode('utf-8'))
file.write(u' \n')
"""
W = crd['x2'] - crd['x1'] - need.w + 2
H = crd['y2'] - crd['y1'] - need.h + 2
for iw in range(W):
iw += crd['x1']
for ih in range(H):
ih += crd['y1']
if (str(iw)+''+str(ih)) in bad_crd: #занято
continue
good = 1
add = []
for ix in range(need.w):
for iy in range(need.h):
k = str(iw+ix)+''+str(ih+iy)
if k in bad_crd: #занято
good = 0
break
else:
add.append(k)
if good == 0:
break
if good == 1:
#logger.info(u'Свободные '+need.id+u' на X: '+str(iw)+u', Y: '+str(ih))
space_crd.append(str(iw)+''+str(ih))
bad_crd.extend(add)
"""
logger.info('Свободные координаты установки:')
logger.info(str(obj2dict(space_crd))+'\n'.encode('utf-8'))
logger.info(' ')
file.write(u'Свободные координаты установки: \n'.encode('utf-8'))
file.write(str(obj2dict(space_crd))+'\n'.encode('utf-8'))
file.write(u' \n')
"""
return space_crd
def get_coords(self, ostrov):
# Map isle_01 Веры, Мечты
if(ostrov in ['isle_dream', 'isle_faith']):
map = [ str(i)+''+str(j) for i in range(14,16) for j in range(14,16)]
add = [ str(i)+''+str(j) for i in range(12,14) for j in range(14,64)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(12,18) for j in range(74,76)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(40,82) for j in range(74,76)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(82,84) for j in range(72,76)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(82,84) for j in range(14,22)]
map.extend(add)
return {'x1':12, 'x2':83, 'y1':14, 'y2':75}, map
# Map world Домашний
if(ostrov in ['main']):
map = [ str(i)+''+str(j) for i in range(48,62) for j in range(12,48)]
add = [ str(i)+''+str(j) for i in range(54,60) for j in range(48,100)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(62,112) for j in range(30,48)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(14,62) for j in range(0,12)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(112,128) for j in range(30,112)]
map.extend(add)
return {'x1':14, 'x2':127, 'y1':0, 'y2':99}, map
# Map isle_02 Альфа, Омега, Пик Админа, Ужасный, Чудовища, Майя, звёздный, гигантов
if(ostrov in ['isle_alpha', 'isle_omega', 'isle_scarecrow', 'isle_elephant', 'isle_monster', 'isle_02', 'isle_star', 'isle_giant']):
map = [ str(i)+''+str(j) for i in range(10,12) for j in range(10,12)]
add = [ str(i)+''+str(j) for i in range(10,12) for j in range(42,44)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(42,44) for j in range(42,44)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(42,44) for j in range(10,12)]
map.extend(add)
return {'x1':10, 'x2':43, 'y1':10, 'y2':43}, map
# Map isle_03 Любви, X, Песочный, Необитаемый
if(ostrov in ['isle_03', 'isle_x', 'isle_sand', 'isle_desert']):
map = []
return {'x1':16, 'x2':65, 'y1':14, 'y2':71}, map
# Map isle_04 Надежды, Страшный
if(ostrov in ['isle_hope', 'isle_scary']):
map = [ str(i)+''+str(j) for i in range(12,14) for j in range(12,14)]
add = [ str(i)+''+str(j) for i in range(46,50) for j in range(12,14)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(48,50) for j in range(34,42)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(48,50) for j in range(72,74)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(12,20) for j in range(72,74)]
map.extend(add)
return {'x1':12, 'x2':49, 'y1':12, 'y2':73}, map
# Map isle_05 Город-призрак, Секретный
if(ostrov in ['isle_emerald', 'isle_01']):
map = [ str(i)+''+str(j) for i in range(16,20) for j in range(12,16)]
add = [ str(i)+''+str(j) for i in range(70,72) for j in range(30,38)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(70,72) for j in range(70,72)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(16,18) for j in range(64,72)]
map.extend(add)
return {'x1':16, 'x2':71, 'y1':12, 'y2':71}, map
# Map isle_snow1 Дремучий, Мобильный, Маленькой ёлочки, Огромной ёлки
if(ostrov in ['isle_wild', 'isle_mobile', 'isle_small', 'isle_xxl']):
map = [ str(i)+''+str(j) for i in range(8,12) for j in range(6,8)]
add = [ str(i)+''+str(j) for i in range(8,10) for j in range(8,10)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(42,46) for j in range(6,8)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(44,46) for j in range(8,10)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(44,46) for j in range(42,46)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(42,44) for j in range(44,46)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(8,10) for j in range(44,46)]
map.extend(add)
return {'x1':8, 'x2':45, 'y1':6, 'y2':45}, map
# Map isle_snow2 Полярной ночи, НЛО, Лысая гора, Большой ёлки, Лунный, Вишнёвый
if(ostrov in ['isle_polar', 'isle_ufo', 'isle_halloween', 'isle_large', 'isle_moon', 'isle_light']):
map = [ str(i)+''+str(j) for i in range(8,12) for j in range(6,10)]
add = [ str(i)+''+str(j) for i in range(8,10) for j in range(44,46)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(42,46) for j in range(44,46)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(44,46) for j in range(42,44)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(42,46) for j in range(6,8)]
map.extend(add)
add = [ str(i)+''+str(j) for i in range(44,46) for j in range(8,10)]
map.extend(add)
return {'x1':8, 'x2':45, 'y1':6, 'y2':45}, map
# Map underground_02 Склад Хакера , Подножье, Нижнее Днище, Хрустальный
if(ostrov in ['un_01', 'un_02', 'un_05', 'un_07', 'un_09']):
map = []
return {'x1':14, 'x2':53, 'y1':16, 'y2':73}, map
Последний раз редактировалось Shurup240; 11.01.2015 в 02:38.
|
|
|
|
11.01.2015, 02:42
|
#3823
|
|
|
|
|
|
Разведчик
|
 Регистрация: 29.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 8 раз(а) в 5 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Скорее несогласование того, что я понимаю под rects и того, что понимают разрабы. У меня с моим использованием rects[obj.rotate] всё работает на ура. А здесь как-то хитрее сделано, for rect in rects и т д.
Кто-нибудь подскажет, как должно быть?  Ну или хотя бы на чём вылетает, на каком item 
Нужно, видимо, чтобы 31й бит считался знаковым.
Код:
rects={s:tuple((-(2**32) if ord(data[end+4*i+1])&0x80 else 0)+sum(ord(data[end+4*i+1+(3-j)])<<(j*8) for j in xrange(4)) for i in xrange(4)) for (s,beg,end) in beg_end_table}
вместо аналогичной строки выше, хотя есть стандратные средства.
Последний раз редактировалось megabyte0; 11.01.2015 в 04:35.
|
|
|
|
11.01.2015, 11:58
|
#3824
|
|
|
|
|
|
Разведчик
|
 Регистрация: 17.02.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
|
11.01.2015, 13:54
|
#3825
|
|
|
|
|
|
Разведчик
|
 Регистрация: 29.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 8 раз(а) в 5 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Последний раз редактировалось megabyte0; 11.01.2015 в 14:24.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 12:00.
|
 |