Сейчас 11:58:57 Четверг, 2 мая, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Раздел картостроителя » JASP (Just Another Script Preprocessor)
JASP
Ty3uKДата: Понедельник, 02 Апреля 2012, 12:26:42 | Сообщение # 1
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
- небольшой препроцессор для языка Jass2, который запускается перед парсером vJass (JassHelper). Полную информацию о возможностях вы можете прочитать в мануале, все ссылки внизу.

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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
а точнее, вообще пока не работает. Но над этим работаю я trollface

Добавлено (29 Апрель 2012, 15:30:33)
---------------------------------------------
Со строками все ок будет, да и с простейшими типами тоже, если ты как-то покажешь их принадлежность. То есть в выражении
Code
var i = j + 1
парсер поймет, что это целочисленная из-за того, что в объявлении есть число 1


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек


Сообщение отредактировал 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, а так все будет ок, ибо первее всего он чекает значение переменной на наличие функций

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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, спасибо, исправлю

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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, а каким образом он будет читать тип твоей переменной? Нет, я конечно могу сделать так, чтобы функция считывала тип локальной переменной, но с другой стороны - а надо ли? :) хотя думаю надо

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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
то есть если у юзера уже есть хэштаблица с именем хэш, то она не будет создаваться. Мнения?


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

[DUОS]Дата: Пятница, 04 Мая 2012, 18:33:02 | Сообщение # 168
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Quote (Ty3uK)
Мнения?

Саппортую, какие же ещё?


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

Ty3uKДата: Суббота, 05 Мая 2012, 15:29:27 | Сообщение # 169
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Приглашаю всех, кто заинтересован, на обсуждение препроцессора на официальном форуме. Для модераторов - это не реклама, форум посвящен только парсеру

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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
Блокировки:
Спасибо, Ник, так и сделаю :)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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
Блокировки:
С &значение придется чуток повозиться, но выполнимо. Окей, запилим. Так же по просьбе буржуев реализую инкремент, декремент, -=, += и т.д.

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Воскресенье, 06 Мая 2012, 20:57:15 | Сообщение # 174
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (Ty3uK)
реализую инкремент, декремент
Сколько будет ++i + ++i? trollface


 

PitFighterДата: Воскресенье, 06 Мая 2012, 22:19:06 | Сообщение # 175
8 уровень
Группа: Проверенные
Сообщений: 542
Награды: 0
Репутация: 197
Блокировки:
Уважаемый Тузик прошу вас закрыть вашу с дуосом фейк тему по рекламе JASP :D

 

Форум о Warcraft 3 » Раздел для картостроителей » Раздел картостроителя » JASP (Just Another Script Preprocessor)
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz