Jump to content
Korean Random
goodman

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

Recommended Posts

дай поиграть, дядь, а?

теперь только завтра, да и играться там не чем.

 

 

вот если что случай интересный по дамаг логу попался,
, ага, пригодится. 
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Наработки damageLog:

Так как в battleLabelsTemplates.xc пока нет подходящего события, сделал так (по идее надо сделать выравнять по нижнему краю экрана, у меня разрешение 1920х1200):

    "DamageLog": {
      "enabled": true,
      "updateEvent": "ON_EVERY_SECOND",
      "x": -200,
      "y": 967,
      "width": 500,
      "height": 300,
      "screenHAlign": "center",
      "shadow": { "align": "center", "distance": 1, "angle": 90, "alpha": 80, "blur": 5, "strength": 3 },
      "textFormat": { "color": "0xF4EFE8", "size": 16 },
      "format": "{{py:xvm.myDamageLog.dLog()}}"
    },  
    

В xvm.py добавил:

from xvm import myDamageLog

@xvm.export('xvm.myDamageLog.dLog', deterministic=False)
def myDamageLog_dLog():
    return myDamageLog.dLog()

И создал файл \py_macro\xvm\myDamageLog.py:

import BigWorld
from items import vehicles
from Avatar import PlayerAvatar
from Vehicle import Vehicle
from xfw import *
from VehicleEffects import DamageFromShotDecoder


class DamageLog(object):
    def __init__(self):
        self.i = 0
        self.msg = ''
        self.oldHealth = None
        self.CriticalHit = ''

    def reset(self):
        self.i = 0
        self.msg = ''
        self.oldHealth = None
        self.CriticalHit = ''

    def showDamageFromShot(self, vehicle, attackerID, points, effectsIndex, damageFactor):
        hitEffectCodes = {0: 'рикошет', 1: 'рикошет', 2: 'не пробито', 3: 'без урона', 4: 'урон', 5: 'крит'}
        if vehicle.isPlayerVehicle:
            maxHitEffectCode, decodedPoints = DamageFromShotDecoder.decodeHitPoints(points, vehicle.typeDescriptor)
            self.CriticalHit = '*' if maxHitEffectCode == 5 else ''
            playerAvatar = BigWorld.player()
            attacker = playerAvatar.arena.vehicles.get(attackerID)
            if maxHitEffectCode < 4:
                self.i += 1
                s = "<textformat tabstops='[40,130]'>[%s]<tab>%s<tab>%s</textformat>" % (self.i, hitEffectCodes[maxHitEffectCode], attacker['vehicleType'].type.shortUserString)
                self.msg = s + '\n' + self.msg
            elif self.CriticalHit and (damageFactor == 0):
                self.i += 1
                s = "<textformat tabstops='[40,130]'>[%s]<tab>%s%s<tab>%s</textformat>" % (self.i, 'без урона', self.CriticalHit, attacker['vehicleType'].type.shortUserString)
                self.msg = s + '\n' + self.msg


    def onHealthChanged(self, vehicle, newHealth, attackerID, attackReasonID):
        if vehicle.isPlayerVehicle:
            playerAvatar = BigWorld.player()
            attacker = playerAvatar.arena.vehicles.get(attackerID)
            damage = self.oldHealth - newHealth
            self.oldHealth = newHealth
            self.i += 1
            s = "<textformat tabstops='[40,130]'>[%s]<tab>%s%s<tab>%s</textformat>" % (self.i, damage, self.CriticalHit, attacker['vehicleType'].type.shortUserString)
            self.msg = s + '\n' + self.msg


    def onEnterWorld(self, vehicle, prereqs):
        if vehicle.isPlayerVehicle:
            self.oldHealth = vehicle.health

data = DamageLog()



@registerEvent(Vehicle, 'onHealthChanged')
def onHealthChanged(self, newHealth, attackerID, attackReasonID):
    data.onHealthChanged(self, newHealth, attackerID, attackReasonID)


@registerEvent(Vehicle, 'onEnterWorld')
def onEnterWorld(self, prereqs):
    data.onEnterWorld(self, prereqs)


@registerEvent(Vehicle, 'showDamageFromShot')
def showDamageFromShot(self, attackerID, points, effectsIndex, damageFactor):
    data.showDamageFromShot(self, attackerID, points, effectsIndex, damageFactor)


@registerEvent(PlayerAvatar, '_PlayerAvatar__destroyGUI')
def destroyGUI(self):
    data.reset()


def dLog():
   return '%s' % (data.msg) 

 

Вот что получилось:

post-17624-0-44858100-1472150772_thumb.jpg

Это пока наброски, тут нет обработки взрывов.


P.S. репелеи, с неадекватным поведением damageLog, приветствуются.

  • Upvote 7

Share this post


Link to post

Short link
Share on other sites

Наработки damageLog:

в battleLabelsTemplates.xc 

В xvm.py добавил:

И создал файл \py_macro\xvm\myDamageLog.py:

Вот что получилось:

xvm.log

что я сделал неправильно?

Edited by vlad_cs_sr

Share this post


Link to post

Short link
Share on other sites

attachicon.gifxvm.log

что я сделал неправильно?

Кодировка файла myDamageLog.py должна быть UTF-8.

 

Ну и за одно напомню, что надо добавить ссылку в battleLabels.xc:

${ "battleLabelsTemplates.xc":"def.DamageLog" }
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

 

Кодировка файла myDamageLog.py должна быть UTF-8.

тю, блин.. забыл про то

Share this post


Link to post

Short link
Share on other sites

@demon2597, Может стоит добавить символы в шрифт "xvm" для отображения типов урона (для damageLog):

ATTACK_REASONS = ('shot', 'fire', 'ramming', 'world_collision', 'death_zone', 'drowning', 'gas_attack', 'overturn') 

P.S. Можно не для всех.

Edited by ktulho

Share this post


Link to post

Short link
Share on other sites
'shot', 'fire', 'ramming', 'world_collision', 'overturn' 

О_о... как бы оно уже давным давно там есть. по порядку:

P  Q  R  S  Ē

плюс артудар Đ  авиаудар đ

остальное вроде не нужно

Edited by demon2597

Share this post


Link to post

Short link
Share on other sites

О_о... как бы оно уже давным давно там есть. по порядку:

P  Q  R  S  Ē

плюс артудар Đ  авиаудар đ

остальное вроде не нужно

Ааа, понятно.

Share this post


Link to post

Short link
Share on other sites

попутно вопрос, настройку лога планируется выносить в конфиг? скрытая настройка в ру- это не фонтан. это во-первых. во-вторых, чтобы можно было очень гибко настраивать, нужна система как была у Гамбитера- все используемые макросы задаваемые, с возможностью использования макроса в макросе и размножения макросов (могу дать в качестве примера свой старый конфиг). в-третьих, возможно стоит подождать что запилят на эту тему ВГ, может от готового легче было бы плясать.

Share this post


Link to post

Short link
Share on other sites

 

 

попутно вопрос, настройку лога планируется выносить в конфиг? скрытая настройка в ру- это не фонтан. это во-первых. во-вторых, чтобы можно было очень гибко настраивать, нужна система как была у Гамбитера- все используемые макросы задаваемые, с возможностью использования макроса в макросе и размножения макросов (могу дать в качестве примера свой старый конфиг).
, 1) да; 2)  лучше скриншот.

 

 

в-третьих, возможно стоит подождать что запилят на эту тему ВГ, может от готового легче было бы плясать.
, возможно легче, но я пока потренируюсь.)
  • Upvote 4

Share this post


Link to post

Short link
Share on other sites
возможно легче, но я пока потренируюсь.)

ну тоже верно) 

лучше скриншот

скриншотом наверное не получится, попробую объяснить на примере. сразу сорь за длиннопост.

вот у нас есть формат строки лога:

"text" : "<textformat tabstops='[16,90,123,161,184]'><font face='$FieldFont' color='{teamAttackerC}' size='13'>{numberLog}<tab>{reasonHit}<tab>{typesHit}<tab>({damagesRatio}%)<tab>{teamAttacker1}</font></textformat>"

на первый взгляд всё просто, но на самом деле здесь заложена куча всяких условий. начнем с цвета {teamAttackerC}. прежде всего это макрос является производной или размножением стандартного {teamAttacker}- команда атаковавшего игрока, который имеет следующие значения:

"teamAttacker" : {

   "enemy" : "", // противник

   "ally" : "", // союзник

   "player" : "", // игрок

   "None" : "" // нет данных

  }

, просто добавили буковку к названию стандартного и получился кастомный дубль, но в нем можно задать уже нечто другое, в данном случае цвет:

"teamAttackerC" : {

   "enemy" : "{costShellC}", // противник

   "ally" : "#00EAFF", // союзник

   "player" : "{costShellC}", // игрок

   "None" : "{costShellC}" // нет данных

  }, 

таких дублей (производных) можно наделать сколько душе угодно.

как видно, в {teamAttackerC} для всех кроме врагов используется вложенный макрос {costShellC}, это опять же кастомная производная от стандартного {costShell}- цена снаряда и опять с целью задать цвета. вот сам стандартный макрос и его производная:

/** Тип снаряда по стоимости, которым было произведено попадание. */

  "costShell" : {

   "credits" : "кредиты", // снаряд, приобретенный за кредиты

   "gold" : "золото", // снаряд, приобретенный за золото

   "None" : "н/д" // нет данных

  },

  "costShellC" : {

   "credits" : "#F2F2F2", // снаряд, приобретенный за кредиты

   "gold" : "#FFE1A6", // снаряд, приобретенный за золото

   "None" : "#F2F2F2" // нет данных

  }.

как итог- строка лога будет красится по типу снаряда, если урон нанесен всеми кроме союзника, в его случае строка будет краситься в цвет тимкиллера #00EAFF.

 

дальше возьмем например для разбора использующийся в строке лога макрос {typesHit}, он стандартный, ему присвоены следующие пользовательские значения:

/** Изменение HP игрока. */

  "typesHit" : {

   "damage" : "-{damagesHit}", // уменьшение (урон)

   "nodamage" : "{indexHit}"   // без изменений (без урона)

  },

для случая с уроном будет получаться просто "-урон", -220 например. вот то, что задано для {damagesHit}:

/** Количество полученного игроком урона (просуммированного при пожаре, таране, падении). */

  "damagesHit" : {

   "None" : "0" // нет данных

  },

то есть он будет просто отдавать цифру урона, если иное не оговорено. но можно например сделать следующее:

/** Количество полученного игроком урона (просуммированного при пожаре, таране, падении). */

  "damagesHit" : {

   "1000" : "вот жопа!", // текст при получении 1000 единиц урона

   "None" : "0" // нет данных

  }.

с этим ладно, здесь интереснее второй для {typesHit}- значение "nodamage" : "{indexHit}"   // без изменений (без урона). в свою очередь оно ведет нас к макросу {indexHit}, для которого задано:

/** Тип полученного игроком попадания. */

  "indexHit" : {

   "ricochet" : "  р-т", // рикошет

   "armor" : "  н/п", // не пробито

   "resisted" : "  б/у", // без урона

   "damage" : "", // пробитие с уроном

   "None" : "н/д" // нет данных

  },

здесь видно, что "damage" оставлен пустым, это потому что, как видно выше, попадание с уроном учитывается в {typesHit} отдельно.

итого в итоге на месте {typesHit} строки лога при попадании с уроном мы будем иметь величину этого урона с минусом, а при попадании без урона- аббревиатуру типа попадания.

 

в макрос можно писать что угодно, хоть целое выражение с кучей других макросов. вот например чему равен {teamAttacker1} из строки лога (в свою очередь являющийся еще одной производной от {teamAttacker}, про который говорилось выше):

"teamAttacker1" : {

   "enemy" : "{typeShell}<tab><font size='20'>{classVehicle}</font>  {shortVehicle}", // противник

   "ally" : "{typeShell}<tab><font size='20'>{classVehicle}</font>  {shortVehicle}", // союзник

   "player" : "самоурон", // игрок

   "None" : "" // нет данных

  },

это значит, что в случае нанесения урона всеми кроме самого себя мы получим в строке лога тип снаряда, класс и название техники, которая нанесла урон, а в случае если игрок сам бабахнулся с горы, вместо всего этого будет надпись "самоурон".

 

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

разобранный выше пример очень существенно отличается от дефолтного конфига лога Damage Log, это я к тому, что используя стандартный набор макросов и эту систему можно было строить абсолютно разные визуальные представления лога. например в дефолтном логе, чтобы получить то представление, которое примерно у тебя на скрине выше, макрозависимости строились совсем по другому, система позволяет это делать настолько гибко, насколько хватает фантазии.

Edited by demon2597

Share this post


Link to post

Short link
Share on other sites

@demon2597, ИМХО, py_macros входят в XVM, поэтому структура конфига для damageLog должна быть максимально похожа на структура конфига XVM.

Share this post


Link to post

Short link
Share on other sites

@demon2597, ИМХО, py_macros входят в XVM, поэтому структура конфига для damageLog должна быть максимально похожа на структура конфига XVM.

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

post-6084-0-40041400-1472216399.jpg

Edited by demon2597

Share this post


Link to post

Short link
Share on other sites

реализация- это уже не моя епархия. я как конфигуратор всего лишь попыталься объяснить каким образом именно для случая лога полученного урона придется переплетать различные нюансы для того, чтобы на выходе получить желаемое. чего там будет в py_macros мне вообще по барабану, это для меня внутрянка мода, как скрипты. мне надо чтобы я конфигом смог сотворить то же самое, пользуясь готовыми макросами

Ну конфиги создавать то твоя "епархия"? Как бы ты реализовал такое в XVM:

"teamAttacker" : {
   "enemy" : "", // противник
   "ally" : "", // союзник
   "player" : "", // игрок
   "None" : "" // нет данных
  }

"teamAttackerC" : {
   "enemy" : "{costShellC}", // противник
   "ally" : "#00EAFF", // союзник
   "player" : "{costShellC}", // игрок
   "None" : "{costShellC}" // нет данных
  }, 

/** Тип снаряда по стоимости, которым было произведено попадание. */
  "costShell" : {
   "credits" : "кредиты", // снаряд, приобретенный за кредиты
   "gold" : "золото", // снаряд, приобретенный за золото
   "None" : "н/д" // нет данных
  },
  "costShellC" : {
   "credits" : "#F2F2F2", // снаряд, приобретенный за кредиты
   "gold" : "#FFE1A6", // снаряд, приобретенный за золото
   "None" : "#F2F2F2" // нет данных
  }.

Share this post


Link to post

Short link
Share on other sites

@ktulho, не знаю, честное слово. я только хотел помочь чем могу:)

Share this post


Link to post

Short link
Share on other sites

@ktulho, не знаю, честное слово. я только хотел помочь чем могу:)

Ну представь что есть макрос {{team-damag}} и {{c:costShell}}, тогда

{{team-damag?#00EAFF|{{c:costShell}}}}

Добавил тип урона и его раскраску:

post-17624-0-48115100-1472221288_thumb.jpgpost-17624-0-99041300-1472221288_thumb.jpg

 

Есть у кого-нибудь реплей с пожаром?

Добавил отображение критического попадания без урона сплэшем.

myDamageLog.rar

В battleLabelsTemplates.xc сделал так (теперь не должно зависеть от разрешения экрана):

    "DamageLog": {
      "enabled": true,
      "updateEvent": "ON_EVERY_SECOND",
      "x": 480,
      "y": 0,
      "width": 300,
      "height": 233,
      "screenVAlign": "bottom",
      "shadow": { "align": "center", "distance": 1, "angle": 90, "alpha": 80, "blur": 5, "strength": 3 },
      "textFormat": { "color": "0xF4EFE8", "size": 16 },
      "format": "{{py:xvm.myDamageLog.dLog()}}"
    }, 
Edited by ktulho
  • Upvote 4

Share this post


Link to post

Short link
Share on other sites

@ktulho, респект за проделанную работу! Давно хотел видеть лог дамага в XVM.


Есть у кого-нибудь реплей с пожаром?

Можно в тренировке сделать.

Share this post


Link to post

Short link
Share on other sites

 

 

Можно в тренировке сделать.
, спасибо, уже нашел. 

Share this post


Link to post

Short link
Share on other sites

@ktulho, можешь еще добавить цвет в зависимости от класса техники? Чтобы название техники в него красилось.

Попробовал сам разобраться, ничего не получилось, это уже для меня слишком сложно.

Edited by neLeax

Share this post


Link to post

Short link
Share on other sites

можешь еще добавить цвет в зависимости от класса техники? Чтобы название техники в него красилось.

, добавил:

    COLOR_VEHICLE_CLASS = {
        'mediumTank': '#E9D600',
        'lightTank': '#0FD711',
        'heavyTank': '#BBBBBB',
        'AT-SPG': '#2E9FFF',
        'SPG': '#FF2120',
    } 

myDamageLog.rar

  • Upvote 2

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...