forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Парсинг скриптов (http://forum.boolean.name/showthread.php?t=5817)

LD 27.02.2008 23:30

Парсинг скриптов
 
Такая вот проблема. Думаю над системой парсинга скриптов (пока не начал реализовывать) и столкнулся с такой проблемой. Допустим, у меня есть скрипт файл, который надо отпарсить:

---------------Script.uss content----------------------
MoveEntity door, 0,.1,0
y=y+1
--------------end script--------------------------------
, где door - какойто объект, существующий в мире (заданный изнутри блица), а y - какая то переменная, заданная изнутри блица.

Как отпарсить эти строчки? Причем проблема то даже не в общем парсинге, а в парсинге entity из скрипта. Ведь entity в блице это указатель на объект, и вот как присвоить какое нибудь значение внутренней блицевской переменной из скрипта? Или сделать что нибудь с entity из скрипта? А то пока никаких идей...

jimon 27.02.2008 23:42

Ответ: Парсинг скриптов
 
LD
регистрировать в скриптовой машине имя переменой и указатель на нее
так ты можешь из скрипта менять блицевские переменые
ps. это вроде идинственый простой метод

LD 28.02.2008 00:19

Ответ: Парсинг скриптов
 
Мне интересны не сколько простые методы, сколько общий алгоритм действий, ведь полезнее будет знать несколько методом решения данной задачи. Но все равно спасибо )

jimon 28.02.2008 00:39

Ответ: Парсинг скриптов
 
LD
к примеру еще можно регистрировать переменую после выделения ей памяти
(написать свой менеджер памяти, но тогда не очень понятно с именами переменных)

Genius 28.02.2008 18:37

Ответ: Парсинг скриптов
 
просто возьми готовый скриптовой язык для Б3Д,например есть BSE.

jimon 28.02.2008 19:55

Ответ: Парсинг скриптов
 
Genius

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

LD 28.02.2008 21:48

Ответ: Парсинг скриптов
 
Про существование BSE я знаю, но зачем использовать готовое, когда интереснее написать свое. Так легче понять принцип работы скриптовой машины, и соответственно зная архитектуру легче ей оперировать.

Leito 03.03.2008 19:41

Re: Парсинг скриптов
 
ужас вы где таких слов понабрались, нельзя попростому)
while mid(s,i,1)<>"."
i++
wend
вот так это делается.

jimon 03.03.2008 21:47

Ответ: Парсинг скриптов
 
Leito
у тебя в строке содержится "door_1"
как ты найдешь по тексту в строке переменную в блице ?
при етом строка может менятся ...

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

LD 09.06.2008 20:33

Ответ: Парсинг скриптов
 
А зачем обращаться именно по имени? Допустим перед началом работы передает в скрипт запрошенные им переменные (допустим пусть это будет адрес области памяти, в которой храниться значение этой переменной (относится и к ентитям также)). Но следовательно возникает две проблемы:

1) Как узнать в какой области памяти храниться переменная (желательно еще знать ее тип, чтобы правильно определить смещение по блоку)

2) Как оперировать переменной зная ее адрес в памяти (как издевательство можно ассемблерной врезкой работать с регистрами проца (то есть хранить переменную не только в памяти но и в регистрах (допустим y в ах? и.т.д) и соответственно передавать в скрипт нужный регистр... Но в этом методе есть свои минусы.... Может есть какие нибудь еще варианты? Все таки интересно с памятью - надеюсь сможете помочь )

jimon 09.06.2008 21:14

Ответ: Парсинг скриптов
 
LD
Почитай про http://ru.wikipedia.org/wiki/JIT
но в любом случае тебе нужно будет делать обвязку
чтобы из программы обращатся к переменным скрипта или наоборот

MiXaeL 15.06.2008 19:47

Ответ: Парсинг скриптов
 
Может я конечно туплю, не бить сильно...
Но разве нельзя использовать сначала NameEntity, цикл по всем entity и сверять EntityName? В dll'ках (например в darkextension), кстати, были функции FirstEntity, LastEntity, NextEntity и т.д.

jimon 15.06.2008 20:08

Ответ: Парсинг скриптов
 
Michael
Код:

; .. тут мы еще можем обратится к переменной SomeVar
Global SomeVar% = 1

;...............

; а тут напрямую НЕЛЬЗЯ обращатся к SomeVar, у нас есть только NeedVariable
Global NeedVariable$ = "SomeVar"

как ты получишь переменную SomeVar если у тебя есть только переменная NeedVariable ?

идинственый вариант это сохранить где нибудь имя и адресс переменной в первой части
а во второй уже по имени получать адресс и обращатся к переменной

MiXaeL 15.06.2008 20:18

Ответ: Парсинг скриптов
 
ну так а что мешает проверить If EntityName$(entity)="NeedEntity" then ...
Ну и естественно, это только для объектов.

HolyDel 15.06.2008 20:28

Ответ: Парсинг скриптов
 
ну дык ето не будет работать.
у тебя то EntityName(ent) = SomeVar.

jimon, а как узнать адрес блицовой переменной? разве льзя?

jimon 15.06.2008 20:59

Ответ: Парсинг скриптов
 
Этого я не знаю, знаю как в blitzmax получить указатель на переменную

Dream 19.07.2008 03:52

Re: Парсинг скриптов
 
есть 2 варианта по моему мнению( всё завист от того как именно ты хочеш грузить скрип)
1 первый, если скрипт утебя должен идти вместе с игрой.
Тогда проще передать ссылку и файл со скритом в функцию обработки скрипта, которая каждый цикл будет выполнять каждый пункт скрипта.

2 вариант, если на время выполнения скрипта всё останавливается.
тогда всё проще с одной стороны, но... Скорее всего прийдётся знать зарание что именно юудет сриптоватся и написать функцию типа этой
Код:

Function Script_Run(script$)
countr=0
howr=0
phowr=0
delscr=0
proy=0
nscript=0
d=OpenFile (script$)
If d=0
Return
EndIf
While Not Eof( d )
scr.scrtext=New scrtext
scr\scr=ReadLine$(d)
nscript=nscript+1
scr\nscript=nscript
Wend

scr.scrtext = First scrtext
countr=0
howr=0
Repeat

phowr=howr
If delscr=0
Select Upper( scr\scr)
Case "CSPHERE"
If howr<>0
        proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
objects.objectscript=New objectscript
scr=After scr
objects\model=CreateSphere(Float(scr\scr))
scr=After scr
objects\name=scr\scr
NameEntity objects\model,objects\Name
If scr\nscript<>nscript scr=After scr

Case "MOVE"
ip=i
If howr<>0
    proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
scr=After scr
For objects.objectscript=Each objectscript
        If objects\name$=scr\scr
                scr=After scr
                x#=Float(scr\scr)
                scr=After scr
                y#=Float(scr\scr)
                scr=After scr
                z#=Float(scr\scr)
                MoveEntity objects\model,x,y,z
                If scr\nscript<>nscript scr=After scr
        EndIf
Next
Case "PLR"
If howr<>0
        proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
        objects.objectscript=New objectscript
        objects\model=plr
        f=objects\model
        scr=After scr
        NameEntity objects\model,scr\scr
        objects\name=scr\scr
        If scr\nscript<>nscript scr=After scr
Case "ANMD2"
If howr<>0
        proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf

scr=After scr
For objects.objectscript=Each objectscript
        If objects\name$=scr\scr
                scr=After scr
                mode=scr\scr
                scr=After scr
                speeda#=Float(scr\scr)
                scr=After scr
                type_anm$=scr\scr
                plr_animate(type_anm$,mode,speeda#)
                If scr\nscript<>nscript scr=After scr
        EndIf
Next
Case "DELAY"
If howr<>0
        proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
        If delscr<>0
                delscr=delscr-1
        Else
                scr=After scr
                delscr=Float(scr\scr)
        EndIf
        If scr\nscript<>nscript scr=After scr
Case "TURN"
If howr<>0
    proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
scr=After scr
For objects.objectscript=Each objectscript
        If objects\name$=scr\scr
                scr=After scr
                x#=Float(scr\scr)
                scr=After scr
                y#=Float(scr\scr)
                scr=After scr
                z#=Float(scr\scr)
                TurnEntity objects\model,x,y,z,1
                If scr\nscript<>nscript scr=After scr
        EndIf
Next
Case "PLRMOVETONPC"

        npc.npc=Object.npc(player\npc)
        sx=EntityX(npc\Model)-EntityX(plr)
        sz=EntityZ(npc\Model)-EntityZ(plr)
        AlignToVector plr,sx,0,sz,0,1
        dista=EntityDistance (plr,npc\model)-15
        If dista>0
                MoveEntity plr,0,0,player\h_speed#
        Else
                plr_animate("stay",1,0.1)
        EndIf
        If howr<>0
    proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
        If scr\nscript<>nscript scr=After scr       
Case "CAMPOSITION"
If howr<>0
    proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
        scr=After scr
        x#=Float(scr\scr)
        scr=After scr
        y#=Float(scr\scr)
        scr=After scr
        z#=Float(scr\scr)
        PositionEntity cam,x,y,z,1
        If scr\nscript<>nscript scr=After scr

Case "CAMMOVE"

If howr<>0
    proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
        scr=After scr
        x#=Float(scr\scr)
        scr=After scr
        y#=Float(scr\scr)
        scr=After scr
        z#=Float(scr\scr)
        MoveEntity cam,x,y,z
        If scr\nscript<>nscript scr=After scr

Case "CAMTURN"
If howr<>0
    proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
        scr=After scr
        x#=Float(scr\scr)
        scr=After scr
        y#=Float(scr\scr)
        scr=After scr
        z#=Float(scr\scr)
        TurnEntity cam,x,y,z,1
        If scr\nscript<>nscript scr=After scr
Case "CAMPOINTTONPC"
If howr<>0
    proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
        npc.npc=Object.npc(player\npc)
        PointEntity cam,npc\model
        If scr\nscript<>nscript scr=After scr
Case "CAMMOVETONPC"
        npc.npc=Object.npc(player\npc)
        dista=EntityDistance (cam,npc\model)-15
        If dista>0
        wag#=(dista*1000)/howr
        npcpiv=CreatePivot (npc\model)
        MoveEntity npcpiv,0,25,0
        PointEntity cam,npcpiv
        MoveEntity cam,0,0,wag#/1000
        FreeEntity npcpiv
        EndIf
        If howr<>0
                proy=proy+1
                If proy=countr
                        howr=howr-1
                EndIf
        EndIf
        If scr\nscript<>nscript scr=After scr
Case "NPCMOVE"
If howr<>0
    proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
        npc.npc=Object.npc(player\npc)
        scr=After scr
        x#=Float(scr\scr)
        scr=After scr
        y#=Float(scr\scr)
        scr=After scr
        z#=Float(scr\scr)
        MoveEntity npc\model,x,y,z
        If scr\nscript<>nscript scr=After scr
Case "NPCPOINTPLR"
If howr<>0
    proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
        npc.npc=Object.npc(player\npc)
        sx=EntityX(plr)-EntityX(npc\Model)
        sz=EntityZ(plr)-EntityZ(npc\Model)
        AlignToVector npc\Model,sx,0,sz,0,1
        If scr\nscript<>nscript scr=After scr
Case "NPCMOVETOPLR"

        npc.npc=Object.npc(player\npc)
        dista=EntityDistance (plr,npc\model)-15
        If dista>0
        wag#=(dista*1000)/howr
        sx=EntityX(plr)-EntityX(npc\Model)
        sz=EntityZ(plr)-EntityZ(npc\Model)
        AlignToVector npc\Model,sx,0,sz,0,1
        MoveEntity npc\model,0,0,wag#/1000
        EndIf
        If howr<>0
    proy=proy+1
        If proy=countr
                howr=howr-1
        EndIf
EndIf
        If scr\nscript<>nscript scr=After scr
Case "REPEAT"
       
        scr=After scr
        countr=Float(scr\scr)
       
        scr=After scr
    howr=Float(scr\scr)
        scr=After scr
        nachalo=Handle (scr)
        proy=0
Case "ENDSCRIPT"
For scr.scrtext =Each scrtext
Delete scr
Next
plr_animate("stay",1,0.1)
CloseFile (d)
Return
Default
If scr\nscript<>nscript scr=After scr
End Select

If howr<>0 And proy=countr
        scr.scrtext=Object .scrtext (nachalo)
        proy=0
EndIf

Else
delscr=delscr-1
EndIf
       

If howr=0 Or howr<>phowr
npc.npc=Object.npc(player\npc)
PositionEntity npc\model,EntityX(npc\model),EntityY(npc\model)-1,EntityZ(npc\model)
PositionEntity plr,EntityX( plr),EntityY( plr)-1,EntityZ( plr)
UpdateWorld

RenderWorld

Text 1,20,delscr
Flip
End If
Forever
CloseFile (d)
End Function

Function plr_animate(type_anim$,mode_anim,speed_anim#)
Select Upper( type_anim$)
Case "STAY"
        AnimateMD2 plr,mode_anim,speed_anim#,0,37
       
Case "RUN"
        AnimateMD2 plr,mode_anim,speed_anim#,40,45
       
Case "ATAK"
        AnimateMD2 plr,mode_anim,speed_anim#,72,83
Case "CAST"
        AnimateMD2 plr,mode_anim,speed_anim#,107,134
End Select
End Function

а это файл скрипта ( например script1.gscr)
Код:

PLR
tris

AnMd2
tris
1
0.1
run

repeat
1
40

plrmovetonpc

AnMd2
tris
1
0.1
stay

delay
40

repeat
1
100

cammovetonpc

delay
200

EndScript

я не говорю что это идеальный способ, но я зделал себе так) прикольно)) только иногда лень писать скрипты в блокноте))

jimon 19.07.2008 12:57

Ответ: Парсинг скриптов
 
DimasSup
не известно компилирует ли blitzmax\blitz3d select как переход по таблице или компилирует с кучей if'ов

я делал в blitzmax так что каждая команда ето отдельный тип у которого есть тип "do"
потом при загрузки скрипта все команды создают ети типы и заводятся в общий список
после етого идет простой проход по циклу с управляющей переменой
(та которая содержит номер исполняемой команды, нужна для реализации всяких функций, переходов и тд)

в идеале можно сделать нечто типа мета-программирования
у нас есть Engine.dll,Game.exe и Game.dll который реализует всю логику игры
пишем компилятор который переводит наш простой сриптовый язык
в тот язык который может скомпилироватся в dll'ку
и потом компилируем эту dll и подрубаем к игре

в принципе схожая вещь сделана в quake3,quake4,doom3
но там C/C++ код специально компилировался
и запускался на виртуальной машине

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


Часовой пояс GMT +4, время: 11:57.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot