Jump to content
Korean Random
goodman

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

Recommended Posts

В этой теме обсуждаем динамические макросы в Python, делимся опытом и идеями, помогаем друг другу сделать свой клиент идеальным :)
@xvm.export('xvm.total_hp.sign', deterministic=False)
def sign():
    return '<' if panel.total_hp_sign == '<' else '>' 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())

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

<  >

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

Edited by goodman

Share this post


Link to post

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

попробуй вставить Ñ и Ò соответственно

Edited by Kapany3uk

Share this post


Link to post

Short link
Share on other sites
соответственно

точно, спасибо! 

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

Edited by goodman

Share this post


Link to post

Short link
Share on other sites

точно, спасибо! 

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

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

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

def sign():
    return '<' if panel.total_hp_sign == '<' else '>' if panel.total_hp_sign == '>' else '...;'
Edited by Kapany3uk
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

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

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

 

post-10271-0-27068700-1464445527.png 

post-10271-0-24615100-1464445528.png

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

@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
Edited by night_dragon_on

Share this post


Link to post

Short link
Share on other sites

 

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

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

Edited by sirmax

Share this post


Link to post

Short link
Share on other sites

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

Edited by seriych

Share this post


Link to post

Short link
Share on other sites

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

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

 

 

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

Share this post


Link to post

Short link
Share on other sites

 

@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>"
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

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

 

Пока только это смог родить:

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: Прошу прощения за глупый вопрос - с питоном первый раз столкнулся.

Edited by neLeax

Share this post


Link to post

Short link
Share on other sites

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

@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:

(? значение при равенстве хп)

Edited by Kapany3uk
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

@neLeax,

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

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

 

 

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

Edited by Yukikaze
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

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


 

 

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

http://www.koreanrandom.com/forum/topic/16856-дефолтный-конфиг-обсуждение-default-cfg-discussions/page-43#entry324777

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

@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.koreanrandom.com/forum/topic/16856-дефолтный-конфиг-обсуждение-default-cfg-discussions/page-43#entry324777

Спасибо за наводку.

В итоге остановился на твоей формуле - (hpAlly - hpEnemy)/max(hpAlly, hpEnemy)

Во-первых она более простая, а во-вторых сразу выводит "-" если у противников больше ХП.

 

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

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

Share this post


Link to post

Short link
Share on other sites

 

 

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

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

'код'

""" total_hp with editable thresholds for the gradient color change / ХП команд с редактируемыми порогами градиентной смены цвета """

import xvm_battle.python.fragCorrelationPanel as panel

# Values are percentages of the teams_HP within which will change the gradient color (0..100)
# IMPORTANT: maxRatio ≠ minRatio (values should NOT be equal, otherwise will give an error "division by "0")
# Значения процентного отношения ХП команд в пределах которых будет меняться градиент цвета (0..100)
# ВАЖНО: maxRatio ≠ minRatio (значения должны быть НЕ равны, иначе выдаст ошибку "деления на "0")

# Higher the value, the color will remain "neutral"
# Выше этого значения цвет останется нейтральным
maxRatio = 95

# Below this value the color will change completely on the "bad" or "good" (depending on the relationship of teams_hp)
# Ниже этого значения цвет полностью изменится на "bad" или "good" (в зависимости от отношения ХП команд)
minRatio = 65

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

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

@xvm.export('xvm.total_hp.color', deterministic=False)
def color():
    if panel.teams_totalhp[0] < panel.teams_totalhp[1]:
        ratio = max(min((100. * panel.teams_totalhp[0] / panel.teams_totalhp[1] - minRatio) / (maxRatio - minRatio), 1), 0)
        color = panel.color_gradient(panel.hp_colors['neutral'], panel.hp_colors['bad'], ratio)
    elif panel.teams_totalhp[0] > panel.teams_totalhp[1]:
        ratio = max(min((100. * panel.teams_totalhp[1] / panel.teams_totalhp[0] - minRatio) / (maxRatio - minRatio), 1), 0)
        color = panel.color_gradient(panel.hp_colors['neutral'], panel.hp_colors['good'], ratio)
    else:
        color = panel.color_gradient(panel.hp_colors['neutral'], panel.hp_colors['neutral'], 1)
    return color

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

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

Share this post


Link to post

Short link
Share on other sites

 

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

 

я так и не победил выравнивание... в итоге сделал три поля с собственным выравниванием и в каждое вызываю соответствующую функцию

post-10271-0-88767700-1464515688.png post-10271-0-42457100-1464515690.png post-10271-0-87394000-1464515689.png

 

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

Edited by goodman

Share this post


Link to post

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

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

 

 

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

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

Edited by seriych
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...