|
|
|
|
JASP
|
|
Ty3uK | Дата: Понедельник, 02 Апреля 2012, 12:26:42 | Сообщение # 1 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| - небольшой препроцессор для языка Jass2, который запускается перед парсером vJass (JassHelper). Полную информацию о возможностях вы можете прочитать в мануале, все ссылки внизу.
|
|
|
|
lawson | Дата: Воскресенье, 29 Апреля 2012, 15:24:16 | Сообщение # 151 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Ty3uK, И еще про анализ значений: если не объявил тип переменной ну допустим подразумеваем int то такое поддерживаеться "var i = 1 + 1 или тот же var s = "HELLO"+ "WORLD""?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Воскресенье, 29 Апреля 2012, 15:27:12 |
|
|
|
SirNikolas | Дата: Воскресенье, 29 Апреля 2012, 15:25:55 | Сообщение # 152 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Ty3uK, обновить первый пост?)
|
|
|
|
Ty3uK | Дата: Воскресенье, 29 Апреля 2012, 15:30:33 | Сообщение # 153 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| SirNikolas, да, я купил себе домен и сделал страничку, поэтому если можно - ссылку на мануал смени :3 lawson, для безтиповы переменный есть дирректива var, но она пока криво работает с такими фичами:Code var i = 1 var j = i + 1 а точнее, вообще пока не работает. Но над этим работаю я
Добавлено (29 Апрель 2012, 15:30:33) --------------------------------------------- Со строками все ок будет, да и с простейшими типами тоже, если ты как-то покажешь их принадлежность. То есть в выражении парсер поймет, что это целочисленная из-за того, что в объявлении есть число 1
Сообщение отредактировал Ty3uK - Воскресенье, 29 Апреля 2012, 15:30:49 |
|
|
|
SirNikolas | Дата: Воскресенье, 29 Апреля 2012, 15:35:01 | Сообщение # 154 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| У тебя с английской версии страницы при нажатии на ссылку пересылает на русскую статью wiki про JASS.
|
|
|
|
lawson | Дата: Воскресенье, 29 Апреля 2012, 15:36:45 | Сообщение # 155 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Ty3uK) парсер поймет, что это целочисленная из-за того, что в объявлении есть число 1 А так? var i = GetUnitFacing(a) + GetUnitFacing(b) или значение рандома? var i = GetRandomInt() + GetRandomInt()
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Воскресенье, 29 Апреля 2012, 15:37:32 |
|
|
|
Ty3uK | Дата: Воскресенье, 29 Апреля 2012, 15:37:47 | Сообщение # 156 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| lawson, а так все будет ок, ибо первее всего он чекает значение переменной на наличие функций
|
|
|
|
lawson | Дата: Воскресенье, 29 Апреля 2012, 15:38:13 | Сообщение # 157 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Ty3uK, Ясно, молодчинка.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Ty3uK | Дата: Воскресенье, 29 Апреля 2012, 15:38:34 | Сообщение # 158 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| SirNikolas, спасибо, исправлю
|
|
|
|
lawson | Дата: Воскресенье, 29 Апреля 2012, 15:38:58 | Сообщение # 159 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Ty3uK, А какую ошибку выведет если присвоить не типизированной переменной разные значения? var i = 1 + "HELLO WORLD"?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Воскресенье, 29 Апреля 2012, 15:39:14 |
|
|
|
SirNikolas | Дата: Воскресенье, 29 Апреля 2012, 15:42:34 | Сообщение # 160 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Code var r = GetRandomInt(0, 1) + GetRandomReal(0, 1) var q = GetRandomReal(0, 1) + GetRandomInt(0, 1) ?Добавлено (29 Апрель 2012, 15:42:34) --------------------------------------------- BTW, "program" пишется с одной 'm'.
|
|
|
|
Ty3uK | Дата: Понедельник, 30 Апреля 2012, 12:42:02 | Сообщение # 161 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| lawson, Добавлено (30 Апрель 2012, 12:42:02) --------------------------------------------- Пишу спеллпак на жаспе, дабы показать его возможности. Вот код одного спелла (простенький, я делал упор на код): Code function Trig_Freezing_Shot_Timer takes nothing returns nothing //===========================================================================================================================// // Local variables // //===========================================================================================================================// var t = GetExpiredTimer() var hid = GetHandleId(t) var caster = LoadUnitHandle(hash, hid, 0) var dist = LoadReal(hash, hid, 4) var count = LoadInteger(hash, hid, -1) var dummy, target, angle, x, y, i = 1 //===========================================================================================================================// // Timer actions // //===========================================================================================================================// if dist <= 750. then repeat set dummy = LoadUnitHandle(hash, hid, i) set angle = GetUnitFacing(dummy) * .017 set x = GetWidgetX(dummy) + 25. * Cos(angle) set y = GetWidgetY(dummy) +25. * Sin(angle) call SetUnitPosition(dummy, x, y) call GroupEnumUnitsInRange(temp, x, y, 75., null) loop set target = FirstOfGroup(temp) exitwhen target == null if IsUnitEnemy(target, GetOwningPlayer(caster)) and not IsUnitType(target, UNIT_TYPE_STRUCTURE) and not IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) and GetWidgetLife(target) > .405 then call UnitDamageTarget(caster, target, 100., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) call FastEffect("Abilities\\Weapons\\FrostWyrmMissile\\FrostWyrmMissile.mdl", x, y) call DummycastToTarget(caster, target, 'A001', 852075) call SaveInteger(hash, hid, -1, count - 1) free dummy endif call GroupRemoveUnit(temp, target) endloop set i = i + 1 until i > 3 call SaveReal(hash, hid, 4, dist + 25.) elseif dist > 750. or count <= 0 then repeat free LoadUnitHandle(hash, hid, i) set i = i + 1 until i > 3 call FlushChildHashtable(hash, hid) call PauseTimer(t) free t endif //===========================================================================================================================// // Flushing variables // //===========================================================================================================================// flush t, caster, dummy endfunction
function Trig_Freezing_Shot_Actions takes nothing returns boolean //===========================================================================================================================// // Local variables // //===========================================================================================================================// var t, caster, dummy, angle, hid, x, y, i = 1 //===========================================================================================================================// // Trigger actions // //===========================================================================================================================// if GetSpellAbilityId() == 'A000' or GetSpellAbilityId() == 'A002' then set t = CreateTimer() set hid = GetHandleId(t) set caster = GetTriggerUnit() set x = GetWidgetX(caster) set y = GetWidgetY(caster) set angle = Atan2(GetSpellTargetY() - y, GetSpellTargetX() - x) * 57.295 + 25. call SaveInteger(hash, hid, -1, 3) call SaveAgentHandle(hash, hid, 0, caster) call SaveReal(hash, hid, 5, angle) repeat set dummy = CreateDummy(GetTriggerPlayer(), "Abilities\\Spells\\Other\\FrostBolt\\FrostBoltMissile.mdl", .3, x, y, 100., angle) call SaveAgentHandle(hash, hid, i, dummy) set angle = angle - 25. set i = i + 1 until i > 3 call TimerStart(t, .04, true, function Trig_Freezing_Shot_Timer) endif //===========================================================================================================================// // Flushing variables // //===========================================================================================================================// flush t, caster, dummy return false endfunction
//===========================================================================================================================// // Trigger Initialization // //===========================================================================================================================// function InitTrig_Freezing_Shot takes nothing returns nothing call FogMaskEnable(false) call FogEnable(false) set gg_trg_Freezing_Shot = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(gg_trg_Freezing_Shot, EVENT_PLAYER_UNIT_SPELL_EFFECT) call TriggerAddCondition(gg_trg_Freezing_Shot, Condition(function Trig_Freezing_Shot_Actions)) endfunction
|
|
|
|
lawson | Дата: Понедельник, 30 Апреля 2012, 13:15:09 | Сообщение # 162 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Ty3uK, А почему бы не написать маленький апи по хэшу? Ну например чтобы не писать там SaveAgenthandle или SaveInteger, а просто сразу например: Save(ключ, ячейка) и загружать также. Понятно что хеш таблица инициализируеться уже в начале игры через встроеный скрипт без участия игрока. Как по мне - было бы очень удобно.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Ty3uK | Дата: Понедельник, 30 Апреля 2012, 13:36:24 | Сообщение # 163 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| lawson, а каким образом он будет читать тип твоей переменной? Нет, я конечно могу сделать так, чтобы функция считывала тип локальной переменной, но с другой стороны - а надо ли? хотя думаю надо
|
|
|
|
lawson | Дата: Понедельник, 30 Апреля 2012, 14:05:46 | Сообщение # 164 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Ty3uK) а каким образом он будет читать тип твоей переменной? Ну так на тебя и вся надежда. Если б знал - подсказал бы.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
wetalq | Дата: Четверг, 03 Мая 2012, 16:56:11 | Сообщение # 165 |
8 уровень
Группа: Проверенные
Сообщений: 550
Награды: 0
Репутация: 117
Блокировки:
| Ty3uK, делаешь из джаса джава скрипт)
|
|
|
|
SirNikolas | Дата: Четверг, 03 Мая 2012, 18:59:05 | Сообщение # 166 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Code //requires: // CreateDummy(player, string, real, real, real, real, real) // FastEffect(string, real, real) // DummycastToTarget(unit, unit, int, int)
library_once Hash { constant hashtable Hash = InitHashtable() } library_once Group { constant group G = CreateGroup() }
define delete = free
scope JASPDemo { include "cj_types_priv.j"
private struct str { timer t = CreateTimer() int time = 3 unit caster player p real dist = .0 unit dummy[3] real dx[3] real dy[3] }
callback onUnitSpellEffect() { var caster = GetTriggerUnit() var x = GetWidgetX(caster) var y = GetWidgetY(caster) var id = GetSpellAbilityId() var i = 0 var angle, s if id == 'A000' || id == 'A002' { angle = Atan2(GetSpellTargetY() - y, GetSpellTargetX() - x) * 57.295 + 25. s = str.create() s.caster = caster s.p = GetOwningPlayer(caster) loop { s.dummy[i] = CreateDummy(s.p, \ "Abilities\\Spells\\Other\\FrostBolt\\FrostBoltMissile.mdl", \ .3, x, y, 100., angle) s.dx[i] = 25. * Cos(angle) s.dy[i] = 25. * Sin(angle) angle -= 25. exitwhen i == 2 i++ } SaveInteger(Hash, GetHandleId(s.t), 0, s) TimerStart(t, .04, true, \ lambda void() { var t = GetExpiredTimer() str s = LoadInteger(Hash, GetHandleId(s.t), 0) var i = 0, x, y if dist <= 750. { loop { x = GetWidgetX(s.dummy[i]) + s.cosA y = GetWidgetY(s.dummy[i]) + s.sinA SetUnitPosition(s.dummy[i], x, y) for (unit target; UnitsInRange(x, y, 75.) use G) { if IsUnitEnemy(target, s.p) && \ IsUnitType(target, UNIT_TYPE_STRUCTURE) == false && \ IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false && \ GetWidgetLife(target) > .405 UnitDamageTarget(caster, target, 100., true, false, \ ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) FastEffect("Abilities\\Weapons\\" + \ "FrostWyrmMissile\\FrostWyrmMissile.mdl", x, y) DummycastToTarget(caster, target, 'A001', 852075) s.time-- delete s.dummy[i] endif } exitwhen i == 2 i++ } s.dist += 25. } elseif s.time <= 0 { RemoveSavedInteger(Hash, GetHandleId(s.t), 0) PauseTimer(s.t) delete s.dummy[0], s.dummy[1], s.dummy[2], s.t, s } flush t } ) } flush caster, p }
#if DEBUG callback onInit() { FogMaskEnable(false) FogEnable(false) } #endif } А что, неплохо выглядит. Добавлено (03 Май 2012, 18:59:05) --------------------------------------------- Кстати, советую сделать обработку неизвестных типов в new и delete следующим образом: Code new mystruct abc //... delete abc ->Code local mystruct abc = mystruct.create() //... call abc.destroy()
|
|
|
|
Ty3uK | Дата: Пятница, 04 Мая 2012, 15:29:29 | Сообщение # 167 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Хорошо, так и сделаю и ты же знаешь- я классический код больше люблю :3 Добавлено (04 Май 2012, 15:29:29) --------------------------------------------- Господа, есть идея прикрутить возможность проверки кода на наличие глобалки. Это упростит импорт систем и убережет от ошибок. Вот пример работы: Code //!if Exists(hashtable hash) == false then new hashtable hash //!endif то есть если у юзера уже есть хэштаблица с именем хэш, то она не будет создаваться. Мнения?
|
|
|
|
[DUОS] | Дата: Пятница, 04 Мая 2012, 18:33:02 | Сообщение # 168 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Саппортую, какие же ещё?
|
|
|
|
Ty3uK | Дата: Суббота, 05 Мая 2012, 15:29:27 | Сообщение # 169 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Приглашаю всех, кто заинтересован, на обсуждение препроцессора на официальном форуме. Для модераторов - это не реклама, форум посвящен только парсеру
|
|
|
|
SirNikolas | Дата: Воскресенье, 06 Мая 2012, 10:05:08 | Сообщение # 170 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| В vJass это делается вот так:Code library_once Hash globals constant hashtable Hash = InitHashtable() endglobals endlibrary В cJass - вот так:Code define Hash_def #if !Hash_def constant hashtable Hash = InitHashtable() setdef Hash_def = true #endif Но можно сделать и так. Только заодно проверку функций, структур и типов:Code //! if Exists(nothing abc(real, string)) ... //! endif //! if Exists(struct def) ... //! endif //! if Exists(type ghi extends integer[10]) ... //! endif И еще одно предложение: если при объявлении структуры или типа после имени стоит двоеточие, заменить его на " extends ". Только в других случаях его не надо трогать.Code struct abc: array endstruct
private type def: integer[10] Code struct abc extends array endstruct
private type def extends integer[10]
|
|
|
|
Ty3uK | Дата: Воскресенье, 06 Мая 2012, 19:42:26 | Сообщение # 171 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Спасибо, Ник, так и сделаю
|
|
|
|
SirNikolas | Дата: Воскресенье, 06 Мая 2012, 20:13:00 | Сообщение # 172 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Заказ на няшные сишные операторы. Code int a, b, c bool b1, b2 new timer t int id, uid, sid
a = b % c a %= b b1 &&= b2 b1 ||= b2 b1 ^= b2 id = &t uid = &GetTriggerUnit() sid = &"Hello World" Code local integer a local integer b local integer c local boolean b1 local boolean b2 local timer t = CreateTimer() local integer id local integer uid local integer sid
set a = (b - b / c * c) set a = a - a / (b) * (b) set b1 = b1 and (b2) set b1 = b1 or b2 set b1 = b1 != (b2) set id = GetHandleId(t) set uid = GetHandleId(GetTriggerUnit()) set sid = StringHash("Hello World") Обрати внимание на скобки в первых действиях. Их нужно поставить именно так, чтобы не было ошибок при передаче сложных выражений. Ну и, разумеется, подстроить под это все var.
|
|
|
|
Ty3uK | Дата: Воскресенье, 06 Мая 2012, 20:26:29 | Сообщение # 173 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| С &значение придется чуток повозиться, но выполнимо. Окей, запилим. Так же по просьбе буржуев реализую инкремент, декремент, -=, += и т.д.
|
|
|
|
SirNikolas | Дата: Воскресенье, 06 Мая 2012, 20:57:15 | Сообщение # 174 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Ty3uK) реализую инкремент, декремент Сколько будет ++i + ++i?
|
|
|
|
PitFighter | Дата: Воскресенье, 06 Мая 2012, 22:19:06 | Сообщение # 175 |
8 уровень
Группа: Проверенные
Сообщений: 542
Награды: 0
Репутация: 197
Блокировки:
| Уважаемый Тузик прошу вас закрыть вашу с дуосом фейк тему по рекламе JASP
|
|
|
|
|
|
|
|
|
|
|