Tabletop Simulator

Tabletop Simulator

Not enough ratings
Урок 3. Раскраска API для Notepad++
By star
Удобство редактирования луа-скриптов в Notepad++.
   
Award
Favorite
Favorited
Unfavorite
Введение
В этой статье речь пойдёт лишь про удобство использования Notepad++ при создании скриптов Lua для Tabletop Simulator.

Оглавление
Урок 1. Скприты Lua для TTS
Урок 2. Инструменты
Урок 3. Раскраска API для Notepad++
Урок 4. Отложенные задачи во времени
Урок 5. Колоды и карты
Как использовать Notepad++
Notepad++ - это просто редактор текста. Не самый лучший редактор, но один из самых быстрых и лёгких в освоении. Вы просто устанавливаете его, - и сразу можете редактировать любой текст или код программы, как в обычном блокноте.

Основная мощь Notepad++ по сравнению с простым блокнотом - в подсветке синтаксиса. Чтобы заработала подсветка для Lua, нужно создать файл с расширением "lua". Ещё один вариант (более грубый) - в меню "Синтаксисы" выбрать L->Lua.

Теперь при редактировании у тебя подсвечиваются ключевые слова "function", "end", "for", "local" и т.п. Но как добавить подсветку API игры? По умолчанию Notepad++ ничего не знает об этом API, поэтому нам придётся вручную вбить (скопипастить отсюда) все ключевые слова. Их не так много.
  1. Перейди в меню Опции->Определение стилей...
  2. Выбери язык Lua
Справа ты увидишь различные языковые категории. Например, для категории "INSTRUCTION WORD" коротенько перечислены ключевые слова: and break do else elseif и т.д. (через пробел).

Нас интересуют категории FUNC1, FUNC2 и FUNC3. Для этих категорий (как и для всех остальных) ты можешь задать цвет, приятный глазу, а также в окошке "Пользовательские" перечислить свои ключевые слова.

Например, попробуй вбить туда слово "getObjectFromGUID" - и в твоём скрипте оно сразу перекрасится в другой цвет и станет более заметным. Это очень полезно а) для красоты б) чтобы быть уверенным, что это длинное слово без опечаток.

Далее я просто перечислю все ключевые слова из официального API, а ты уж сам решай, где и каким цветом тебе удобнее их видеть. Лично я предпочитаю все функции и переменные API выделять одним цветом, системные функции (типа os.clock) - другим цветом, а свои кастомные любимые названия (например, SAVED) - третьим цветом.

Получается довольно пёстро и красиво, и в коде удобно ориентироваться.
Глобальные свойства и функции
Когда будешь копипастить, следи, чтобы слова не склеились. Они должны быть разделены пробелом. Можешь добавить сколько угодно пробелов и переходов на новую строку. Можно даже добавить пустые строки. Но если слова будут склеены или обрезаны, то цвет у них останется обычный в коде программы.

Глобальные свойства
Lighting.ambient_type Lighting.ambient_intensity Lighting.light_intensity Lighting.reflection_intensity MusicPlayer.repeat_track MusicPlayer.shuffle MusicPlayer.playlistIndex MusicPlayer.loaded MusicPlayer.player_status Physics.play_area Time.time Time.delta_time Time.fixed_time Time.fixed_delta_time Time.frame_count Turns.enable Turns.type Turns.order Turns.reverse_order Turns.skip_empty_hands Turns.disable_interactations Turns.pass_turns Turns.turn_color WebRequest.download_progress WebRequest.error WebRequest.is_error WebRequest.is_done WebRequest.text WebRequest.upload_progress WebRequest.url

Глобальные функции
copy destroyObject flipTable getAllObjects getObjectFromGUID getSeatedPlayers group paste setLookingForPlayers spawnObject spawnObjectJSON startLuaCoroutine stringColorToRGB broadcastToAll broadcastToColor log logString logStyle printToAll printToColor sendExternalMessage Player.getAvailableColors Player.getColors Player.getPlayers Player.getSpectators Lighting.apply Lighting.getAmbientEquatorColor Lighting.getAmbientGroundColor Lighting.getAmbientSkyColor Lighting.getLightColor Lighting.setAmbientEquatorColor Lighting.setAmbientGroundColor Lighting.setAmbientSkyColor Lighting.setLightColor MusicPlayer.play MusicPlayer.pause MusicPlayer.skipForward MusicPlayer.skipBack MusicPlayer.getCurrentAudioclip MusicPlayer.setCurrentAudioclip MusicPlayer.getPlaylist MusicPlayer.setPlaylist Notes.addNotebookTab Notes.editNotebookTab Notes.getNotebookTabs Notes.removeNotebookTab Notes.getNotes Notes.setNotes Physics.cast Physics.getGravity Physics.setGravity Turns.getNextTurnColor Turns.getPreviousTurnColor UI.getAttribute UI.getAttributes UI.getCustomAssets UI.getValue UI.getXml UI.getXmlTable UI.hide UI.setAttribute UI.setAttributes UI.setCustomAssets UI.setValue UI.setXml UI.setXmlTable UI.show Wait.condition Wait.frames Wait.stop Wait.time WebRequest.get WebRequest.post WebRequest.put JSON.encode JSON.decode
События
Глобальные события
onChat onExternalMessage onFixedUpdate onLoad onObjectDestroy onObjectDrop onObjectEnterScriptingZone onObjectEnterContainer onObjectLeaveScriptingZone onObjectLeaveContainer onObjectLoopingEffect onObjectPeek onObjectPickUp onObjectRandomize onObjectSearchEnd onObjectSearchStart onObjectSpawn onObjectTriggerEffect onPlayerChangeColor onPlayerConnect onPlayerDisconnect onPlayerTurn onSave onScriptingButtonDown onScriptingButtonUp onUpdate
События объектов
filterObjectEnter onCollisionEnter onCollisionExit onCollisionStay onDestroy onDrop onPeek onPickUp onRandomize onSearchEnd onSearchStart onAttack onHit
Свойства объектов
Свойства указываются через точку. Это беда Notepad++, потому что точка считается частью ключевого слова. Так что нужно перечислить все ключевые слова целиком.

Я беру самые популярные, на мой взгляд, названия для объектов - v, obj и o. Для объекта игрока - player. Но ты можешь добавить свои варианты.
obj.angular_drag obj.auto_raise obj.bounciness obj.drag obj.dynamic_friction obj.grid_projection obj.guid obj.held_by_color obj.hide_when_face_down obj.ignore_fog_of_war obj.interactable obj.is_face_down obj.loading_custom obj.mass obj.name obj.resting obj.script_code obj.script_state obj.spawning obj.static_friction obj.sticky obj.tag obj.tooltip obj.use_gravity obj.use_grid obj.use_hands obj.use_rotation_value_flip obj.use_snap_points obj.Clock.paused v.angular_drag v.auto_raise v.bounciness v.drag v.dynamic_friction v.grid_projection v.guid v.held_by_color v.hide_when_face_down v.ignore_fog_of_war v.interactable v.is_face_down v.loading_custom v.mass v.name v.resting v.script_code v.script_state v.spawning v.static_friction v.sticky v.tag v.tooltip v.use_gravity v.use_grid v.use_hands v.use_rotation_value_flip v.use_snap_points v.Clock.paused o.angular_drag o.auto_raise o.bounciness o.drag o.dynamic_friction o.grid_projection o.guid o.held_by_color o.hide_when_face_down o.ignore_fog_of_war o.interactable o.is_face_down o.loading_custom o.mass o.name o.resting o.script_code o.script_state o.spawning o.static_friction o.sticky o.tag o.tooltip o.use_gravity o.use_grid o.use_hands o.use_rotation_value_flip o.use_snap_points o.Clock.paused
Функции объектов (методы)
Аналогично в основе имена переменных: o, v, obj.
obj.AssetBundle.getLoopingEffectIndex obj.AssetBundle.getLoopingEffects obj.AssetBundle.getTriggerEffects obj.AssetBundle.playLoopingEffect obj.AssetBundle.playTriggerEffect obj.Clock.getValue obj.Clock.pauseStart obj.Clock.setValue obj.Clock.showCurrentTime obj.Clock.startStopwatch obj.Counter.clear obj.Counter.decrement obj.Counter.getValue obj.Counter.increment obj.Counter.setValue obj.RPGFigurine.attack obj.RPGFigurine.changeMode obj.RPGFigurine.die obj.TextTool.getFontColor obj.TextTool.getFontSize obj.TextTool.getValue obj.TextTool.setFontColor obj.TextTool.setFontSize obj.TextTool.setValue obj.addForce obj.addTorque obj.getAngularVelocity obj.getBounds obj.getBoundsNormalized obj.getPosition obj.getRotation obj.getScale obj.getTransformForward obj.getTransformRight obj.getTransformUp obj.getVelocity obj.isSmoothMoving obj.positionToLocal obj.positionToWorld obj.rotate obj.scale obj.setAngularVelocity obj.setPosition obj.setPositionSmooth obj.setRotation obj.setRotationSmooth obj.setScale obj.setVelocity obj.translate obj.clearButtons obj.clearInputs obj.createButton obj.createInput obj.editButton obj.editInput obj.getButtons obj.getInputs obj.removeButton obj.removeInput obj.getColorTint obj.getCustomObject obj.getDescription obj.getFogOfWarReveal obj.getGUID obj.getJSON obj.getJoints obj.getLock obj.getName obj.getObjects obj.getQuantity obj.getRotationValue obj.getRotationValues obj.getStateId obj.getStates obj.getValue obj.setColorTint obj.setCustomObject obj.setDescription obj.setFogOfWarReveal obj.setLock obj.setName obj.setRotationValues obj.setState obj.setValue obj.flip obj.clone obj.cut obj.deal obj.dealToColorWithOffset obj.destruct obj.drop obj.highlightOn obj.highlightOff obj.jointTo obj.putObject obj.randomize obj.reload obj.reset obj.roll obj.shuffle obj.shuffleStates obj.split obj.takeObject obj.setHiddenFrom obj.setInvisibleTo obj.attachHider obj.attachInvisibleHider obj.addDecal obj.call obj.getDecals obj.getLuaScript obj.getSnapPoints obj.getTable obj.getVar obj.getVectorLines obj.setDecals obj.setLuaScript obj.setSnapPoints obj.setTable obj.setVar obj.setVectorLines obj.UI.getAttribute obj.UI.getAttributes obj.UI.getCustomAssets obj.UI.getValue obj.UI.getXml obj.UI.getXmlTable obj.UI.hide obj.UI.setAttribute obj.UI.setAttributes obj.UI.setCustomAssets obj.UI.setValue obj.UI.setXml obj.UI.setXmlTable obj.UI.show v.AssetBundle.getLoopingEffectIndex v.AssetBundle.getLoopingEffects v.AssetBundle.getTriggerEffects v.AssetBundle.playLoopingEffect v.AssetBundle.playTriggerEffect v.Clock.getValue v.Clock.pauseStart v.Clock.setValue v.Clock.showCurrentTime v.Clock.startStopwatch v.Counter.clear v.Counter.decrement v.Counter.getValue v.Counter.increment v.Counter.setValue v.RPGFigurine.attack v.RPGFigurine.changeMode v.RPGFigurine.die v.TextTool.getFontColor v.TextTool.getFontSize v.TextTool.getValue v.TextTool.setFontColor v.TextTool.setFontSize v.TextTool.setValue v.addForce v.addTorque v.getAngularVelocity v.getBounds v.getBoundsNormalized v.getPosition v.getRotation v.getScale v.getTransformForward v.getTransformRight v.getTransformUp v.getVelocity v.isSmoothMoving v.positionToLocal v.positionToWorld v.rotate v.scale v.setAngularVelocity v.setPosition v.setPositionSmooth v.setRotation v.setRotationSmooth v.setScale v.setVelocity v.translate v.clearButtons v.clearInputs v.createButton v.createInput v.editButton v.editInput v.getButtons v.getInputs v.removeButton v.removeInput v.getColorTint v.getCustomObject v.getDescription v.getFogOfWarReveal v.getGUID v.getJSON v.getJoints v.getLock v.getName v.getObjects v.getQuantity v.getRotationValue v.getRotationValues v.getStateId v.getStates v.getValue v.setColorTint v.setCustomObject v.setDescription v.setFogOfWarReveal v.setLock v.setName v.setRotationValues v.setState v.setValue v.flip v.clone v.cut v.deal v.dealToColorWithOffset v.destruct v.drop v.highlightOn v.highlightOff v.jointTo v.putObject v.randomize v.reload v.reset v.roll v.shuffle v.shuffleStates v.split v.takeObject v.setHiddenFrom v.setInvisibleTo v.attachHider v.attachInvisibleHider v.addDecal v.call v.getDecals v.getLuaScript v.getSnapPoints v.getTable v.getVar v.getVectorLines v.setDecals v.setLuaScript v.setSnapPoints v.setTable v.setVar v.setVectorLines v.UI.getAttribute v.UI.getAttributes v.UI.getCustomAssets v.UI.getValue v.UI.getXml v.UI.getXmlTable v.UI.hide v.UI.setAttribute v.UI.setAttributes v.UI.setCustomAssets v.UI.setValue v.UI.setXml v.UI.setXmlTable v.UI.show o.AssetBundle.getLoopingEffectIndex o.AssetBundle.getLoopingEffects o.AssetBundle.getTriggerEffects o.AssetBundle.playLoopingEffect o.AssetBundle.playTriggerEffect o.Clock.getValue o.Clock.pauseStart o.Clock.setValue o.Clock.showCurrentTime o.Clock.startStopwatch o.Counter.clear o.Counter.decrement o.Counter.getValue o.Counter.increment o.Counter.setValue o.RPGFigurine.attack o.RPGFigurine.changeMode o.RPGFigurine.die o.TextTool.getFontColor o.TextTool.getFontSize o.TextTool.getValue o.TextTool.setFontColor o.TextTool.setFontSize o.TextTool.setValue o.addForce o.addTorque o.getAngularVelocity o.getBounds o.getBoundsNormalized o.getPosition o.getRotation o.getScale o.getTransformForward o.getTransformRight o.getTransformUp o.getVelocity o.isSmoothMoving o.positionToLocal o.positionToWorld o.rotate o.scale o.setAngularVelocity o.setPosition o.setPositionSmooth o.setRotation o.setRotationSmooth o.setScale o.setVelocity o.translate o.clearButtons o.clearInputs o.createButton o.createInput o.editButton o.editInput o.getButtons o.getInputs o.removeButton o.removeInput o.getColorTint o.getCustomObject o.getDescription o.getFogOfWarReveal o.getGUID o.getJSON o.getJoints o.getLock o.getName o.getObjects o.getQuantity o.getRotationValue o.getRotationValues o.getStateId o.getStates o.getValue o.setColorTint o.setCustomObject o.setDescription o.setFogOfWarReveal o.setLock o.setName o.setRotationValues o.setState o.setValue o.flip o.clone o.cut o.deal o.dealToColorWithOffset o.destruct o.drop o.highlightOn o.highlightOff o.jointTo o.putObject o.randomize o.reload o.reset o.roll o.shuffle o.shuffleStates o.split o.takeObject o.setHiddenFrom o.setInvisibleTo o.attachHider o.attachInvisibleHider o.addDecal o.call o.getDecals o.getLuaScript o.getSnapPoints o.getTable o.getVar o.getVectorLines o.setDecals o.setLuaScript o.setSnapPoints o.setTable o.setVar o.setVectorLines o.UI.getAttribute o.UI.getAttributes o.UI.getCustomAssets o.UI.getValue o.UI.getXml o.UI.getXmlTable o.UI.hide o.UI.setAttribute o.UI.setAttributes o.UI.setCustomAssets o.UI.setValue o.UI.setXml o.UI.setXmlTable o.UI.show
Свои названия
Когда редактор подсвечивает твои собственные названия в коде, это особо приятно и красиво для тебя самого. У тебя наверняка будут какие-то часто используемые функции или переменные. Добавляй их в свой список тоже. Лучше (имхо), если они будут выделены своим цветом (FUNC3).

Например, это могут быть такие слова:
SAVED SAVED.CARDS SAVED.PLAYERS PLAYERS CACHE CACHE_CURSOR CACHE_TYPE UpdateCache inst.obj inst.pos inst.active inst.type card.obj card.pos card.active card.zone DoTaskInTime DoPeriodicTask CancelTask TASKS time_now