Перейти к содержимому

Фото

Динамические макросы в Python


  • Чтобы отвечать, сперва войдите на форум
1413 ответов в теме

#1 goodman

goodman
  • Premium Member
  • 3 557 сообщений
  • Город: Саратов

Опубликовано 28 Май 2016 - 14:57

В этой теме обсуждаем динамические макросы в Python, делимся опытом и идеями, помогаем друг другу сделать свой клиент идеальным :)

@xvm.export('xvm.total_hp.sign', deterministic=False)
def sign():
    return '&lt;' if panel.total_hp_sign == '<' else '&gt;' if panel.total_hp_sign == '>' else panel.total_hp_sign

@xvm.export('xvm.total_hp.text', deterministic=False)
def text():
    return "%6s <font color='#%s'>%s</font> %-6s" % (ally(), color(), sign(), enemy())

а как мне тут выводить другие символы вместо 

&lt;  &gt;

:hmm:   
мне нужны \u00d1 \u00d2


Изменено: goodman, 02 Июнь 2016 - 19:14

  • 0

#2 Kapany3uk

Kapany3uk

    07.10.15 Родилась внучка!

  • Пользователь
  • 2 756 сообщений
  • Nick:Kapany3uk
  • WoT Server:RU (Русский)
  • Город: дер. Осеченки

Опубликовано 28 Май 2016 - 15:06

а как мне тут выводить другие символы вместо  < > ?     мне нужны \u00d1 \u00d2

попробуй вставить &#xD1; и &#xD2; соответственно


Изменено: Kapany3uk, 28 Май 2016 - 15:10

  • 0

#3 goodman

goodman
  • Premium Member
  • 3 557 сообщений
  • Город: Саратов

Опубликовано 28 Май 2016 - 15:14

соответственно

точно, спасибо! 
а как выводится и выводится ли "=" и как подменить? питон не разумею..


Изменено: goodman, 28 Май 2016 - 15:14

  • 0

#4 Kapany3uk

Kapany3uk

    07.10.15 Родилась внучка!

  • Пользователь
  • 2 756 сообщений
  • Nick:Kapany3uk
  • WoT Server:RU (Русский)
  • Город: дер. Осеченки

Опубликовано 28 Май 2016 - 15:20

точно, спасибо! 
а как выводится и выводится ли "=" и как подменить? питон не разумею..

по-моему, знак "=" выводится по-умолчанию.

если нужно вместо него вывести что-то другое, впиши нужный символ в конец строки вместо panel.total_hp_sign (в одинарных кавычках)

def sign():
    return '&lt;' if panel.total_hp_sign == '<' else '&gt;' if panel.total_hp_sign == '>' else '&#x...;'

Изменено: Kapany3uk, 28 Май 2016 - 15:25

  • 1

#5 goodman

goodman
  • Premium Member
  • 3 557 сообщений
  • Город: Саратов

Опубликовано 28 Май 2016 - 15:25

впиши это "другое"

спасибо! попробую. развлекаюсь  как могу :)
 

Прикрепленный файл  мы.PNG   29,24 Кб   0 раз скачано  

Прикрепленный файл  нас.PNG   26,62 Кб   0 раз скачано


  • 1

#6 night_dragon_on

night_dragon_on

    Usus magister est optimus.

  • Premium Member
  • 3 089 сообщений
  • Nick:night_dragon_on
  • WoT Server:RU (Русский)

Опубликовано 28 Май 2016 - 16:20

sirmax, сейчас математические операции (match - сравнение значения) в макросах из внешних скриптов не поддерживаются при форматировании вида:

battleLabelsTemplates.xc

"format": "<font color='{{py:xvm.total_hp.match()=ally_lose?#F50800|#96FF00}}'><b>{{py:xvm.total_hp.ally()}}</b></font>"
"format": "<font color='{{py:xvm.total_hp.match()=enemy_lose?#F50800|#96FF00}}'><b>{{py:xvm.total_hp.enemy()}}</b></font>"
total_hp.py

@xvm.export('xvm.total_hp.match', deterministic=False)
def match():
    return 'ally_lose' if panel.total_hp_sign == '<' else 'enemy_lose' if panel.total_hp_sign == '>' else panel.total_hp_sign

Изменено: night_dragon_on, 28 Май 2016 - 16:21

  • 0

#7 sirmax

sirmax

    [XVM] Разработчик

  •  XVM Team
  • 12 771 сообщений
  • Nick:sirmax2
  • WoT Server:RU (Русский)

Опубликовано 28 Май 2016 - 16:27

 

sirmax, сейчас математические операции (match - сравнение значения) в макросах из внешних скриптов не поддерживаются при форматировании вида:

Проще всего реализовать эту логику непосредственно в питоне.


Изменено: sirmax, 28 Май 2016 - 16:28

  • 0

#8 seriych

seriych

    Всем счастья

  •  XVM Team
  • 7 379 сообщений
  • Nick:seriych
  • WoT Server:RU (Русский)
  • Город: Чайковский/Москва

Опубликовано 28 Май 2016 - 18:30

sirmax,При каждом обращении к питон макросу новая песочница образуется, а как запомнить значение какой-то переменной при первом использовании макроса, чтобы при следующих можно было обратиться к изначальному значению? Вот, например, хочу суммарное хп команд на начало боя запомнить, есть вариант нормальный?


Изменено: seriych, 28 Май 2016 - 18:30

  • 0

#9 sirmax

sirmax

    [XVM] Разработчик

  •  XVM Team
  • 12 771 сообщений
  • Nick:sirmax2
  • WoT Server:RU (Русский)

Опубликовано 28 Май 2016 - 18:35

по идее глобальные переменные должны нормально работать. может ты локальную переменную создаешь?


  • 1

#10 seriych

seriych

    Всем счастья

  •  XVM Team
  • 7 379 сообщений
  • Nick:seriych
  • WoT Server:RU (Русский)
  • Город: Чайковский/Москва

Опубликовано 28 Май 2016 - 19:14

по идее глобальные переменные должны нормально работать. может ты локальную переменную создаешь?
ага, работает, спс
  • 0

#11 Yukikaze

Yukikaze
  •  XVM Team
  • 167 сообщений
  • Nick:AlexMagi
  • WoT Server:RU (Русский)

Опубликовано 28 Май 2016 - 20:21

 

sirmax, сейчас математические операции (match - сравнение значения) в макросах из внешних скриптов не поддерживаются при форматировании вида:

battleLabelsTemplates.xc

"format": "<font color='{{py:xvm.total_hp.match()=ally_lose?#F50800|#96FF00}}'><b>{{py:xvm.total_hp.ally()}}</b></font>"
"format": "<font color='{{py:xvm.total_hp.match()=enemy_lose?#F50800|#96FF00}}'><b>{{py:xvm.total_hp.enemy()}}</b></font>"
total_hp.py

@xvm.export('xvm.total_hp.match', deterministic=False)
def match():
    return 'ally_lose' if panel.total_hp_sign == '<' else 'enemy_lose' if panel.total_hp_sign == '>' else panel.total_hp_sign

А почему бы не так?

@xvm.export('xvm.total_hp.loser_color', deterministic=False)
def match(ally_color, enemy_color):
    return ally_color if panel.total_hp_sign == '<' else enemy_color
"format": "<font color='{{py:xvm.total_hp.loser_color('#F50800', '#96FF00')}}'><b>{{py:xvm.total_hp.ally()}}</b></font>"

  • 1

#12 neLeax

neLeax
  • Пользователь
  • 276 сообщений
  • Nick:neLeax
  • WoT Server:RU (Русский)

Опубликовано 28 Май 2016 - 20:25

Хочу вывести процент, на который лидирующая команда превосходит проигрывающую по ХП.

Пока только это смог родить:
import xvm_battle.python.fragCorrelationPanel as panel

@xvm.export('xvm.total_hp.ally', deterministic=False)
def ally():
    return float(panel.teams_totalhp[0])

@xvm.export('xvm.total_hp.enemy', deterministic=False)
def enemy():
    return float(panel.teams_totalhp[1])

@xvm.export('xvm.total_hp.color', deterministic=False)
def color():
    return panel.total_hp_color

def compare():
    return round(100. - (100. / panel.teams_totalhp[0]) * panel.teams_totalhp[1] , 2)

@xvm.export('xvm.total_hp.superiority', deterministic=False)
def superiority():
    return "<font color='#%s'>%s</font>" % (color(), compare())
Никак не могу сообразить, как записать сравнение - если у союзников больше ХП, то считается по первой формуле:
round(100. - (100. / panel.teams_totalhp[0]) * panel.teams_totalhp[1] , 2)
А если у противников, то по второй:
round(100. - (100. / panel.teams_totalhp[1]) * panel.teams_totalhp[0] , 2)
Знающие люди подскажите.

PS: Прошу прощения за глупый вопрос - с питоном первый раз столкнулся.

Изменено: neLeax, 28 Май 2016 - 20:30

  • 0

#13 Kapany3uk

Kapany3uk

    07.10.15 Родилась внучка!

  • Пользователь
  • 2 756 сообщений
  • Nick:Kapany3uk
  • WoT Server:RU (Русский)
  • Город: дер. Осеченки

Опубликовано 28 Май 2016 - 20:27

А почему бы не так?

@xvm.export('xvm.total_hp.loser_color', deterministic=False)
def match(ally_color, enemy_color):
    return ally_color if panel.total_hp_sign == '<' else enemy_color
"format": "<font color='{{py:xvm.total_hp.loser_color('#F50800', '#96FF00')}}'><b>{{py:xvm.total_hp.ally()}}</b></font>"
а не надо коды цвета местами поменять (или в .ру аргументы enemy/ally)?

как записать сравнение:

попробуй через 'если'
if хп0 > хп1:
формула1
elif хп1 > хп0:
формула2
else:
(? значение при равенстве хп)

Изменено: Kapany3uk, 28 Май 2016 - 20:41

  • 1

#14 Yukikaze

Yukikaze
  •  XVM Team
  • 167 сообщений
  • Nick:AlexMagi
  • WoT Server:RU (Русский)

Опубликовано 28 Май 2016 - 20:39

neLeax,

def compare():
    min_hp = min(panel.teams_totalhp)
    max_hp = max(panel.teams_totalhp)
    return round(100. - (100. / max_hp) * min_hp, 2) 

если я правильно понял задумку

 

 

ЗЫ Для подобных вопросов надо бы раздел запилить


Изменено: Yukikaze, 28 Май 2016 - 20:40

  • 1

#15 seriych

seriych

    Всем счастья

  •  XVM Team
  • 7 379 сообщений
  • Nick:seriych
  • WoT Server:RU (Русский)
  • Город: Чайковский/Москва

Опубликовано 28 Май 2016 - 20:45

Вспомнилось мне тут одно обсужденьице...


Хочу вывести процент, на который лидирующая команда превосходит проигрывающую по ХП.
мы как-то формулу предпочтительную обсуждали. Можешь тут почитать:

http://www.koreanran...-43#entry324777


  • 1

#16 neLeax

neLeax
  • Пользователь
  • 276 сообщений
  • Nick:neLeax
  • WoT Server:RU (Русский)

Опубликовано 28 Май 2016 - 21:30

neLeax,

def compare():
    min_hp = min(panel.teams_totalhp)
    max_hp = max(panel.teams_totalhp)
    return round(100. - (100. / max_hp) * min_hp, 2) 
если я правильно понял задумку

Спасибо, то что и пытался сделать.
 

мы как-то формулу предпочтительную обсуждали. Можешь тут почитать:
http://www.koreanran...-43#entry324777

Спасибо за наводку.
В итоге остановился на твоей формуле - (hpAlly - hpEnemy)/max(hpAlly, hpEnemy)
Во-первых она более простая, а во-вторых сразу выводит "-" если у противников больше ХП.
 

Вспомнилось мне тут одно обсужденьице...

Прикольная идея:) Можешь поделиться кодом? Хочу понять принцип, как подобное реализовывается. Что-то затупил под вечер. Только дошло, что это процент превосходства по очкам прочности, заданный как координата "x".

Изменено: neLeax, 28 Май 2016 - 23:23

  • 0

#17 Kapany3uk

Kapany3uk

    07.10.15 Родилась внучка!

  • Пользователь
  • 2 756 сообщений
  • Nick:Kapany3uk
  • WoT Server:RU (Русский)
  • Город: дер. Осеченки

Опубликовано 29 Май 2016 - 02:20

по идее глобальные переменные должны нормально работать
Предлагаю сделать пороговые значения отношения хп команд для градиентной смены цвета в total_hp редактируемыми (ввести переменные). Давно написал формулу и код в лс Helkar, но до воплощения так и не дошло...

Нужно дополнить total_hp.py верхней и нижней границами диапазона градиентной смены цвета и переписать 'xvm.total_hp.color'

код

  • 0

#18 sirmax

sirmax

    [XVM] Разработчик

  •  XVM Team
  • 12 771 сообщений
  • Nick:sirmax2
  • WoT Server:RU (Русский)

Опубликовано 29 Май 2016 - 08:18

Надо в конфиг эти параметры вынести.
  • 2

#19 goodman

goodman
  • Premium Member
  • 3 557 сообщений
  • Город: Саратов

Опубликовано 29 Май 2016 - 10:40

return "<font color='#%s'>%6s %s %-6s</font>" % (color(), ally(), sign(), enemy())

я так и не победил выравнивание... в итоге сделал три поля с собственным выравниванием и в каждое вызываю соответствующую функцию
Прикрепленный файл  мы.PNG   31,54 Кб   0 раз скачано  Прикрепленный файл  ровно.PNG   29,06 Кб   0 раз скачано  Прикрепленный файл  нас.PNG   29,3 Кб   0 раз скачано
 
'xvm.total_hp.text' вообще удалил из питона

Изменено: goodman, 29 Май 2016 - 10:55

  • 0

#20 seriych

seriych

    Всем счастья

  •  XVM Team
  • 7 379 сообщений
  • Nick:seriych
  • WoT Server:RU (Русский)
  • Город: Чайковский/Москва

Опубликовано 29 Май 2016 - 11:00

Только дошло, что это процент превосходства по очкам прочности, заданный как координата "x"

разве в "x" оно работает?

 

 

'xvm.total_hp.text' вообще удалил из питона

наверное, не стоит трогать дефолтные файлы, лучше свой создавать, ибо если человек будут несколько конфигов пробовать, у него проблемы будут. В идеале грузить питон непосредственно из .xc файла конфига, но хз можно ли это по-нормальному сделать


Изменено: seriych, 29 Май 2016 - 11:01

  • 1





0 пользователей читают эту тему

0 зарегистрированных, 0 гостей, 0 невидимых

© Mr 13