Новости‎ > ‎Might and Magic‎ > ‎

MMExtension v2.1

MMExtension - это мощное расширение MM6-8 для моддинга, с редактором уровней. Оно использует скрипты на Lua, позволяет вызывать все команды внутреннего языка скриптов M&M (команды evt) и позволяет делать многое другое. В будущем он может быть дополнен командами, нужными для моддеров. Не пугайтесь задержки при первых двух запусках - она вызвана генерацией Data\Tables.

Скачать MMExtension
Скачать исходники библиотек MMExtension

Скачать MMEditor v2.1
Полноценный редактор уровней. (исходники MMEditorDlg.dll, Delphi 2006)

Скачать скрипт для игры соло в MM6/MM7
Очень примитивный скрипт для игры одним игроком в MM6/MM7. Распакуйте в папку игры, запустите игру, нажмите Ctrl+F1, напишите "vars.PartySize = 1" и нажмите Ctrl+Enter. Это приведет к тому, что Вы будете играть одним игроком. Чтобы играть двумя или тремя, напишите "vars.PartySize = 2" или "vars.PartySize = 3" соответственно.

Скачать докомпилированные скрипты MM6
Скачать докомпилированные скрипты MM7
Скачать докомпилированные скрипты MM8
Используйте декомпилированные скрипты как пример использования команд Evt.

Тема для обсуждения MMExtension на английском.

Помощь для MMExtension находится на стадии заброшенной разработки. Только примеры и вводная часть обновляются. Обязательно посмотрите примеры заданий. Больше примеров можно найти в теме на Celestial Heavens (см. чуть выше).

Contents

  1. 1 Общая информация
    1. 1.1 Декомпилированные скрипты
  2. 2 Примеры
    1. 2.1 Привет мир!
    2. 2.2 Задания
    3. 2.3 Управление агрессией монстров в MM6
    4. 2.4 Умения и заклинания игроков
    5. 2.5 Еще примеры
  3. 3 Evt
    1. 3.1 Commands
      1. 3.1.1 evt.EnterHouse
      2. 3.1.2 evt.PlaySound
      3. 3.1.3 evt.MoveToMap
      4. 3.1.4 evt.OpenChest
      5. 3.1.5 evt.FaceExpression
      6. 3.1.6 evt.DamagePlayer
      7. 3.1.7 evt.SetSnow
      8. 3.1.8 evt.SetTexture
      9. 3.1.9 evt.SetTextureOutdoors
      10. 3.1.10 evt.ShowMovie
      11. 3.1.11 evt.SetSprite
      12. 3.1.12 evt.Cmp
      13. 3.1.13 evt.SetDoorState
      14. 3.1.14 evt.Add
      15. 3.1.15 evt.Subtract
      16. 3.1.16 evt.Set
      17. 3.1.17 evt.SummonMonsters
      18. 3.1.18 evt.CastSpell
      19. 3.1.19 evt.SpeakNPC
      20. 3.1.20 evt.SetFacetBit
      21. 3.1.21 evt.SetFacetBitOutdoors
      22. 3.1.22 evt.SetMonsterBit
      23. 3.1.23 evt.Question
      24. 3.1.24 evt.StatusText
      25. 3.1.25 evt.SetMessage
      26. 3.1.26 evt.SetLight
      27. 3.1.27 evt.SimpleMessage
      28. 3.1.28 evt.SummonObject
      29. 3.1.29 evt.SetNPCTopic
      30. 3.1.30 evt.MoveNPC
      31. 3.1.31 evt.GiveItem
      32. 3.1.32 evt.ChangeEvent
      33. 3.1.33 evt.CheckSkill
      34. 3.1.34 evt.SetNPCGroupNews
      35. 3.1.35 evt.SetNPCItem
      36. 3.1.36 evt.SetNPCGreeting
      37. 3.1.37 evt.CheckMonstersKilled
      38. 3.1.38 evt.ChangeGroupToGroup
      39. 3.1.39 evt.ChangeGroupAlly
      40. 3.1.40 evt.CheckSeason
      41. 3.1.41 evt.SetMonGroupBit
      42. 3.1.42 evt.SetChestBit
      43. 3.1.43 evt.FaceAnimation
      44. 3.1.44 evt.SetMonsterItem
      45. 3.1.45 evt.StopDoor
      46. 3.1.46 evt.CheckItemsCount
      47. 3.1.47 evt.RemoveItems
      48. 3.1.48 evt.Jump
      49. 3.1.49 evt.IsTotalBountyHuntingAwardInRange
      50. 3.1.50 evt.IsPlayerInParty
  4. 4 Events
  5. 5 Utility Functions
  6. 6 Game Structures
    1. 6.1 Game
    2. 6.2 Map
    3. 6.3 Party
    4. 6.4 Game.Mouse
    5. 6.5 Game.Weather
    6. 6.6 structs.Player
    7. 6.7 structs.StartStat
    8. 6.8 structs.TilesetDef
    9. 6.9 structs.Item
    10. 6.10 structs.ObjectRef
    11. 6.11 structs.NPC
    12. 6.12 structs.SpellBuff
    13. 6.13 structs.TravelInfo
    14. 6.14 structs.MonsterAttackInfo
    15. 6.15 structs.MonsterShedule
    16. 6.16 structs.MonstersTxtItem
    17. 6.17 structs.MapMonster
    18. 6.18 structs.TownPortalTownInfo
    19. 6.19 structs.LloydBeaconSlot
    20. 6.20 structs.MapStatsItem
    21. 6.21 structs.ItemsTxtItem
    22. 6.22 structs.SpellInfo
    23. 6.23 structs.SpellsTxtItem
    24. 6.24 structs.Events2DItem
    25. 6.25 structs.ActionItem
    26. 6.26 structs.SpellEffect
    27. 6.27 structs.MapObject
    28. 6.28 structs.MapChest
    29. 6.29 structs.MapSprite
    30. 6.30 structs.MapVertex
    31. 6.31 structs.BSPNode
    32. 6.32 structs.MapFacet
    33. 6.33 structs.FacetData
    34. 6.34 structs.ModelFacet
    35. 6.35 structs.MapModel
    36. 6.36 structs.MapRoom
    37. 6.37 structs.MapLight
    38. 6.38 structs.MapOutline
    39. 6.39 structs.SpawnPoint
    40. 6.40 structs.MapDoor
    41. 6.41 structs.DecListItem
    42. 6.42 structs.SFTItem
    43. 6.43 structs.SFT
    44. 6.44 structs.PFTItem
    45. 6.45 structs.IFTItem
    46. 6.46 structs.TFTItem
    47. 6.47 structs.DChestItem
    48. 6.48 structs.OverlayItem
    49. 6.49 structs.ObjListItem
    50. 6.50 structs.MonListItem
    51. 6.51 structs.SoundsItem
    52. 6.52 structs.EventLine
  7. 7 Constants
    1. 7.1 evt.Players
    2. 7.2 evt.VarNum
    3. 7.3 const.Condition
    4. 7.4 const.Damage
    5. 7.5 const.ItemType
    6. 7.6 const.MonsterBits
    7. 7.7 const.FacetBits
    8. 7.8 const.SpriteBits
    9. 7.9 const.ChestBits
    10. 7.10 const.Stats
    11. 7.11 const.Skills
    12. 7.12 const.Class
    13. 7.13 const.Race
    14. 7.14 const.ObjectRefKind
    15. 7.15 const.AIState
    16. 7.16 const.FaceAnimation
    17. 7.17 const.Season
    18. 7.18 const.PartyBuff
    19. 7.19 const.PlayerBuff
    20. 7.20 const.MonsterBuff
    21. 7.21 onst.MonsterBonus
    22. 7.22 const.Screens
    23. 7.23 const.Keys
    24. 7.24 Other Constants

Общая информация

Для моддинга Вам понадобятся MMArchive, mm8leveleditor и MM Map Viewer.
Извлеките все файлы *.txt из соответствующих архивов LOD: icons.lod в MM6, events.lod в MM7 или EnglishT.lod в MM8. Вам они понадобятся.
Проще всего начать с редактирования текстовых таблиц с помощью TxtEdit. В добавок к файлам *.txt, которые Вы извлекли из LOD-архива MMExtension создаст некоторые таблицы в папке Data\Tables при первом запуске. Вы можете менять в них любые значения и добавлять новые строки ко многим из них.

Lua - это простой, но гибкий скриптовый язык. Вы можете прочитать о нём здесь, здесь и здесь. MMExtension предоставляет все стандартные библиотеки Lua и LuaJIT.
Раньше я использовал SciTE для редактирования скриптов Lua. Вот некоторые мои настройки для него:
Откройте SciTEGlobal.properties.

Найдите и установите следующие параметры:
tabsize=2
indent.size=2
braces.autoclose=0

Найдите user.shortcuts=\
удалите строку с Alt+X
добавьте строку: Ctrl+Shift+Z|IDM_REDO|\
добавьте строку: Ctrl+R|IDM_REPLACE|\

Все скрипты находятся в директории Scripts. Скрипты в разных подпапках загружаются и выгружаются в разные моменты:
 Подпапка  Описание
Core Скрипты ядра MMExtension. Не кладите сюда свои скрипты.
General Эти скрипты загружаются перед началом игры и никогда не выгружается. Это место для скриптов, которые изменяют свойства классов (Game.Classes и т.д.) и другие правила игры.
Global Эти скрипты загружаются, когда запускается новая игра или загружается сохраненная игра, и выгружается когда пользователь выходит в главное меню или загружает другую игру. Это хорошее место для скриптов заданий.
Localization Эти скрипты загружаются при старте игры перед загрузкой скриптов из папки "General" и могут быть загружены снова вызовом функции ReloadLocalization(). Они предназначены для локализации модов.
Maps Эти скрипты соответствуют картам.Например, скрипты под названием "oute3.lua" и "любое_имя.oute3.lua" будет загружаться при загрузке карты "Oute3.odm" (Нью-Sorpigal) и выгружаться при выходе из неё.
Modules Эти скрипты не загружаются автоматически. Вместо этого, их можно загружать при помощи функции require().
Structs Эти скрипты предназначены для определения структур. Эти вещи низкого уровня, так что пока я не буду описывать их. Если вы нашли интересный адрес с помощью ArtMoney или дизассемблера, спросите меня.
Вы можете создавать свои собственные подпапки. Скрипты в них не будут загружаться автоматически и не будет выгружаться.

Слово "выгружать" означает удаление всех событий скрипта.В результате глобальные скрипты и скрипты карт выгружаются, а затем загружаются снова, вы можете их изменить и протестировать изменения, просто перезагрузив сохраненную игру. Не нужно для этого выходить из игры Меч и Магия.

Отладочная консоль - это удобный способ быстро проверить что-нибудь. Нажмите Ctrl + F1, чтобы открыть её. Здесь Вы можете писать любые скрипты. Например, dump(Party[0].Stats) выведет значения характеристик первого персонажа.
Нажмите Ctrl + Enter, чтобы выполнить скрипт.
Нажмите Ctrl + E, чтобы повторить последний скрипт.
Нажмите Esc, чтобы закрыть консоль.

Переменные, используемые скриптами, могут быть 4 типов:
Локальные переменные, объявленные со словом local в Lua. Они могут быть использованы в месте, где они были объявлены (т.е. функции, скрипты) и хранятся не в сохранении игры.
Глобальные переменные. Они могут быть доступны из любого места, но они не хранятся в сохранении игры.
Переменные в таблице Vars. Они могут быть доступны из любого места и хранятся в сохранении игры
Переменные в таблице MapVars. Они относятся к текущей карте. При загрузке карты, соответствующая таблица с переменными устанавливается, как MapVars. Они хранятся в сохранении игры.

Перед тем, как читать о декомпилиррованных скриптах, можете посмотреть несколько примеров скриптов.


Декомпилированные скрипты

Оригинальные скрипты Меча и Магии хранятся в двоичном формате в файлах с расширением ".evt".MMExtension может декомпилировать эти скрипты. В верхней части этой страницы располагаются ссылки для скачивания декомпилированных скриптов оригинальной игры.
Декомпилированные скрипты в псевдо-коде.Большинство команд, используемых в них аналогичны командам, доступным для MMExtension, как описано в разделе Evt.Некоторые команды заменены другими, лучшими аналогов.
Ниже приведены различия между ними и реальными командами MMExtension:
1) "evt." не пишется в них.
2) Они используют jumps, а не if-then и loops. У них есть свои пронумерованные строки.
3) Они почти всегда проставляют имена параметров в вызовах функций Evt. Вы можете сделать то же самое, но вы также можете использовать вызовы без имен параметров.
Некоторые команды осуществляется по-разному в MMExtension. Например, вы не можете использовать команду evt.OnTimer, вместо этого вы должны использовать Timer function.
5) Есть и другие отличия в синтаксисе скриптов - например, определение событий

Пример:

event 101
  0:  Cmp  {"QBits", Value = 300,   jump = 7}
  1:  Player = Players.all
  2:  Cmp  {"Inventory", Value = 489,   jump = 5}  -- "Key to Goblinwatch"
  3:  StatusText  {Str = 18}  -- "The door is locked."
  4:  Exit  {}

  5:  Subtract  {"Inventory", Value = 489}  -- "Key to Goblinwatch"
  6:  Set  {"QBits", Value = 300}
  7:  MoveToMap  {X = 601, Y = 6871, Z = 177, Direction = 1400, LookAngle = 0, SpeedZ = 0, HouseId = 171, Icon = 5, Name = "D01.blv"}  -- "Goblinwatch"
  8:  Exit  {}

  9:  EnterHouse  {Id = 171}  -- "Goblinwatch"
end

Как скрипт MMExtension он может выглядеть так:

Game.MapEvtLines:RemoveEvent(101)  -- remove original event
evt.house[101] = 171  -- name of this house is "Goblinwatch" and it will be used as hint. EnterHouse command in the end of decompiled script has the same meaning.
evt.map[101] = function()
  if not evt.Cmp("QBits", 300) then
    evt.Player = evt.Players.All
    if not evt.Cmp("Inventory", 489) then  -- "Key to Goblinwatch"
      return evt.StatusText(18)  -- "The door is locked."
    end
    evt.Subtract("Inventory", 489)  -- "Key to Goblinwatch"
    evt.Set("QBits", 300)
  end
  evt.MoveToMap{X = 601, Y = 6871, Z = 177, Direction = 1400, LookAngle = 0, SpeedZ = 0, HouseId = 171, Icon = 5, Name = "D01.blv"}  -- "Goblinwatch"
end

Обратите внимание, что для команды Cmp, Set, Add и Subtract первый параметр записывается без имени даже в декомпилированных скриптах. Это сделано для улучшения читабельности. Вы можете так же сделать с любой командой в ваших скриптах.

Это была прямая конвертация скрипта. Если же использовать возможности MMExtension, то скрипт, делающий то же самое (если играть с ним с самого начала игры), будет выглядеть так:

local TXT = Localize{
  DoorIsLocked = "The door is locked."
}
Game.MapEvtLines:RemoveEvent(101)  -- remove original event
evt.house[101] = 171  -- name of this house is "Goblinwatch" and it will be used as hint. EnterHouse command in the end of decompiled script has the same meaning.
evt.map[101] = function()
  if not mapvars.CastleUnlocked and not TakeItemFromParty(489) then  -- "Key to Goblinwatch"
    return Game.ShowStatusText(TXT.DoorIsLocked)
  end
  mapvars.CastleUnlocked = true
  evt.MoveToMap{Name = "D01.blv", X = 601, Y = 6871, Z = 177, Direction = 1400, LookAngle = 0, SpeedZ = 0, HouseId = 171, Icon = 5}  -- "Goblinwatch"
end

Вы можете декомпилировать скрипты TCC или Rev4 мода самостоятельно. Для этого извлеките все *.evt и *.str файлы из того же архива LOD что вы использовали для извлечения *. TXT файлов. Положите их в папку "Decompile" в папку с игрой, создайте в ней подпапку "Scripts" и выполните этот простой скрипт:

for f in files.find("Decompile/*.evt") do
  evt.Decompile(f, 0, "Decompile/Scripts/"..files.setext(files.name(f), ".txt"))
end


Примеры

Привет мир!

Для того, чтобы сделать первый скрипт, создайте файл "oute3.lua" в каталоге Scripts\Maps и напишите в нём этот текст:
function events.LoadMap()
Message("Hello world!")
end
Этот скрипт будет показывать окно сообщения каждый раз при входе в New Sorpigal
Чтобы показать родное сообщение МM, вы можете использовать подобный скрипт:
local function HelloWorld()
  SimpleMessage("Hello world!")
  RemoveTimer(HelloWorld)
end

Timer(HelloWorld, 10, true)
Мне пришлось создать таймер, потому что Меч и Магия не поддерживает показ простых сообщений в момент загрузки карты.

Задания

Оригинальные задания MM были разбросаны по нескольким файлам и программировались вручную, это неудобно и чревато ошибками. Поддержка заданий в MMExtension прошла несколько итераций и сейчас я ею очень доволен. Здесь 2 примера. Они сделаны для MM8, но на MM7 тоже будут работать, если Вы найдёте персонажей, к которыми они применяются. Один файл создаёт простое задание с несколькими дополнительными пунктами разговора. Другой - создаёт сложный древовидный диалог, но код остаётся вполне элегантным. Что касается MM6, в нём нет приветствий персонажей и всего 3 пункта диалога, плюс 2 исключительно текстовых пункта. Первый пример задания на нём должен работать.

Управление агрессией монстров в MM6

Положите этот скрипт в папку Scripts\Global или Scripts\General. Это делает лучников в Free Haven дружественными, а крестьян - агрессивными. В других местах лучники будут по-прежнему агрессивными, а крестьяне - дружелюбными.
function events.BeforeLoadMap() 
if Game.Map.Name == "outc2.odm" then
LocalMonstersTxt()

Game.MonstersTxt[1].HostileType = 0 -- ArcherA Game.MonstersTxt[2].HostileType = 0 -- ArcherB Game.MonstersTxt[3].HostileType = 0 -- ArcherC Game.MonstersTxt[121].HostileType = 4 -- PeasantF1A Game.MonstersTxt[122].HostileType = 4 -- PeasantF1B Game.MonstersTxt[123].HostileType = 4 -- PeasantF1C end end
Вместо проверки имени карты вы можете поставить любое условие. Например, после того как игрок выполнит задание, вы можете сделать некоторых монстров дружественными или агрессивными.

Умения и заклинания игроков

Здесь есть кое-какие скрипты, показывающие, как можно работать с умениями и заклинаниями. Скопируйте приглянувшийся скрипт в отладочную консоль, чтобы протестировать его.
-- get all spells
for _,pl in Party do
  for i in pl.Spells do
    pl.Spells[i] = true
  end
end

-- get Expert Perception for all players
for _,pl in Party do
  local skill, mastery = SplitSkill(pl.Skills[const.Skills.Perception])
pl.Skills[const.Skills.Perception] = JoinSkill(math.max(skill, 4), math.max(mastery, const.Expert))
end -- get all skills at Master 12 for _,pl in Party do for i,val in pl.Skills do local skill, mastery = SplitSkill(val)
pl.Skills[i] = JoinSkill(math.max(skill, 12), math.max(mastery, const.Master))
end end -- get all learned skills at Master 12 for _,pl in Party do for i,val in pl.Skills do if val ~= 0 then local skill, mastery = SplitSkill(val)
pl.Skills[i] = JoinSkill(math.max(skill, 12), math.max(mastery, const.Master))
end end end -- learn all available skills at Expert (MM6) for _,pl in Party do for i,learn in Game.ClassKinds.StartingSkills[pl.Class:div(3)] do if learn > 0 then -- can learn local skill, mastery = SplitSkill(pl.Skills[i])
skill = math.max(skill, 4) -- learn at least level 4 mastery = math.max(mastery, const.Expert) -- learn the mastery pl.Skills[i] = JoinSkill(skill, mastery)
end end
end -- learn all available skills at their maximum level (MM7,8) local LearnLevel = {[0] = 0, 1, 4, 7, 12} for _,pl in Party do for i,learn in Game.Classes.Skills[pl.Class] do local skill, mastery = SplitSkill(pl.Skills[i])
skill = math.max(skill, LearnLevel[learn]) -- learn at least the usual needed level mastery = math.max(mastery, learn) -- learn the mastery pl.Skills[i] = JoinSkill(skill, mastery)
end end

Еще примеры

-- summon monster (Peasant)
function events.LoadMap()
local mon = SummonMonster(151, Party.X, Party.Y, Party.Z, true)
mon.NPC_ID = 52 mon.Hostile = false end -- see global event number (copy to console to quickly test what event is triggered by a dialog item) -- on: function events.EvtGlobal(evt)
Message(evt)
end -- off: events.EvtGlobal.clear()


Evt


Commands



evt.EnterHouse

Comment

 Parameters:
Id -- of 2DEvent -- 600 = you won -- 601 = you won 2 / you lost

evt.PlaySound

Comment

 Parameters:
Id
X
Y

evt.MoveToMap

-- Notes: -- If cancel is pressed, the execution is stopped -- If X,Y,Z,Direction,LookAngle,SpeedZ are all 0, the party isn't moved -- If HouseId and Icon are 0, the enter dungeon dialog isn't shown Comment

 Parameters:
X
Y
Z
Direction -- -1 = special case
LookAngle
SpeedZ
HouseId -- 2DEvent ID
Icon
Name -- starts with "0" => current map

evt.OpenChest

Comment

 Parameters:
Id

evt.FaceExpression

Comment

 Parameters:
Player
Cadre

evt.DamagePlayer

Comment

 Parameters:
Player
DamageType
Damage

evt.SetSnow

Comment

 Parameters:
EffectId -- only 00 available
On

evt.SetTexture

Comment

 Parameters:
Facet Facet ID
Name

evt.SetTextureOutdoors

[MM6] Comment

 Parameters:
Model Model index
Facet Facet index
Name

evt.ShowMovie

[MM7, MM8] Comment

 Parameters:
DoubleSize -- not for SMK
unk -- boolean?
Name

evt.SetSprite

Comment

 Parameters:
SpriteId
Visible -- bit 0x20 of sprite
Name in case of "0" sprite is removed ?)

evt.Cmp

Comment

 Parameters:
VarNum -- variable number
Value -- compare with

evt.SetDoorState

Comment

 Parameters:
Id
State -- 00 - off, 01 - on, 02 - switch state if the door isn't moving, 03 - switch state

evt.Add

Comment

 Parameters:
VarNum
Value

evt.Subtract

Comment

 Parameters:
VarNum
Value

evt.Set

Comment

 Parameters:
VarNum
Value

evt.SummonMonsters

Comment

 Parameters:
TypeIndexInMapStats
Level
Count
X
Y
Z
NPCGroup [MM7, MM8]
unk [MM7, MM8]

evt.CastSpell

Comment

 Parameters:
Number
SkillLevel
Skill
FromX
FromY
FromZ
ToX
ToY
ToZ

evt.SpeakNPC

Comment

 Parameters:
NPC

evt.SetFacetBit

Comment

 Parameters:
Id -- id of facets group in MM7-8
Bit
On

evt.SetFacetBitOutdoors

[MM6] Comment

 Parameters:
Model -- number of structure in map those shown on left click in MapViewer)
Facet -- -1 = for all faces in structure
Bit
On

evt.SetMonsterBit

[MM7, MM8] Comment

 Parameters:
Monster
Bit
On

evt.Question

Comment

 Parameters:
Question
Answer1
Answer2

evt.StatusText

Comment

 Parameters:
Str

evt.SetMessage

Comment

 Parameters:
Str

evt.SetLight

Comment

 Parameters:
Id -- light group id in MM7-8
On

evt.SimpleMessage

Comment

 Has no parameters.

evt.SummonObject

Comment

 Parameters:
Type -- dobjlist.bin
X
Y
Z
Speed
Count
RandomAngle

evt.SetNPCTopic

Comment

 Parameters:
NPC
Index
Event

evt.MoveNPC

Comment

 Parameters:
NPC
HouseId -- 2DEvents

evt.GiveItem

Comment

 Parameters:
Strength -- 1-6 like described in the end of STDITEMS.TXT)
Type
Id -- If Id is 0, the item is chosen by random from the specified class with specified strength, -- otherwise, ItemType and ItemStremgth determine the enchancements -- If both unk_1 and unk_2 are 0, the item is identified and has no enchancements

evt.ChangeEvent

Comment

 Parameters:
NewEvent -- global event) for barrels etc.

evt.CheckSkill

Comment

 Parameters:
SkillType
SkillMastery
OrSkillLevel -- Includes "Double effect" enchantments and NPC bonuses

evt.SetNPCGroupNews

[MM7, MM8] Comment

 Parameters:
NPCGroup
NPCNews

evt.SetNPCItem

[MM7, MM8] Comment

 Parameters:
NPC
Item
On

evt.SetNPCGreeting

[MM7, MM8] Comment

 Parameters:
NPC
Greeting

evt.CheckMonstersKilled

[MM7, MM8] Comment

 Parameters:
CheckType -- 0..3/4, 0 = any monster, 1 - in group, 2 - of type, 3 - specific monster
Id -- 0 - not used, 1 - group id, 2 - monster type, 3 - monster id
Count -- 0 - all must be alive
unk [MM8] Unknown

evt.ChangeGroupToGroup

[MM7, MM8] Comment

 Parameters:
Old
New

evt.ChangeGroupAlly

[MM7, MM8] Comment

 Parameters:
Group
Ally

evt.CheckSeason

[MM7, MM8] Comment

 Parameters:
Season

evt.SetMonGroupBit

[MM7, MM8] Comment

 Parameters:
NPCGroup
Bit
On

evt.SetChestBit

[MM7, MM8] Comment

 Parameters:
ChestId
Bit
On

evt.FaceAnimation

[MM7, MM8] Comment

 Parameters:
Player
Animation

evt.SetMonsterItem

[MM7, MM8] Comment

 Parameters:
Monster
Item
Has

evt.StopDoor

[MM8] Comment

 Parameters:
Id

evt.CheckItemsCount

[MM8] Comment

 Parameters:
MinItemIndex
MaxItemIndex
Count

evt.RemoveItems

[MM8] Comment

 Parameters:
MinItemIndex
MaxItemIndex
Count

evt.Jump

[MM8] Comment

 Parameters:
Direction
ZAngle
Speed
unk

evt.IsTotalBountyHuntingAwardInRange

[MM8] Comment

 Parameters:
MinGold
MaxGold

evt.IsPlayerInParty

[MM8] Comment

 Parameters:
Id -- Roster.txt


Events




Utility Functions



Game Structures


Game

Comment

 Fields:
Mouse
Weather
Classes.HPFactor
Classes.SPFactor
Classes.Skills -- [MM7, MM8] [MM7, MM8]
Classes.HPBase -- [MM8]
Classes.SPBase -- [MM8]
Classes.StartingStats -- [MM8]
ClassKinds.HPBase -- [MM6, MM7]
ClassKinds.SPBase -- [MM6, MM7]
ClassKinds.StartingStats -- [MM6]
ClassKinds.StartingSkills -- 0 - not available, 1 - given on start, 2 - can choose on start, 3 - can learn
Races.StartingStats [MM7]
WindowHandle
Windowed
SkillRecoveryTimes
CurrentScreen
CurrentCharScreen
StatsNames
StatsDescriptions
SkillNames
SkillDescriptions
ClassNames
ClassDescriptions
Actions
NeedRedraw
StatusMessage
MapStats
ItemsTxt
MonstersTxt
PlaceMonTxt -- [MM7, MM8]
MoveToMap.Pos
MoveToMap.X
MoveToMap.Y
MoveToMap.Z
MoveToMap.Direction
MoveToMap.LookAngle
MoveToMap.SpeedZ
MoveToMap.Defined
Lucida_fnt
Smallnum_fnt
Book_fnt
Spell_fnt
Arrus_fnt
Create_fnt
Comic_fnt
Autonote_fnt
Book2_fnt
Cchar_fnt
TextBuffer
TextBuffer2
KeyCodes
KeyTypes
Time = 256*(minutes since 00 AM of the starting year)
The starting year is 1965 in MM6, 1968 in MM7 and 1972 in MM8.
Year (1168 - ...)
Month (0 - 11)
WeekOfMonth (0 - 3)
DayOfMonth (0 - 27)
Hour (0 - 23)
Minute (0 - 59)
Second (0 - 59)
StateBits
InJump
NeedRender
Drowning
TurnBased
PlaySoundStruct
RedbookHandle
MSSHandle
MasterVolume [MM6]
SmackVideo
BinkVideo [MM7, MM8]
EquipStat2ItemSlot -- (24) ?
Paused -- checked by event timers
Paused2 -- checked by water damage
ShopItems
ShopSpecialItems
GuildItems
ScanlineOffset -- [MM6, MM7]
ObjectByPixel
ArmageddonTimeLeft -- maximum is 417
ArmageddonDamageAddition -- in addition to 50
Houses -- 2DEvents
NPCTopic
NPCText
NPC
Spells
SpellsTxt
QuestsTxt
CtrlPressed
TownPortalInfo
TownPortalX
TownPortalY
TownPortalWidth
TownPortalHeight
NewGameMap
HostileTxt -- [MM7, MM8]
GlobalEvtLines
MapEvtLines

 Functions:
CalcSpellDamage  ( Spell, Skill, Mastery, MonsterHP )
GetSpellDamageType  ( Spell )
GetStatisticEffect  ( Stat )
ShowStatusText  ( Text, Time = 2 )
EscMessage  ( Msg, unk = 1 )
ShowMovie  ( Name, Y = 0, DoubleSize = 1 ) [MM6] Don't work when used in a dialog.
SetInterfaceColor  ( Alignment, unk = 1 ) [MM7] 0 - dark, 1 - neutral, 2 - good
LoadSound  ( SoundId, unk )
PlaySound  ( SoundId, Object, Loops, X, Y, unk, Volume, PlaybackRate )


Map

Comment

 Fields:
Name Returned always in lower case.
IndoorOrOutdoor
Monsters
Vars
Objects -- items, spells effects
Sprites
Chests
MapStatsIndex
Spawns
Refilled
RefillCount
LastRefillDay
LastVisitDay
Reputation [MM7, MM8]
HeightMap
TileMap
UnknownMap
Models
IDList -- IDs of sprites on map
IDOffsets -- OMAP - offsets in IDList
VisibleMap1
VisibleMap2
Vertexes
Facets
FacetData
Rooms
Lights
Doors
BSPNodes
Outlines
VisibileOutlines

 Functions:
Render  ()
IsIndoors  ()
IsOutdoors  ()
LoadTileset  ( Id )


Party

Comment

 Fields:
Pos
X
Y
Z
Direction
LookAngle
SpeedZ
FallStartZ
PlayersArray
PlayersIndexes -- [MM8]
0 - 4
Players[0] - Players[4]

Count
Players.Count

CurrentPlayer
LastRegenerationTime
SpellBuffs
HiredNPC -- [MM6, MM7]
Reputation
Flying
Gold
BankGold
Food
Fine [MM7, MM8]
Deaths
PritsonTerms
MontersHunted -- [MM7, MM8]
MonsHuntTarget -- [MM7, MM8]
MonsHuntKilled -- [MM7, MM8]
QBits
AutonotesBits
InArenaQuest -- [MM7, MM8]
ArenaWinsPage -- [MM7, MM8]
ArenaWinsSquire -- [MM7, MM8]
ArenaWinsKnight -- [MM7, MM8]
ArenaWinsLord -- [MM7, MM8]
ArtifactsFound -- [MM7, MM8]
History -- [MM7, MM8]

 Functions:
FindActivePlayer  ()
RestAndHeal  ()
HasNPCProfession  ( Prof )
GetFame  ()
GetRepuatation  ()
AddGold  ( Gold, IgnoreFollowers )


Game.Mouse

Comment

 Fields:
X
Y
Item

 Methods:
SetIcon  ( Name = "MICON1" )
RemoveItem  ()
AddItem  ()
ReleaseItem  () -- take or drop


Game.Weather

Comment

 Fields:
Snow
Shade -- 0 = sunny, 1 = dark, 2 = misty
Fog
FogRange1
FogRange2

 Functions:
SetFog  ( range1, range2 )
RandomFog  ( LightChance, MiddleChance, ThickChance )


structs.Player

Comment

 Fields:
Conditions
Experience
Face
Name
Biography -- [MM8]
Sex
Class
Stats[stat].Base Base value of statistic. This value is the sum of permanent bonuses by barrels, wells etc. Bonuses by items and other factors aren't included here.
Stats[stat].Bonus Bonus to statistic. This value is the sum of temporary bonuses by wells, fountains. Bonuses by spells and conditions aren't included here.
MightBase
MightBonus
IntellectBase
IntellectBonus
PersonalityBase
PersonalityBonus
EnduranceBase
EnduranceBonus
SpeedBase
SpeedBonus
AccuracyBase
AccuracyBonus
LuckBase
LuckBonus

ArmorBonus
LevelBase
LevelBonus
AgeBonus
Skills
Awards
Spells
UsedBlackPotions
Items
Inventory -- positive: item number, negative: main inventoy slot number
Resistances[res].Base Base value of resistance. This value is the sum of permanent bonuses. Bonuses by items and other factors aren't included here.
Resistances[res].Bonus Bonus to resistance. This value is the sum of temporary bonuses by wells, fountains. Bonuses by spells and conditions aren't included here.
FireResistanceBase
AirResistanceBase [MM7, MM8]
WaterResistanceBase [MM7, MM8]
EarthResistanceBase [MM7, MM8]
FireResistanceBonus
AirResistanceBonus [MM7, MM8]
WaterResistanceBonus [MM7, MM8]
EarthResistanceBonus [MM7, MM8]
SpiritResistanceBase [MM7, MM8]
MindResistanceBase [MM7, MM8]
BodyResistanceBase [MM7, MM8]
SpiritResistanceBonus [MM7, MM8]
MindResistanceBonus [MM7, MM8]
BodyResistanceBonus [MM7, MM8]
ColdResistanceBase [MM6]
ColdResistanceBonus [MM6]
ElecResistanceBase [MM6]
ElecResistanceBonus [MM6]
PoisonResistanceBase [MM6]
PoisonResistanceBonus [MM6]
MagicResistanceBase [MM6]
MagicResistanceBonus [MM6]
SpellBuffs
Voice -- [MM7, MM8]
RecoveryDelay
SkillPoints
HP
HitPoints
SP
SpellPoints
BirthYear
EquippedItems
ItemExtraHand
ItemMainHand
ItemBow
ItemArmor
ItemHelm
ItemBelt
ItemCloak
ItemGountlets
ItemBoots
ItemAmulet
ItemRing1
ItemRing2
ItemRing3
ItemRing4
ItemRing5
ItemRing6
SpellBookPage
QuickSpell
PlayerBits
FullHPBonus -- [MM6, MM7]
FullHitPointsBonus -- [MM6, MM7]
FullSPBonus -- [MM6, MM7]
FullSpellPointsBonus -- [MM6, MM7]
Expression
ExpressionTimePassed
ExpressionLength
Beacons
DevineInterventionCasts
ArmageddonCasts
FireSpikeCasts -- [MM7, MM8]

 Methods:
GetBaseMight  ()
GetBaseIntellect  ()
GetBasePersonality  ()
GetBaseEndurance  ()
GetBaseAccuracy  ()
GetBaseSpeed  ()
GetBaseLuck  ()
GetBaseLevel  ()
GetMight  ()
GetIntellect  ()
GetPersonality  ()
GetEndurance  ()
GetAccuracy  ()
GetSpeed  ()
GetLuck  ()
GetLevel  ()
GetMight  ()
GetMeleeAttack  ()
GetMeleeDamageMin  () -- [MM7, MM8]
GetMeleeDamageMax  () -- [MM7, MM8]
CalcMeleeDamage  ()
GetRangedAttack  ()
GetRangedDamageMin  () -- [MM7, MM8]
GetRangedDamageMax  () -- [MM7, MM8]
CalcRangedDamage  ()
GetMeleeDamageRangeText  ()
GetRangedDamageRangeText  ()
CanTrain  ()
AddHP  ( Value )
AddHitPoints  ( Value )
HasItemBonus  () -- [MM7, MM8]
WearsItem  () -- [MM7, MM8]
DoDamage  ( Damage, DmgType = const.Damage.Phys )
DoBadThing  ( Effect )
GetAttackDelay  ( Ranged )
GetFullHP  ()
GetFullHitPoints  ()
GetFullSP  ()
GetFullSpellPoints  ()
GetBaseArmorClass  ()
GetArmorClass  ()
GetBaseAge  ()
GetAge  ()
GetBaseResistance  ( DmgType ) -- [MM7, MM8]
GetResistance  ( DmgType ) -- [MM7, MM8]
GetBaseFireResistance  () -- [MM6]
GetBaseElectricityResistance  () -- [MM6]
GetBaseColdResistance  () -- [MM6]
GetBasePoisonResistance  () -- [MM6]
GetBaseMagicResistance  () -- [MM6]
GetFireResistance  () -- [MM6]
GetElectricityResistance  () -- [MM6]
GetColdResistance  () -- [MM6]
GetPoisonResistance  () -- [MM6]
GetMagicResistance  () -- [MM6]
Recover  ()
SetRecoveryDelay  ( Value )
GetMainCondition  ()
CalcStatBonusByItems  ( Stat )
CalcStatBonusByMagic  ( Stat )
CalcStatBonusBySkills  ( Stat )
GetDiplomacyTotalSkill  () -- [MM6]
GetMerchantTotalSkill  () -- [MM6]
GetDisarmTrapTotalSkill  () -- [MM6]
GetSkill  ( SkillId ) -- [MM7, MM8]
GetRace  () -- [MM7]
GetSex  ( UseVoice = 0 ) -- [MM8]
ShowFaceExpression  ( Expression, Time = 0 )
ShowFaceAnimation  ( Animation, unk = 0 ) -- [MM7, MM8]


structs.StartStat

[MM7, MM8] Comment

 Fields:
Base
Max
Spend How much you spend on it to add a point
Add How much is added when you spend a point


structs.TilesetDef

Comment

 Fields:
Group
Id


structs.Item

Comment

 Fields:
Number
Bonus
BonusStrength
Bonus2 -- Value for gold
Charges
Identified
Broken
TemporaryBonus -- [MM7, MM8]
Stolen -- [MM7, MM8]
Hardened -- [MM7, MM8]
Condition
BodyLocation
MaxCharges
Owner
BonusExpireTime -- [MM7, MM8]

 Methods:
GetValue  ()
GetName  ()
GetIdentifiedName  ()
Randomize  ( strength, type )


structs.ObjectRef

Comment

 Fields:
Value -- raw value, this is item index in inventory screen
Kind
Index
ModelId

 Methods:
Get  ()
get  ()
-- 0 - nothing
1 - door
2 - objects
3 - monster
4 - party: Index is player index
5 - sprite
6 - facet (outdoors Index = ModelId*64 + FaceId) => only 128 models per map!?


structs.NPC

Comment

 Fields:
Name
Pic
Hired
Bits
Fame
Rep
House
Profession
Greet -- [MM7, MM8]
Joins
TellsNews
Events
EventA
EventB
EventC
EventD -- [MM7, MM8]
EventE -- [MM7, MM8]
EventF -- [MM7, MM8]
Sex
UsedSpell
NewsTopic


structs.SpellBuff

Comment

 Fields:
ExpireTime
Power
Skill
OverlayId
Caster
Bits


structs.TravelInfo

Comment

 Fields:
MapStatsIndex
DaysAvailable
DaysCount
Pos
X
Y
Z
Direction
LookAngle


structs.MonsterAttackInfo

Comment

 Fields:
Type
DamageDiceCount
DamageDiceSides
DamageAdd
Missile


structs.MonsterShedule

Comment

 Fields:
Pos
X
Y
Z
Bits -- (1 - on)
Action
Hour
Day
Month


structs.MonstersTxtItem

Comment

 Fields:
Name
Picture
Id -- [MM6] (do not change for a long time! Everything else can be changed, but not the Id)
Level
TreasureItemPercent
TreasureDiceCount
TreasureDiceSides
TreasureItemLevel
TreasureItemType
Fly
MoveType
AIType
HostileType
Bonus -- (steal, curse, ...)
BonusMul -- (Disease1x5 etc. I wish I knew what it means)
Attack1
Attack2Chance
Attack2
SpellChance
Spell
SpellSkill
Spell2Chance -- [MM7, MM8]
Spell2 -- [MM7, MM8]
Spell2Skill -- [MM7, MM8]
Resistances
PhysResistance
FireResistance
AirResistance -- [MM7, MM8]
WaterResistance -- [MM7, MM8]
EarthResistance -- [MM7, MM8]
MindResistance -- [MM7, MM8]
SpiritResistance -- [MM7, MM8]
BodyResistance -- [MM7, MM8]
LightResistance -- [MM7, MM8]
DarkResistance -- [MM7, MM8]
ColdResistance -- [MM6]
ElecResistance -- [MM6]
PoisonResistance -- [MM6]
MagicResistance -- [MM6]
Special -- [MM7, MM8]
SpecialA -- [MM7, MM8]
SpecialB -- [MM7, MM8]
SpecialC -- [MM7, MM8]
shot: C = count
summon: A = {[0] = 0, A, B, C} - monster level, B = {ground = 0, air = 1}; summoned monster is stored in SummonMonster field
explode: AdB + C
SummonMonster -- [MM7, MM8] (or damage type in case of explosive attack)
Prefers
PrefClass -- Preferred target
PrefNum -- Number of party members to hit using Attack1 & Attack2
BloodSplat -- [MM7, MM8] attributes (Quest)
FullHP
FullHitPoints
ArmorClass
Experience
MoveSpeed
AttackRecovery


structs.MapMonster

Comment

 Fields:
NPC_ID
Bits
HP
HitPoints
StandardName
Picture
Id -- [MM6] (do not change for a long time! Everything else can be changed, but not the Id)
Level
TreasureItemPercent
TreasureDiceCount
TreasureDiceSides
TreasureItemLevel
TreasureItemType
Fly
MoveType
AIType
HostileType
Bonus -- (steal, curse, ...)
BonusMul -- (Disease1x5 etc. I wish I knew what it means)
Attack1
Attack2Chance
Attack2
SpellChance
Spell
SpellSkill
Spell2Chance -- [MM7, MM8]
Spell2 -- [MM7, MM8]
Spell2Skill -- [MM7, MM8]
Resistances
PhysResistance
FireResistance
AirResistance -- [MM7, MM8]
WaterResistance -- [MM7, MM8]
EarthResistance -- [MM7, MM8]
MindResistance -- [MM7, MM8]
SpiritResistance -- [MM7, MM8]
BodyResistance -- [MM7, MM8]
LightResistance -- [MM7, MM8]
DarkResistance -- [MM7, MM8]
ColdResistance -- [MM6]
ElecResistance -- [MM6]
PoisonResistance -- [MM6]
MagicResistance -- [MM6]
Special -- [MM7, MM8]
SpecialA -- [MM7, MM8]
SpecialB -- [MM7, MM8]
SpecialC -- [MM7, MM8]
shot: C = count
summon: A = {[0] = 0, A, B, C} - monster level, B = {ground = 0, air = 1}; summoned monster is stored in SummonMonster field
explode: AdB + C
SummonMonster -- [MM7, MM8] (or damage type in case of explosive attack)
Prefers
PrefClass -- Preferred target
PrefNum -- Number of party members to hit using Attack1 & Attack2
BloodSplat -- [MM7, MM8] attributes (Quest)
FullHP
FullHitPoints
ArmorClass
Experience
MoveSpeed
AttackRecovery
RangeAttack
Id2
BodyRadius
BodyHeight
Velocity
Pos
X
Y
Z
VelocityX
VelocityY
VelocityZ
Direction
LookAngle
Room
CurrentActionLength
StartX
StartY
StartZ
GuardX
GuardY
GuardZ
GuardRadius
AIState -- const.AIState
GraphicState
Item -- ITEM_CARRIED
CurrentActionStep -- CURRENT_ACTION_TIME_SO_FAR
Frames
FramesStand
FramesWalk
FramesAttack
FramesShoot
FramesStun
FramesDie
FramesDead
FramesFidget
Sounds
SoundAttack
SoundDie
SoundGetHit
SoundFidget
SpellBuffs
Items -- [MM7, MM8]
Group
Ally
Shedules
Summoner
LastAttacker -- last one who hit the monster
NameId

 Methods:
LoadFrames  ( SoundLoaded = 1 )
LoadFramesAndSounds  ()
ChangeLook  ( id )
GetPropertiesFromId  ( id )


structs.TownPortalTownInfo

Comment

 Fields:
Pos
X
Y
Z
Direction
LookAngle
MapStatsIndex


structs.LloydBeaconSlot

Comment

 Fields:
ExpireTime
Pos
X
Y
Z
Direction
LookAngle
Active
MapIndex


structs.MapStatsItem

Comment

 Fields:
Name
FileName
Monster1Pic
Monster2Pic
Monster3Pic
ResetCount
FirstVisitDay
RefillDays
AlertDays
StealPerm
Per
Id -- Map Index
Lock -- x5Lock
Trap -- D20sTrap
Tres
EncounterChance
EncounterChanceM1
EncounterChanceM2
EncounterChanceM3
Mon1Dif
Mon1Low
Mon1Hi
Mon2Dif
Mon2Low
Mon2Hi
Mon3Dif
Mon3Low
Mon3Hi
RedbookTrack
EaxEnvironments


structs.ItemsTxtItem

Comment

 Fields:
Picture
Name
NotIdentifiedName
Notes
Value
SpriteIndex
EquipX
EquipY
EquipStat -- TEvtItemType - 1
Skill
Mod1DiceCount
Mod1DiceSides
Mod2
Material -- {[0] = normal, artifact, relic, special}
Bonus2 -- [MM7, MM8] VarA
Bonus -- [MM7, MM8] VarA
BonusStrength -- [MM7, MM8] VarB
ChanceByLevel
IdRepSt -- ID/Rep/St


structs.SpellInfo

Comment

 Fields:
Stats -- from spells.txt
SpellPoints
SpellPointsNormal
SpellPointsExpert
SpellPointsMaster
SpellPointsGM
Delay
DelayNormal
DelayExpert
DelayMaster
DelayGM
DamageAdd
DamageDiceSides


structs.SpellsTxtItem

Comment

 Fields:
Name
ShortName
Description
Normal
Expert
Master
GM -- [MM7, MM8]
GrandMaster -- [MM7, MM8]
DamageType
SpellPoints
SpellPointsNormal
SpellPointsExpert
SpellPointsMaster
SpellPointsGM -- [MM7, MM8]


structs.Events2DItem

Comment

 Fields:
Type
Picture
Name
OwnerName
EnterText
OwnerTitle
PictureUnk
State
Rep
Per
C
Val
A -- [MM7, MM8]
OpenHour
CloseHour
ExitPic
ExitMap
QuestBitRestriction


structs.ActionItem

Comment

 Fields:
Type
Info1
Info2


structs.SpellEffect

Comment

 No fields known yet.


structs.MapObject

Comment

 Fields:
Type -- look type (see dobjlist.bin)
Id
Pos
X
Y
Z
Velocity
VelocityX
VelocityY
VelocityZ
Direction
LookAngle
Visible
Temporary
HaltTurnBased -- turn based mode must wait until this object hits or is removed
DroppedByPlayer
IgnoreRange -- override any range limits of this object
NoZBuffer -- object should not check zbuffer
SkipAFrame -- object movement will not update for one frame
AttachToHead -- object moves with target, seemingly attached to it's head.
Missile -- item field contains the launching weapon
Bits
Room
Age
MaxAge
LightMultiplier
Item
SpellType
SpellSkill
SpellLevel
SpellEffect
Owner -- [MM7, MM8]
Target
Range
AttackType
StartPos
StartX -- starting x
StartY -- starting y
StartZ -- starting z


structs.MapChest

Comment

 Fields:
ChestPicture -- 0..7 chest id
Bits -- attributes
Items
Inventory -- (1 + item index) for main item cell -(1 + main cell index) for other cells


structs.MapSprite

Comment

 Fields:
DecListId -- DecList ID #
Bits -- attributes
Pos
X
Y
Z
Direction
EventVariable -- event for Barrels etc.
Id -- [MM7, MM8]
Event -- normal event
TriggerRadius


structs.MapVertex

Comment

 Fields:
1 - 3
X
Y
Z


structs.BSPNode

Comment

 Fields:
FrontNode
BackNode
CoplanarOffset
CoplanarSize


structs.MapFacet

Comment

 Fields:
NormalF -- [MM7, MM8] normal float
NormalFX -- [MM7, MM8] normal X float
NormalFY -- [MM7, MM8] normal Y float
NormalFZ -- [MM7, MM8] normal Z float
NormalFDistance -- [MM7, MM8] normal distance fixed pt
Normal -- normal fixed pt
NormalX -- normal X fixed pt
NormalY -- normal Y fixed pt
NormalZ -- normal Z fixed pt
NormalDistance -- normal distance fixed pt
ZCalc1 -- = -(NormalX << 16) / NormalZ (0 if NormalZ is 0)
ZCalc2 -- = -(NormalY << 16) / NormalZ (0 if NormalZ is 0)
ZCalc3 -- = -(NormalDistance << 16) / NormalZ (0 if NormalZ is 0)
Bits
VertexIds -- offset offset
XInterceptDisplacement
YInterceptDisplacement
ZInterceptDisplacement
UList
VList
DataIndex -- Data Index
BitmapId -- Bitmap Index
Room -- Room #
RoomBehind -- Room # Behind facet
MinX -- Bounding Box Min X
MaxX -- Bounding Box Max X
MinY -- Bounding Box Min Y
MaxY -- Bounding Box Max Y
MinZ -- Bounding Box Min Z
MaxZ -- Bounding Box Max Z
PolygonType -- defines texture orientation
0 empty
1 wall
2 unused
3 flat floor
4 irregular floor (non-flat)
5 flat ceiling
6 irregular ceiling (non-flat)
VertexesCount -- # of vertexes


structs.FacetData

Comment

 Fields:
FacetIndex -- Facet Index
BitmapIndex -- Bitmap Index
TFTIndex -- Texture FrameTable Index
BitmapU -- Bitmap X Offset
BitmapV -- Bitmap Y Offset
Id -- Cog Number
Event -- Cog Triggered


structs.ModelFacet

Comment

 Fields:
NormalX -- normal X fixed pt
NormalY -- normal Y fixed pt
NormalZ -- normal Z fixed pt
NormalDistance -- normal distance fixed pt
ZCalc1 -- = -(NormalX << 16) / NormalZ (0 if NormalZ is 0)
ZCalc2 -- = -(NormalY << 16) / NormalZ (0 if NormalZ is 0)
ZCalc3 -- = -(NormalDistance << 16) / NormalZ (0 if NormalZ is 0)
Bits
VertexIds
UList
VList
XInterceptDisplacement
YInterceptDisplacement
ZInterceptDisplacement
BitmapId -- Bitmap index
BitmapU
BitmapV
MinX -- BOUNDING_BOX_MIN_X
MaxX -- BOUNDING_BOX_MAX_X
MinY -- BOUNDING_BOX_MIN_Y
MaxY -- BOUNDING_BOX_MAX_Y
MinZ -- BOUNDING_BOX_MIN_Z
MaxZ -- BOUNDING_BOX_MAX_Z
Id
Event
GradientVertexes
VertexesCount
PolygonType -- 0 empty
1 wall
2 unused
3 flat floor
4 irregular floor (non-flat)
5 flat ceiling
6 irregular ceiling (non-flat)


structs.MapModel

Comment

 Fields:
Name
Name2
Bits
Visible
Vertexes
ConvexFacetsCount
Facets
Ordering
BSPNodes
SpritesCount
GridX -- center X
GridY -- center Y
Pos
X
Y
Z
MinX -- Bounding MIN X
MinY -- Bounding MIN Y
MinZ -- Bounding MIN Z
MaxX -- Bounding MAX X
MaxY -- Bounding MAX Y
MaxZ -- Bounding MAX Z
BFMinX
BFMinY
BFMinZ
BFMaxX
BFMaxY
BFMaxZ
BoxCenterX -- Bounding center X
BoxCenterY -- Bounding center Y
BoxCenterZ -- Bounding center Z
BoundingRadius


structs.MapRoom

Comment

 Fields:
Bits -- Attributes
EaxEnvironment -- [MM8]
Floors
Walls
Ceils
Fluids
Portals
NonBSPDrawFacetsCount -- # of non-BSP Node facets to draw
DrawFacets -- drawing order offsets
Cogs -- cogs offsets
Sprites
Markers -- special markers offsets
Lights -- permanent lights offset
Darkness -- Min Ambient Light Level
FirstBSPNode -- First BSP Node Index
ExitTag -- Exit Tag
MinX -- Bounding Box Min X
MaxX -- Bounding Box Max X
MinY -- Bounding Box Min Y
MaxY -- Bounding Box Max Y
MinZ -- Bounding Box Min Z
MaxZ -- Bounding Box Max Z


structs.MapLight

Comment

 Fields:
Pos
X
Y
Z
Radius
R -- [MM7, MM8]
G -- [MM7, MM8]
B -- [MM7, MM8]
Type -- [MM7, MM8]
Bits
On
Brightness
Id -- [MM8]


structs.MapOutline

Comment

 Fields:
Vertex1
Vertex2
Facet1
Facet2
Z
Visible
Bits


structs.SpawnPoint

Comment

 Fields:
Pos
X
Y
Z
Radius
Kind -- (const.ObjectRefKind)
Index -- monster (1-3: M1-M3, 4-6: M1a-M1c, 7-9: M2a-M2c, 10-12: M3a-M3c) or item (1-6)
Bits
Group -- [MM7, MM8] Monsters group


structs.MapDoor

Comment

 Fields:
Bits
Id
TimeStep -- time since triggered
Direction
DirectionX
DirectionY
DirectionZ
MoveLength -- direction magnitude
OpenSpeed -- opening velocity (speed*time/128 = position)
CloseSpeed -- closing velocity
VertexIds
FacetIds
RoomIds
FacetStartU
FacetStartV
VertexStartX
VertexStartY
VertexStartZ
State -- State compared with evt.SetDoorState:
0 - state (0)
1 - move to (1)
2 - state (1)
3 - move to (0)


structs.DecListItem

Comment

 Fields:
Name
GameName
Type
Height
Radius
LightRadius
SFTId
Bits
SoundId
Red -- [MM7, MM8]
Green -- [MM7, MM8]
Blue -- [MM7, MM8]


structs.SFTItem

Comment

 Fields:
GroupName
SpriteName
SpriteIndex -- loaded from sprite list at runtime, chosen based on sprite orientation
Scale
Bits
LightRadius -- light level
PaletteId
PaletteIndex -- palette index (0 if not loaded)
Time -- time for this frame in 1/32 of a second
TotalTime -- total time for this group


structs.SFT

Comment

 Fields:
MatchIndex -- used when searching for a group by name
Frames -- indexmember
Groups -- sorted by name
GroupIndex


structs.PFTItem

Comment

 Fields:
GroupId
FrameIndex
Time -- time for this frame in 1/32 of a second
TotalTime -- total time for this group
NotGroupEnd
GroupStart
Bits


structs.IFTItem

Comment

 Fields:
GroupName -- animation name
IconName -- image name in icons.lod
Time -- time for this frame, units in 1/16 of a second
TotalTime -- total time for this group
Bits
NotGroupEnd
GroupStart
IconIndex -- Icon index


structs.TFTItem

Comment

 Fields:
Name -- texture name
Index -- index in bitmaps.lod
Time -- time for this frame in 1/32 of a second
TotalTime -- total time for this group
NotGroupEnd
GroupStart
Bits


structs.DChestItem

Comment

 Fields:
Name
Width
Height
ImageIndex


structs.OverlayItem

Comment

 Fields:
Id
Type
SFTIndex


structs.ObjListItem

Comment

 Fields:
Name
Id
Radius
Height
Invisible -- object has no sprite
Untouchable -- object does not effect movement
Temporary -- object has specific lifetime
LifetimeSFT -- read lifetime from SFT
NoPickup -- object cannot be picked up by player
NoGravity -- object is unaffected by gravity
InterceptAction -- object does something when it hits
Bounce -- object can bounce
TrailParticles -- must be specified if the object leaves trail
TrailFire
TrailLine
Bits
SFTIndex
LifeTime
LoadedParticlesColor -- [MM6] munged 16-bit color
[MM7, MM8] RGBA color with R and B swapped
Speed -- default speed of object
ParticlesColor -- color for particles


structs.MonListItem

Comment

 Fields:
Height
Radius -- overall monster radius
Velocity
Radius2 -- [MM7, MM8] monster radius for "to-hit" purposes
Tint -- [MM7, MM8] tint color for graphic
Sounds
SoundAttack
SoundDie
SoundGetHit
SoundFidget
Name
FrameNames
FramesStand -- FRAME_TABLE_STANDING
FramesWalk -- FRAME_TABLE_WALKING
FramesAttack -- FRAME_TABLE_NEAR_ATTACK
FramesShoot -- FRAME_TABLE_FAR_ATTACK
FramesStun -- FRAME_TABLE_STUN
FramesDie -- FRAME_TABLE_DYING
FramesDead -- FRAME_TABLE_DEAD
FramesFidget -- FRAME_TABLE_FIDGETING


structs.SoundsItem

Comment

 Fields:
Name -- name of sound file
Id
Type -- type of sound
0 = (0) level specific sound, load during level initialization
1 = (system) system sound, always loaded
2 = (swap) level specific sound, that gets loaded and flushed
3 = (?)
4 = (lock) delete sound only when game ends
Bits -- attributes
Locked
Is3D
Data -- data pointer
Data3D -- 3d data pointer
Decompressed -- true if decompressed and needs to be freed separately


structs.EventLine

Comment

 Fields:
Event
Line
Offset



Constants


evt.Players

Comment

 Values:
0 - 4 Player index (zero-based). 4 is used in MM8 only.
Current Currently active player. This is the default.
All Apply to all players.
Random Apply to a random player. Note that each command will choose its own player.


evt.VarNum

Comment

 Values:
SexIs
ClassIs
HP
HasFullHP
SP
HasFullSP
ArmorClass
ArmorClassBonus
BaseLevel
LevelBonus
AgeBonus
Awards
Experience
QBits
Inventory
HourIs
DayOfYearIs
DayOfWeekIs
Gold
GoldAddRandom
Food
FoodAddRandom
MightBonus
IntellectBonus
PersonalityBonus
EnduranceBonus
SpeedBonus
AccuracyBonus
LuckBonus
BaseMight
BaseIntellect
BasePersonality
BaseEndurance
BaseSpeed
BaseAccuracy
BaseLuck
CurrentMight
CurrentIntellect
CurrentPersonality
CurrentEndurance
CurrentSpeed
CurrentAccuracy
CurrentLuck
FireResistance
ElecResistance [MM6]
ColdResistance [MM6]
PoisonResistance [MM6]
MagicResistance [MM6]
FireResBonus
ElecResBonus [MM6]
ColdResBonus [MM6]
PoisonResBonus [MM6]
MagicResBonus [MM6]
AirResistance [MM7, MM8]
WaterResistance [MM7, MM8]
EarthResistance [MM7, MM8]
SpiritResistance [MM7, MM8]
MindResistance [MM7, MM8]
BodyResistance [MM7, MM8]
AirResBonus [MM7, MM8]
WaterResBonus [MM7, MM8]
EarthResBonus [MM7, MM8]
SpiritResBonus [MM7, MM8]
MindResBonus [MM7, MM8]
BodyResBonus [MM7, MM8]
StaffSkill
SwordSkill
DaggerSkill
AxeSkill
SpearSkill
BowSkill
MaceSkill
BlasterSkill
ShieldSkill
LeatherSkill
ChainSkill
PlateSkill
FireSkill
AirSkill
WaterSkill
EarthSkill
SpiritSkill
MindSkill
BodySkill
LightSkill
DarkSkill
DarkElfAbilitySkill [MM8]
VampireAbilitySkill [MM8]
DragonAbilitySkill [MM8]
IdentifyItemSkill
MerchantSkill
RepairSkill
BodybuildingSkill
MeditationSkill
PerceptionSkill
RegenerationSkill
DiplomacySkill [MM6, MM7]
ThieverySkill [MM6, MM7] Unused skill.
DisarmTrapsSkill
DodgingSkill
UnarmedSkill
IdentifyMonsterSkill [MM7, MM8]
ArmsmasterSkill [MM7, MM8]
StealingSkill [MM7, MM8]
AlchemySkill [MM7, MM8]
LearningSkill
Cursed
Weak
Asleep
Afraid
Drunk
Insane
PoisonedGreen
DiseasedGreen
PoisonedYellow
DiseasedYellow
PoisonedRed
DiseasedRed
Paralysed
Unconsious
Dead
Stoned
Eradicated
MainCondition
MapVar0 - MapVar99
MapVars[0] - MapVars[99]

AutonotesBits
IsMightMoreThanBase
IsIntellectMoreThanBase
IsPersonalityMoreThanBase
IsEnduranceMoreThanBase
IsSpeedMoreThanBase
IsAccuracyMoreThanBase
IsLuckMoreThanBase
PlayerBits
NPCs [MM6, MM7]
ReputationIs
Flying
HasNPCProfession
TotalCircusPrize
SkillPoints
MonthIs
Counter1 - Counter10
Counter[1] - Counter[10]
[MM7, MM8]
Reputation [MM7, MM8]
History1 - History28
History[1] - History[28]
[MM7, MM8]
BankGold [MM7, MM8]
Deaths [MM7, MM8]
MontersHunted [MM7, MM8]
PritsonTerms [MM7, MM8]
ArenaWinsPage [MM7, MM8]
ArenaWinsSquire [MM7, MM8]
ArenaWinsKnight [MM7, MM8]
ArenaWinsLord [MM7, MM8]
Invisible [MM7, MM8]
IsWearingItem [MM7, MM8]
Players [MM8]


const.Condition

Comment

 Values:
Weak
Cursed
Asleep
Afraid
Drunk
Insane
Poison1
Disease1
Poison2
Disease2
Poison3
Disease3
Paralyzed
Unconscious
Dead
Stoned
Eradicated
Zombie [MM7, MM8]


const.Damage

Comment

 MM6 Values:
Phys
Magic
Fire
Elec
Cold
Poison

 MM7, MM8 Values:
Fire
Air
Water
Earth
Phys
Unknown
Spirit
Mind
Body
Light
Dark


const.ItemType

Comment

 Values:
Any
Weapon
Weapon2H
Missile
Armor
Shield
Helm
Belt
Cloak
Gountlets
Boots
Ring
Amulet
Wand
Reagent
Potion
Scroll
Book
MScroll
Gold
Weapon_
Armor_
Misc
Sword
Dagger
Axe
Spear
Bow
Mace
Staff
Leather
Chain
Plate
Shield_
Helm_
Belt_
Cloak_
Gountlets_
Boots_
Ring_
Amulet_
Wand_
Scroll_
Potion
Reagent
Gems
Gems2
Gold


const.MonsterBits

Comment

 Values:
Invisible
Hostile
Active -- inside the active radius?
ShowOnMap Monster was once seen by party
NoFlee
TreasureGenerated Treasure is in Items[0] and Items[1], gold is in Items[3]
ShowAsHostile Show as hostile on map


const.FacetBits

Comment

 Values:
IsPortal
IsWater
Invisible
MoveByDoor
IsEventJustHint [MM7, MM8]
IsSky -- Horizontal flow
FlipU Only works indoors
FlipV Only works indoors
TriggerByClick
TriggerByStep
TriggerByMonster
TriggerByObject
Untouchable
IsLava
HasData


const.SpriteBits

Comment

 Values:
TriggerByTouch Triggered when a player comes into TriggerRadius.
TriggerByMonster Triggered when a monster comes into TriggerRadius.
TriggerByItem Triggered when an item gets into TriggerRadius.
ShowOnMap
IsChest
Invisible
IsObeliskChest


const.ChestBits

Comment

 Values:
Trapped
ItemsPlaced
Opened


const.Stats

Comment

 Values:
Might
Intellect
Personality
Endurance
Accuracy
Speed
Luck
HP
HitPoints

SP
SpellPoints

ArmorClass
Level
MeleeAttack
MeleeDamageBase
MeleeDamageMin
MeleeDamageMax
RangedAttack
RangedDamageBase
RangedDamageMin
RangedDamageMax
FireResistance
ElecResistance [MM6]
ColdResistance [MM6]
PoisonResistance [MM6]
MagicResistance [MM6]
AirResistance [MM7, MM8]
WaterResistance [MM7, MM8]
EarthResistance [MM7, MM8]
MindResistance [MM7, MM8]
BodyResistance [MM7, MM8]
Alchemy [MM7, MM8]
Stealing [MM7, MM8]
DisarmTraps [MM7, MM8]
IdentifyItem [MM7, MM8]
IdentifyMonster [MM7, MM8]
Armsmaster [MM7, MM8]
Dodging [MM7, MM8]
Unarmed [MM7, MM8]
SpiritResistance [MM7, MM8]
FireMagic [MM7, MM8]
AirMagic [MM7, MM8]
WaterMagic [MM7, MM8]
EarthMagic [MM7, MM8]
SpiritMagic [MM7, MM8]
MindMagic [MM7, MM8]
BodyMagic [MM7, MM8]
LightMagic [MM7, MM8]
DarkMagic [MM7, MM8]
Meditation [MM7, MM8]
Bow [MM7, MM8]
Shield [MM7, MM8]
Learning [MM7, MM8]


const.Skills

Comment

 Values:
Staff
Sword
Dagger
Axe
Spear
Bow
Mace
Blaster
Shield
Leather
Chain
Plate
Fire
Air
Water
Earth
Spirit
Mind
Body
Light
Dark
DarkElfAbility [MM8]
VampireAbility [MM8]
DragonAbility [MM8]
IdentifyItem
Merchant
Repair
Bodybuilding
Meditation
Perception
Regeneration
Diplomacy [MM6, MM7]
Thievery [MM6, MM7] Unused skill.
DisarmTraps
Dodging
Unarmed
IdentifyMonster [MM7, MM8]
Armsmaster [MM7, MM8]
Stealing [MM7, MM8]
Alchemy [MM7, MM8]
Learning


const.Class

Comment

 MM6 Values:
Knight
Cavalier
Champion
Cleric
Priest
HighPriest
Sorcerer
Wizard
ArchMage
Paladin
Crusader
Hero
Archer
BattleMage
WarriorMage
Druid
GreatDruid
ArchDruid

 MM7 Values:
Knight
Cavalier
Champion
BlackKnight
Thief
Rogue
Spy
Assassin
Monk
Initiate
Master
Ninja
Paladin
Crusader
Hero
Villain
Archer
WarriorMage
MasterArcher
Sniper
Ranger
Hunter
RangerLord
BountyHunter
Cleric
Priest
PriestLight
PriestDark
Druid
GreatDruid
ArchDruid
Warlock
Sorcerer
Wizard
ArchMage
Lich

 MM8 Values:
Necromancer
Lich
Cleric
PriestLight
Knight
Champion
Troll
WarTroll
Minotaur
MinotaurLord
DarkElf
Patriarch
Vampire
Nosferatu
Dragon
GreatWyrm


const.Race

Comment

 MM7 Values:
Human
Elf
Dwarf
Goblin


const.ObjectRefKind

Comment

 Values:
Nothing
Door
Item
Monster
Party
Sprite
Facet
Light


const.AIState

Comment

 Values:
Stand
Active
MeleeAttack
RangedAttack
Dying
Dead
Pursue
Flee
Stunned
Fidget
Interact
Removed
RangedAttack2
RangedAttack3
Stoned
Paralyzed
Resurrect
Summoned
RangedAttack4
Invisible


const.FaceAnimation

Comment

 Values:
KillSmallEnemy
KillBigEnemy
StoreClosed
DisarmTrap
TrapWillBlow -- it's gonna blow!
AvoidTrapDamage -- sit down
IdentifyUseless
IdentifyGreat
IdentifyFail
RepairItem
RepairFail
SetQuickSpell
CantRestHere
SmileRandom
CantCarry
MixPotion
PotionExplode
DoorLocked
Strain -- like pulling sword out of stone in MM6
CantLearnSpell
LearnSpell
Hello
HelloNight
Damaged
Weak
Afraid
Poisoned
Deseased
Insane
Cursed
Drunk
Unconsious
Death
Stoned
Eradicated
Smile
ReadScoll
NotEnoughGold
CantEquip
ItemBrokenStolen
SPDrained
Aged
SpellFailed
DamagedParty
Tired
EnterDungeon -- come on let's go in
LeaveDungeon -- let's get out of here
AlmostDead
CastSpell
Shoot
AttackHit
AttackMiss
Beg
BegFail
ThreatFail
SmileHuge
BribeFail
NPCDontTalk
SmileRandom2
LookUp
LookDown
Yell
Falling
ShakeHeadNo -- shakes head
TavernGotDrunk
TavernTip
ShakeHeadYes
ShopIdentify
ShopRepair
ShopAlreadyIdentified
ShopWrongShop
ShopRude
BankDeposit
SmileBig
TempleDonate
HelloHouse
AfraidSilent
InPrison
ChooseMe
Awaken
IdMonsterWeak
IdMonsterBig
IdMonsterFail
LastManStanding
Hungry


const.Season

Comment

 Values:
Automn
Summer
Fall
Winter


const.PartyBuff

Comment

 Values:
GuardianAngel -- [MM6]
FireResistance
ColdResistance -- [MM6]
ElecResistance -- [MM6]
MagicResistance -- [MM6]
PoisonResistance -- [MM6]
AirResistance -- [MM7, MM8]
WaterResistance -- [MM7, MM8]
EarthResistance -- [MM7, MM8]
MindResistance -- [MM7, MM8]
BodyResistance -- [MM7, MM8]
FeatherFall
WaterWalk
Fly
WizardEye
TorchLight
DayOfGods -- [MM7, MM8]
DetectLife -- [MM7, MM8]
Haste -- [MM7, MM8]
Heroism -- [MM7, MM8]
Immolation -- [MM7, MM8]
Invisibility -- [MM7, MM8]
ProtectionFromMagic -- [MM7, MM8]
Shield -- [MM7, MM8]
Stoneskin -- [MM7, MM8]


const.PlayerBuff

Comment

 Values:
Bless
Heroism
Haste
Shield
Stoneskin
TempLuck
TempIntellect
TempPersonality
TempAccuracy
TempSpeed
TempMight
TempEndurancy
Fate -- [MM7, MM8]
FireResistance -- [MM7, MM8]
WaterResistance -- [MM7, MM8]
AirResistance -- [MM7, MM8]
EarthResistance -- [MM7, MM8]
BodyResistance -- [MM7, MM8]
MindResistance -- [MM7, MM8]
Hammerhands -- [MM7, MM8]
PainReflection -- [MM7, MM8]
Preservation -- [MM7, MM8]
Regeneration -- [MM7, MM8]
WaterBreathing -- [MM7, MM8]
Glamour -- [MM8]
Levitate -- [MM8]
Misform -- [MM8]


const.MonsterBuff

Comment

 Values:
Null
Charm
Cursed -- [MM6]
Summoned -- [MM7, MM8]
ShrinkingRay
Fear
Stoned
Paralyze
Slow
Feeblemind -- [MM6]
ArmorHalved -- [MM7, MM8]
Berserk -- [MM7, MM8]
MassDistortion -- [MM7, MM8]
Fate -- [MM7, MM8]
Enslave -- [MM7, MM8]
DayOfProtection -- [MM7, MM8]
HourOfPower -- [MM7, MM8]
Shield -- [MM7, MM8]
StoneSkin -- [MM7, MM8]
Bless -- [MM7, MM8]
Heroism -- [MM7, MM8]
Haste -- [MM7, MM8]
PainReflection -- [MM7, MM8]
Hammerhands -- [MM7, MM8]
MeleeOnly -- [MM8] (part of Blind and Dark Grasp)
DamageHalved -- [MM8]
Wander -- [MM8] monster wanders aimlessly (part of Blind)
Mistform -- [MM8]


onst.MonsterBonus

Comment

 Values:
Curse
Weak
Asleep
Drunk
Insane
Poison1
Poison2
Poison3
Disease1
Disease2
Disease3
Paralyze
Uncon
Dead
Stone
Errad
Brkitem
Brkarmor
Brkweapon
Steal
Age
Drainsp
Afraid


const.Screens

Comment

 Values:
Game
Manu
Controls
Info -- quests, map, autonotes
NPC
Rest
Query -- like with hotkeys in Chinese debug MM6
Inventory
SpellBook
NewGameBreefing
Chest
SaveGame
LoadGame
House
MainManu
WalkToMap
MapEnrance
SimpleMessage
CreateParty
EscMessage
KeyConfig
VideoOptions
QuickReference


const.Keys

Comment

 Values:
LBUTTON
RBUTTON
CANCEL
MBUTTON
XBUTTON1
XBUTTON2
BACK
BACKSPACE

TAB
CLEAR
RETURN
SHIFT
CONTROL
CTRL

MENU
ALT

PAUSE
CAPITAL
CAPSLOCK

KANA
HANGUL
JUNJA
FINAL
HANJA
KANJI
CONVERT
NONCONVERT
ACCEPT
MODECHANGE
ESCAPE
SPACE
PRIOR
PGUP

NEXT
PGDN

END
HOME
LEFT
UP
RIGHT
DOWN
SELECT
PRINT
EXECUTE
SNAPSHOT
INSERT
DELETE
HELP
LWIN
RWIN
APPS
SLEEP
NUMPAD0
NUMPAD1
NUMPAD2
NUMPAD3
NUMPAD4
NUMPAD5
NUMPAD6
NUMPAD7
NUMPAD8
NUMPAD9
MULTIPLY
ADD
SEPARATOR
SUBTRACT
DECIMAL
DIVIDE
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
F21
F22
F23
F24
NUMLOCK
SCROLL
LSHIFT
RSHIFT
LCONTROL
RCONTROL
LMENU
RMENU
BROWSER_BACK
BROWSER_FORWARD
BROWSER_REFRESH
BROWSER_STOP
BROWSER_SEARCH
BROWSER_FAVORITES
BROWSER_HOME
VOLUME_MUTE
VOLUME_DOWN
VOLUME_UP
MEDIA_NEXT_TRACK
MEDIA_PREV_TRACK
MEDIA_STOP
MEDIA_PLAY_PAUSE
LAUNCH_MAIL
LAUNCH_MEDIA_SELECT
LAUNCH_APP1
LAUNCH_APP2
OEM_1
OEM_PLUS
OEM_COMMA
OEM_MINUS
OEM_PERIOD
OEM_2
OEM_3
OEM_4
OEM_5
OEM_6
OEM_7
OEM_8
OEM_102
PACKET
PROCESSKEY
ATTN
CRSEL
EXSEL
EREOF
PLAY
ZOOM
NONAME
PA1
OEM_CLEAR


Other Constants

const.Second I don't really think you'll need this
const.Minute
const.Hour
const.Day
const.Week
const.Month
const.Year
const.Expert
const.Master
const.GM
const.MonsterImmune

Comments