|
|
|
|
[Вопрос] cJass/vJass
|
|
Smartaros | Дата: Суббота, 10 Ноября 2012, 15:58:21 | Сообщение # 1 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| Решил начать учить, есть много вопросов. В частности, облазил весь инет, но ничего не нашел по поводу структур. В чем разница между library и scope. Расскажите про всякие тонкости/ньюансы, вообще про теорию. Кто знает русскоязычные источники по детальному мэнуалу сего. Сижу пишу у себя через либы, и че то чувствую что хрень делаю, через скоуп тоже самое, знаю только синтаксис, а сам смысл только в конструкции и функциях, и то не всего.
|
|
|
|
Ty3uK | Дата: Суббота, 10 Ноября 2012, 16:35:41 | Сообщение # 2 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| library при компиляции помещается выше нестандартного кода, а scope остается в месте объявления. на объяснение нюансов уйдет куча времени, а лучше официального мануала на англ. пока ничего нет. и, да, а причем тут cJASS?
|
|
|
|
Smartaros | Дата: Суббота, 10 Ноября 2012, 16:52:19 | Сообщение # 3 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| синтаксис, знаю только ++ -- -= и тд. , что еще есть? Добавлено (10 Ноября 2012, 16:52:19) --------------------------------------------- почему не робит? Code scope Sotryasenie initializer Init_Sotryasenie {
include "cj_types.j" include "cj_typesEX.j"
define { private ABILITY = 'A011' private ABILITY_STUN = 'A010' private DUMMY = 'n009' }
private bool Cond() { return GetSpellAbilityId() == ABILITY } private void Body() { unit u = GetTriggerUnit(); unit c = GetSpellTargetUnit() int stun = 100 + 50 * GetUnitAbilityLevel(u, ABILITY) float damage = 40.0 + 60.0 * GetUnitAbilityLevel(u, ABILITY) if GetHeroStr(c, true) >= stun and GetHeroStr(c, true) >= damage { damage = 0.0 stun = 1 } elseif GetHeroStr(c, true) >= stun { stun = 1 } elseif GetHeroStr(c, true) >= damage { damage = 0.0 } else { damage -= I2R(GetHeroStr(c, true)) stun -= GetHeroStr(c, true) } UnitDamageTargetByType(u, c, damage, DAMAGE_TYPE_MAGIC) unit d = CreateUnit(GetOwningPlayer(u), DUMMY, GetWidgetX(c), GetWidgetY(c), 0) UnitAddAbility(d, ABILITY_STUN) SetUnitAbilityLevel(d, ABILITY_STUN, stun) IssueTargetOrder(d, "thunderbolt", c) UnitApplyTimedLife(d, 'BTLF', 1) u = null; c = null; d = null }
private void Init_Sotryasenie() { gg_trg_Sotryasenie = new trigger TriggerRegisterAnyUnitEventBJ(gg_trg_Sotryasenie, EVENT_PLAYER_UNIT_SPELL_EFFECT) TriggerAddCondition(gg_trg_Sotryasenie, Condition( function Cond)) TriggerAddAction(gg_trg_Sotryasenie, function Body) }
}
|
|
|
|
Ty3uK | Дата: Суббота, 10 Ноября 2012, 17:00:19 | Сообщение # 4 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| читай мануал, много чегг есть. его, правда, давно не обновляли. не работает - не компилируется? если да, то что пишет?
|
|
|
|
Smartaros | Дата: Суббота, 10 Ноября 2012, 17:09:13 | Сообщение # 5 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| компилируется, проверил что не работает все после ифа Добавлено (10 Ноября 2012, 17:09:13) --------------------------------------------- еще вопрос, может быть в либе приватная scope, и имеется ли в этом смысл?
|
|
|
|
Ty3uK | Дата: Суббота, 10 Ноября 2012, 17:31:48 | Сообщение # 6 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Quote (Smartaros) еще вопрос, может быть в либе приватная scope, и имеется ли в этом смысл? Я же говорю - читаем мануал vJASS Quote (vJASS manual) Nested scopes Scopes can be nested, don't confuse this statement with "libraries can be nested", in fact, you cannot even place a library inside an scope definition. You can however, have scope inside either library or scope definitions. An scope inside another scope is considered a child scope. A child scope is considered to be a public member of the parent scope (?). A child scope cannot declare members that were previously declared as private or global by a parent scope. A child scope behaves in relation to its parent in the same way as a normal scope behaves in relation to the whole map script. Since child scopes are always public members, you can access a child scope' public members froum outside the parent scope, but it needs a prefix for the parent and a prefix for the child. An example : Code library nestedtest scope A globals private integer N=4 endglobals
public function display takes nothing returns nothing call BJDebugMsg(I2S(N)) endfunction endscope
scope B globals public integer N=5 endglobals
public function display takes nothing returns nothing call BJDebugMsg(I2S(N)) endfunction endscope
function nestedDoTest takes nothing returns nothing call B_display() call A_display() endfunction
endlibrary
public function outside takes nothing returns nothing set nestedtest_B_N= -4 call nestedDoTest() call nestedtest_A_display()
endfunction The next example will cause a syntax error: Code library nestedtest globals private integer N=3 endglobals
scope A globals private integer N=4 //Error: 'N' redeclared endglobals endscope
endlibrary It is actually caused by a limitation in the parser, there is a conflict caused by using N for the parent and then declaring it for the child. However this version does not cause syntax errors: Code library nestedtest scope A globals private integer N=4 endglobals endscope
globals private integer N=3 endglobals
endlibrary It does kind of the same thing, but since the child's N was declared before the parent's the parser no longer gets in a confusion. Another thing to keep in mind is that unlike normal global variables, private/public global variables cannot be used before declared, otherwise JassHelper will think they are just normal variables. Scopes cannot be redeclared, there cannot be 2 scopes with the same name. But 2 child scopes might have the same name if they are children of different scopes, the reason is that they actually don't have the same name, they have different names given by their public child scope situation. Code library nestedtest scope A function kkk takes nothing returns nothing set N=N+5 // By the time JassHelper gets to this line, it did not see the private integer N // declaration yet, so it assumes N is an attempt to use a global variable and does not // do any replacement endfunction endscope
endlibrary
scope X scope A //Declaring scope A again does not cause any problem, it is because the scope is actually X_A , the // previous declaration of A was actually nestedtest_A function DoSomething takes nothing returns nothing endfunction
endscope endscope There is no nesting limit, but notice that resulting variable and function names of private/public members get big and bigger depending of the depth of the scope nesting. Bigger variable names may affect performance. Not a lot but they do, and this efficiency issue is to be prevented by an obfuscator/finalizer that renames every identifier in the map script a.k.a the map optimizer's shortest names possible method.
|
|
|
|
SirNikolas | Дата: Суббота, 10 Ноября 2012, 17:36:23 | Сообщение # 7 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Приватных областей, к сожалению, не бывает. Smartaros, набери в поиске "vJASS manual" и "cJASS manual". Первые ссылки - офицальные.
|
|
|
|
Ty3uK | Дата: Суббота, 10 Ноября 2012, 17:37:49 | Сообщение # 8 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| SirNikolas, первый он не будет читать, т.к. он не знает англ (ну по-крайней мере он мне так говорил)
|
|
|
|
Smartaros | Дата: Суббота, 10 Ноября 2012, 18:56:12 | Сообщение # 9 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| Quote (Smartaros) компилируется, проверил что не работает все после ифа
|
|
|
|
SirNikolas | Дата: Суббота, 10 Ноября 2012, 19:05:43 | Сообщение # 10 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Code include "cj_order.j"
scope Shaking { include "cj_types_priv.j"
define { private ABILITY = 'A011' private ABILITY_STUN = 'A010' private DUMMY = 'n009' private STUN(lvl) = 100 + 50 * lvl private DAMAGE(lvl) = 40. + 60. * lvl }
callback onUnitSpellEffect(ABILITY) { unit u = GetTriggerUnit(), c = GetSpellTargetUnit() unit d = CreateUnit(GetOwningPlayer(u), DUMMY, GetWidgetX(c), GetWidgetY(c), .0) int level = GetUnitAbilityLevel(u, ABILITY) int str = GetHeroStr(c, true) int stun = STUN(level) real damage = DAMAGE(level) if str >= stun { stun = 1 } else { stun -= str } if str >= damage { damage = .0 } else { damage -= str } UnitDamageTargetByType(u, c, damage, DAMAGE_TYPE_MAGIC) UnitAddAbility(d, ABILITY_STUN) SetUnitAbilityLevel(d, ABILITY_STUN, stun) UnitApplyTimedLife(d, 'BTLF', 1.) IssueTargetOrderById(d, order_thunderbolt, c) flush locals } }
|
|
|
|
Smartaros | Дата: Суббота, 10 Ноября 2012, 22:57:23 | Сообщение # 11 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| Переписал - не пашет после ифов. Проверил даммика и его способность, все в порядке. Поменял функцию, убрал установление лвла дамми абилы на снятие баффа таймером, тоже не работает, понятия не имею в чем ошибка, явно в ро, но все проверил итак.Добавлено (10 Ноября 2012, 21:18:49) --------------------------------------------- хотя по факту даже даммик не создается, первый раз такое вижу Добавлено (10 Ноября 2012, 21:35:29) --------------------------------------------- короче понял, не работает все после damagebytype, независимо где она стоит, ща позжее ее скину Добавлено (10 Ноября 2012, 22:57:23) ---------------------------------------------
Code void UnitSpecialDamageTarget(unit u, unit t, float r, damagetype d) { if d == DAMAGE_TYPE_MAGIC or d == DAMAGE_TYPE_POISON or d == DAMAGE_TYPE_FIRE or d == DAMAGE_TYPE_WATER or d == DAMAGE_TYPE_AIR or d == DAMAGE_TYPE_EARTH or d == DAMAGE_TYPE_ELECTRISITY { UnitDamageTarget(u, t, r, false, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS) } elseif d == DAMAGE_TYPE_NORMAL { UnitDamageTarget(u, t, r, false, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) } elseif d == DAMAGE_TYPE_UNKNOWN { UnitDamageTarget(u, t, r, false, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS) } elseif d == DAMAGE_TYPE_CRITICAL { UnitDamageTarget(u, t, r, false, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS) } }
void UnitDamageTargetByType(unit u, unit t, float r, damagetype d) { if d == DAMAGE_TYPE_NORMAL { unit c = CreateUnit(GetOwningPlayer(u), NORMAL, GetWidgetX(t), GetWidgetY(c), 0) UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_NORMAL) } elseif d == DAMAGE_TYPE_MAGIC { unit c = CreateUnit(GetOwningPlayer(u), MAGIC, GetWidgetX(t), GetWidgetY(c), 0) UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_MAGIC) } elseif d == DAMAGE_TYPE_POISON { unit c = CreateUnit(GetOwningPlayer(u), POISON, GetWidgetX(t), GetWidgetY(c), 0) UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_POISON) } elseif d == DAMAGE_TYPE_FIRE { unit c = CreateUnit(GetOwningPlayer(u), FIRE, GetWidgetX(t), GetWidgetY(c), 0) UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_FIRE) } elseif d == DAMAGE_TYPE_WATER { unit c = CreateUnit(GetOwningPlayer(u), WATER, GetWidgetX(t), GetWidgetY(c), 0) UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_WATER) } elseif d == DAMAGE_TYPE_AIR { unit c = CreateUnit(GetOwningPlayer(u), AIR, GetWidgetX(t), GetWidgetY(c), 0) UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_AIR) } elseif d == DAMAGE_TYPE_EARTH { unit c = CreateUnit(GetOwningPlayer(u), EARTH, GetWidgetX(t), GetWidgetY(c), 0) UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_EARTH) } elseif d == DAMAGE_TYPE_ELECTRISITY { unit c = CreateUnit(GetOwningPlayer(u), ELECTRISITY, GetWidgetX(t), GetWidgetY(c), 0) UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_ELECTRISITY) } elseif d == DAMAGE_TYPE_UNKNOWN { unit c = CreateUnit(GetOwningPlayer(u), PURE, GetWidgetX(t), GetWidgetY(c), 0) UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_UNKNOWN) } elseif d == DAMAGE_TYPE_CRITICAL { unit c = CreateUnit(GetOwningPlayer(u), CRITICAL, GetWidgetX(t), GetWidgetY(c), 0) UnitSpecialDamageTarget(c, t, r, DAMAGE_TYPE_CRITICAL) } }
|
|
|
|
|
|
|
|
|
|
|