Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 12.07.2020]

The role-playing games (I-X) that started it all and the various spin-offs (including Dark Messiah).

Moderator: Moderators

User avatar
Templayer
Devil
Devil
Posts: 1325
Joined: 21 Jan 2013

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby Templayer » Feb 12 2020, 6:15

raekuul wrote:Just a quick note on the blasters thing: in 6 and 7, Blaster Skill only affected your To-Hit chance. Damage was based entirely on if it was a Blaster Pistol or a Blaster Rifle.

Added to the original report on the Bug Tracker and into the Issue on GitLab.
MMMerge Tracker (= Info + Paint Tracker + Bug Tracker + Missing Features + Suggestions):
https://goo.gl/ui24Bz
Anybody can view or suggest edits.

My youtube retro channel: www.youtube.com/Templayer

User avatar
Templayer
Devil
Devil
Posts: 1325
Joined: 21 Jan 2013

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby Templayer » Feb 12 2020, 6:20

Uploading the base merge to my server.
MMMerge Tracker (= Info + Paint Tracker + Bug Tracker + Missing Features + Suggestions):
https://goo.gl/ui24Bz
Anybody can view or suggest edits.

My youtube retro channel: www.youtube.com/Templayer

LadySoulCrystal
Leprechaun
Leprechaun
Posts: 7
Joined: 11 Feb 2020

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby LadySoulCrystal » Feb 12 2020, 14:17

Per BugTracker:

"Reported by: Piottor » Mar 10 2019, 1:53
Side note: After completing Tomb of Varn, going inside of Control Room, then outside sky textures in many cities started to be...distroted of sorts...usually helped to just sleep in an inn and they gone away...first time I encountered "buggy" graphics so far...idk if it is even related to the VARN or ConRoom..."

Just wanted to let you all know i experienced this skybox glitch after completing Castle Darkmoor and getting the Memory Crystal as well as destroying the Book of Liches. Could just be issues with the game pulling the skybox texture after the player has been in a dungeon for so long. I had to save and exit before my skybox would fix itself (tried saving and reloading but the texture was still skewed).

EDIT:

Unrelated, went to go boot up my game this morning and was hit with this script and then an infinite death cutscene. Earlier save loaded fine, wasn't sure if this needed to be reported as i can't make too much of the script. Looks like something is out of bounds, but what?

Code: Select all

Scripts/Core/RSMem.lua:1383: array index (0) out of bounds [0, -1]

stack traceback:
   [C]: in function 'error'
   Scripts/Core/RSMem.lua:1342: in function '__index'
   Scripts/Core/RSMem.lua:1383: in function '__index'
   ...mes\Might and Magic 8\Scripts\General\NPCMercenaries.lua:578: in function 'v'
   Scripts/Core/EventsList.lua:68: in function <Scripts/Core/EventsList.lua:63>

arguments of '__index':
   t = (table: 0x2566f638)
   a = 0
   v = nil

local variables of '__index':
   aorig = 0
   a1 = 0
   n = 0

upvalues of '__index':
   ptr = nil
   u4 = (table: 0x057b5e88)
   GetPtr = (function: 0x057a1a18)
   obj = (table: 0x05a8f958)
   o = 12044876
   assertnum = (function: 0x05770dc8)
   error = (function: 0x0579a080)
   type = (function: builtin#3)
   SetLen = (function: 0x05a7fde8)
   low = 0
   GetLen = (function: 0x05a88320)
   lenP = 12044896
   lenA = (table: 0x057a1ef0)
   count = 5
   size = 4
   _index = nil
   _newindex = nil
   tonumber = (function: builtin#17)
   beyondLen = nil
   f = (function: 0x05b0d1b8)
   format = (function: builtin#91)
   sOutOfBounds = "array index (%s) out of bounds [%s, %s]"
   tostring = (function: builtin#18)
   tostring2 = (function: 0x0579d8a8)
-----------------------------------------------------------------------------------
>
Last edited by LadySoulCrystal on Feb 12 2020, 14:24, edited 1 time in total.

cthscr
Pixie
Pixie
Posts: 103
Joined: 12 Jan 2020

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby cthscr » Feb 12 2020, 15:06

joanthedark wrote:Luckily I had a save just before unmasking the council's traitor (because I like the cutscene), so I loaded it to see if the placeholder text was also there since I don't remember seeing it on my first playthrough:

If by any chance you still have that savegame, can you please share it or give the output of following code running in debug console (output shouldn't be too small):

Code: Select all

    local FromFile = {}
   local function GetFromFile(fname, n, col, quotes, headRows)
      if not FromFile[fname] then
         local t = {}
         FromFile[fname] = t
         for s in Game.LoadTextFileFromLod(fname):gmatch("\r\n"..("[^\t]*\t"):rep(col-1).."([^\t]*)") do
            t[#t+1] = (s:sub(1,1) == '"' and s:sub(2, -2) or s)
         end
         for i = 1, (headRows or 1) - 1 do
            t[i] = nil
         end
      end
      local s = FromFile[fname][n]
      if s then
         return quotes and '"'..s..'"' or s
      else
         return "not found!"
      end
   end

  for i=1, 1719 do
    if Party.QBits[i] == true then
      print(i..": "..tostring(Party.QBits[i]).." - "..GetFromFile("quests.txt", i, 3))
    end
  end

User avatar
Templayer
Devil
Devil
Posts: 1325
Joined: 21 Jan 2013

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby Templayer » Feb 12 2020, 17:38

Templayer wrote:
cthscr wrote:
TheAnyKey wrote:Hello. I cannot seem to download the mod. At the Mega.nz link the download stops at about 80% and I'm told "Transfer Quota exceeded". I have also installed the Mega download manager but I can still only download about 80%.


They give bonus to newly registered users that download & install their desktop app.

But let's ask @Pol to host it here at CH if possible.

Pol wrote:False quote because Templayer says that Shift+2 addressing doesn't work.


Pol, is it possible to host Merge pack here?

I can probably just post it on my server. With direct link access, nonetheless.
Same with a whole new forum for the Merge, if people want that. :D :D

If you want me to do it like that, just ask. For the files hosting, I mean.

I've uploaded it to my website. I hope I got the right files. Anyway:
http://www.templayer.cz/storage/MM678_22.09.2019.zip
http://www.templayer.cz/storage/MM678%20Patch%2008.10.2019.zip

If you cannot enter www.templayer.cz -> use an VPN or a site unlocker - personaly, sometimes I have to use https://proxysite.cc/ for some websites (I do not know why my provider is blocking nexusmods.com for example...)
MMMerge Tracker (= Info + Paint Tracker + Bug Tracker + Missing Features + Suggestions):
https://goo.gl/ui24Bz
Anybody can view or suggest edits.

My youtube retro channel: www.youtube.com/Templayer

joanthedark
Leprechaun
Leprechaun
Posts: 46
Joined: 27 May 2017

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby joanthedark » Feb 12 2020, 18:27

cthscr wrote:If by any chance you still have that savegame, can you please share it


Just in case you meant the savefile before unmasking the traitor, where no placeholder text is visible, here it is:

https://www.mediafire.com/file/mvq4rrl514s54dd/save001.dod/file

I named it 001 just in case you want to compare both savefiles.

Templayer made a backup of the savefile that has the placeholder text in both The Council and The Oracle, although that save focuses more on testing the Blaster damage so it's located in Castle Ironfist, you will have to Town Portal to Free Haven to see it.

cthscr
Pixie
Pixie
Posts: 103
Joined: 12 Jan 2020

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby cthscr » Feb 12 2020, 19:44

joanthedark wrote:
cthscr wrote:If by any chance you still have that savegame, can you please share it


Just in case you meant the savefile before unmasking the traitor, where no placeholder text is visible, here it is:

Thank you!

joanthedark wrote:Templayer made a backup of the savefile that has the placeholder text in both The Council and The Oracle, although that save focuses more on testing the Blaster damage so it's located in Castle Ironfist, you will have to Town Portal to Free Haven to see it.

Well, skill description indeed says about Attack increase only.

joanthedark
Leprechaun
Leprechaun
Posts: 46
Joined: 27 May 2017

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby joanthedark » Feb 12 2020, 22:30

cthscr wrote:Well, skill description indeed says about Attack increase only.


It might still be worth checking out its numbers, because I also did not notice any difference with its chance to hit.

joanthedark
Leprechaun
Leprechaun
Posts: 46
Joined: 27 May 2017

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby joanthedark » Feb 13 2020, 2:50

Is there any way to choose which place you want to go while changing continents? No matter how many times I reload I cannot seem to be able to teleport to Emerald Island anymore. A console command maybe?

TheAnyKey
Peasant
Peasant
Posts: 77
Joined: 10 Oct 2010

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby TheAnyKey » Feb 13 2020, 6:58

1. Has the shooting recovery speed been lowered to 30, same as melee attacks? It was once 0 with GrayFace's mod, then it was lowered to 5. In Merged the shooting recovery seems to be at 30. Can someone confirm that?


2. What does the Peasant class do? Is there some hidden skill set to that class? Is it meant as a challenge?
Last edited by TheAnyKey on Feb 13 2020, 7:05, edited 1 time in total.

User avatar
SpectralDragon
Hunter
Hunter
Posts: 549
Joined: 15 May 2019

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby SpectralDragon » Feb 13 2020, 7:17

TheAnyKey wrote:2. What does the Peasant class do? Is there some hidden skill set to that class? Is it meant as a challenge?

"Peasant" is basically a "class" for all standard MM6 and MM7 people you hire where they have no skills at all, not even racial ones (since MM6 and MM7 people you hire don˙t need those skills, as they˙re giving you benfits on their own). It´s meant as a sort of a hardcore challenge and once Peasants reach level 1, then they˙re supposed to get their actual class (via training in MMMerge from my last info) like Knight, Ranger, Thief ...

Templayer wrote:Uploading the base merge to my server.

Given that Rodril is been missing for so long, I wish you good luck with it. Seriously, kind of like how I need it in order to try my hand in adding different dragons in the default MM8 nowadays, so that Browns, Reds, Golds and Blacks are all selectable. ^^;
Yes?

cthscr
Pixie
Pixie
Posts: 103
Joined: 12 Jan 2020

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby cthscr » Feb 13 2020, 21:04

joanthedark wrote:Is there any way to choose which place you want to go while changing continents? No matter how many times I reload I cannot seem to be able to teleport to Emerald Island anymore. A console command maybe?

Code: Select all

evt[0].MoveToMap{0,0,0,0,0,0,0,0,"7out01.odm"}

Note for Templayer: I didn't know that command 5 minutes ago. Manuals are good thing.

joanthedark
Leprechaun
Leprechaun
Posts: 46
Joined: 27 May 2017

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby joanthedark » Feb 13 2020, 22:37

cthscr wrote:
joanthedark wrote:Is there any way to choose which place you want to go while changing continents? No matter how many times I reload I cannot seem to be able to teleport to Emerald Island anymore. A console command maybe?

Code: Select all

evt[0].MoveToMap{0,0,0,0,0,0,0,0,"7out01.odm"}

Note for Templayer: I didn't know that command 5 minutes ago. Manuals are good thing.


Thank you for the command!

I believe it is imperative to teleport any parties who started in Enroth or Jadame continents to Emerald Island as soon as they try to Town Portal to Antagarich continent, otherwise you will have stuff like this:

Image

Lord Markham is not in his throne room in Tatalia because we never triggered (or finished) the Emerald Island quest, no idea if it's intentional.

You also miss out on Mr. Malwick's subquest which can only trigger in Emerald Island.

The good thing is that as soon as I entered the command provided by cthscr I got the second MM7 cutscene (Lord Markham speech in Emerald Island's treasure hunt) and all the fetch quests for the hunt were added to my quest log, meaning I can start MM7 as if my first continent choice was Antagarich. Hopefully this also means Lord Markham will be in Tatalia but I'll continue playing later and figure that out.

I would like to know what you guys think about it, should all parties who didn't start in Antagarich be teleported to Emerald Island as soon as they try out any MM7 content? Seems like there will be less headaches this way, otherwise you would be "forced" to always select Antagarich everytime you make a new game or you'll miss out some content.

raekuul
Pixie
Pixie
Posts: 130
Joined: 05 Jul 2019

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby raekuul » Feb 13 2020, 23:03

I should just like to point out that there's supposed to be a Map NPC that gives you the Scavenger Hunt Invitation when you go to Erathia-Erathia (in the same vein as the NPC that gives you the Quest To Pick A New Arbiter), but he only shows up on certain days as opposed to when you first enter the map.

Forcing the first TP for a continent to a specific map is a good idea though.
Last edited by raekuul on Feb 13 2020, 23:05, edited 1 time in total.
You need to install the base mod first, and then install the latest GrayFace patch on top of that.

User avatar
justl
Scout
Scout
Posts: 168
Joined: 26 Dec 2017

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby justl » Feb 14 2020, 6:17

joanthedark wrote:
Thank you for the command!

I believe it is imperative to teleport any parties who started in Enroth or Jadame continents to Emerald Island as soon as they try to Town Portal to Antagarich continent, otherwise you will have stuff like this:

Image

Lord Markham is not in his throne room in Tatalia because we never triggered (or finished) the Emerald Island quest, no idea if it's intentional.


of course he cant be in tatalia ... he waits for you to win on emerald island.
mm7 vanilla wasnt meant to begin at another location (like townportaling in from somewhere else), so i think its hardcoded somehow.

User avatar
SpectralDragon
Hunter
Hunter
Posts: 549
Joined: 15 May 2019

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby SpectralDragon » Feb 14 2020, 13:07

Pals, when it comes to Templayer, https://youtu.be/8SzKH5JZIk4

Might take a while for him to show up, so for now, we gotta do what we have.
Yes?

eilacomeva
Pixie
Pixie
Posts: 100
Joined: 20 Jun 2019

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby eilacomeva » Feb 14 2020, 17:40

Templayer wrote:The bug has been fixed by cthscr.
You can either download the Community Branch of the Merge, or the Base Merge branch with fixes.


Why, thank you. Most importantly because I didn't know you had a bugfix-only branch :D

eilacomeva
Pixie
Pixie
Posts: 100
Joined: 20 Jun 2019

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby eilacomeva » Feb 14 2020, 17:48

More on my stupidity(*):
After you finish, put the youknowwhat youknowwhere and you'll find yourself... well, I was in New Sorpigal, at the beginning of the game.
I went to the fountain to see if I could summon Verdant to checkif it was a restart-the-game or there was something new, clicked space, accidentally found myself speaking to a useless NPC that looks just like one from my team.
When I clicked on joined and got a new peasant you could have heard my curses from miles away, it appears that not only you can start with a full team, you also don't need to check gyms to recruit NPCs if you're ok with peasants :D :D :D

(*) ok, technically more like not wasting my time talking to useless NPCs

eilacomeva
Pixie
Pixie
Posts: 100
Joined: 20 Jun 2019

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby eilacomeva » Feb 14 2020, 17:56

And btw, since some bugs seem to rely on having (or not having) some old savegame, a silly script that I've been using for that purpose:

For those with a unix shell (aka not on windows)

Code: Select all

#! /bin/sh
set -u
# Run under setlock -n or suffer.

printusage() {
        echo "Usage: $0 [-aes]"
        echo "keep snapshot of mm6/7/8 saves"
        echo " -a keeps autosaves"
        echo " -e keeps everything (even \"my first.mm6\")"
        echo " -s keeps only saveNNN"
}

readonly onlySaveNNN='saveNNN.xyz'
readonly includeAutosave='also autosave'
readonly includeEverything='allofthem'
WANTED="$onlySaveNNN"
while getopts ":aesh" Option ; do # autosave etc
        case $Option in
                (a) WANTED=$includeAutosave ;;
                (e) WANTED=$includeEverything ;;
                (s) WANTED=$onlySaveNNN ;;
                (h) printusage ; exit 0;;
                (*) echo >&2 unknown option "$OPTARG" ; exit 100;;
        esac
done
shift $((OPTIND - 1))
test $# -eq 1 || { echo>&2 "Usage: $0 \$Saves -- no autodetect"; exit 100; }
cd "$1" || exit
case "$PWD" in
        (*Saves) ;;
        (*) echo>&2 "give me the Saves directory..."; exit 100;;
esac

# stat(1) is different on BSD/linux...
if stat --help >/dev/null ; then
        timestamp() {
                # FIXME NO WAY to specify timestamp format
                # %y this one is BAD for windows
                # %Y is unreadable (seconds since the epoch)
                stat -c '%y' "$@"
        }
else
        # TODO untested
        timestamp() {
                # -f %m: print mtime
                # -t fmt is like strftime
                stat -t '%F_%T' -f '%m' "$@"
        }
fi

# Not really needed, I just like reflinks.
if cp --help|grep>/dev/null reflink ; then
        copy() {
                cp --reflink=auto -p "$@"
        }
else
        copy() { cp -p "$@" ; }
fi

want() {
        local fname="$1"
        test $WANTED = $includeEverything && return
        case "$fname" in
                (autosave.*) test "$WANTED" = "$includeAutosave" ;;
                (save[0-9][0-9][0-9].*) true ;;
                (*) false ;;
        esac
}

snapshot() {
        local i # puke
        for i in *.mm6 *.mm7 *.dod ; do
                test -e "$i" || continue
                want "$i" || continue
                local dir ts dest
                dir=timeline/"$i"
                test -d "$dir" || mkdir -p "$dir" || exit
                ts="$(timestamp "$i")" || exit
                dest="$dir/$ts $i"
                test -e "$dest" && continue
                echo "bkup $i to $dest"
                #logger "bkup $i to $dest"
                copy "$i" "$dest" || exit
        done
}

trypolling() {
        # as of 3.14-8 inotify --help exits FAILURE
        #inotifywait --help >/dev/null || return
        type inotifywait >/dev/null || return
        while : ; do
                snapshot
                # -t timeout => exit 2, but it's DOCUMENTED to be so :D
                inotifywait -q -t 2687 -e modify . && continue
                e=$?
                test $e -eq 2 && continue
                return $e
        done
}
justdoit() {
        while : ; do
                snapshot
                sleep 13
        done
}

trypolling || justdoit

# mm6 --> mm7 --> dod (of course)


For the remaining 99%, save this as "filename.js":

Code: Select all

// mm678 merge => keep a timeline of saves, to report bugs etc.
// to use a different directory, pass it as the only argument, as in:
//        cscript this-file.js "C:\path\to\game\Saves"
//
// TODO translate to powershell/jscript/whatever is nice to have on windows for non developers
// TODO on windows don't close the cmd window or something
// powershell -ExecutionPolicy Unrestricted -File nameofthisfile
// also, slow startup => jscript/vbscript?
// omg, the JScript docs are horrible!

function getenv(s) {
    var objShell = WScript.CreateObject("WScript.Shell")
    // expands "%PATH%" to $PATH, but "%FOO%" stays "%FOO%"!!!
    var tmp = "%" + s + "%"
    var ret = objShell.ExpandEnvironmentStrings(tmp)
    objShell = null
    if(ret.localeCompare(tmp) == 0)
        return null
    return ret
}
if(getenv("PATH") == null) throw "null PATH"
if(getenv("asdf") != null) throw "asdf"

// smart enough to replace echo with popups if not run with cscript;
// good, but it means we keep getting popups if we run by opening the file :D
function echo(msg) {
   var silent = true;
   if(silent) return
   WScript.Echo(msg)
}

// Modify the locations below to match your setup
// (or pass an argument to this script)
function WINEPREFIX() {
    // *nix => separate $WINEPREFIX in $HOME for each program
    return catfile(getenv("HOME"), "Might & Magic 6+7+8/drive_c/drive_c/Program Files (x86)/3DO/Might and Magic VIII/Saves");
}
function VirtualStore() {
    // windows => %LOCALAPPDATA%\VirtualStore
    return catfile(getenv("LOCALAPPDATA"), "VirtualStore/Program Files (x86)/3DO/Might and Magic VIII/Saves");
}
function savesDirectory() {
    if (getenv("HOME") != null) {
        return WINEPREFIX();
    }
    if (getenv("LOCALAPPDATA") != null) {
        return VirtualStore();
    }
    throw "Saves directory?"
}

function directoryexists(d) {
    var fso = WScript.CreateObject("Scripting.FileSystemObject")
    return fso.FolderExists(d)
}

function flock(path) {
    var fs = WScript.CreateObject("Scripting.FileSystemObject")
    if(!fileexists(path)) {
        fs.CreateTextFile(path)
    }
    var f = fs.GetFile(path)
    // puke!
    var ForReading = 1, ForWriting = 2, ForAppending = 8
    var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
    // windows locks automagically
    // If the lock is already taken, it says "permission denied" TODO catch?
    var handle = f.OpenAsTextStream(ForAppending, TristateUseDefault);
    return handle
}

function popup(msg) {
    var myMsgBox = new ActiveXObject("wscript.shell")
    myMsgBox.Popup(msg)
}

function basename(path) {
    var fso = WScript.CreateObject("Scripting.FileSystemObject")
    // basename("a/b/c.foo") is "c"!
    return fso.GetBaseName(path) + "." + fso.GetExtensionName(path)
}

// 10 => 10; 1=>"01"
function t2(t) {
    if(t < 10) return "0"+t
    if(t>99) throw t
    return t
}

function createTimeline() {
    var timelinedir = "timeline"
    var objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    if (! directoryexists(timelinedir)) {
        objFSO.CreateFolder(timelinedir) // mkdir -p???
    }

    var objFolder = objFSO.GetFolder(".")
    //for(i = 0; i < files.length; i++) -- stupid javascript...
    var files = objFolder.Files // a COLLECTION, not an array...
    // Can you guess how many borked docs there are around?
    //Create an Enumerator object.
    var myCollection = new Enumerator(files);
    for (; !myCollection.atEnd(); myCollection.moveNext()) {
        var file = myCollection.item() // ABSOLUTE PATH!
        var filename = basename(file)
        if (! wantbackup(filename)) {
            continue
        }
        if (directoryexists(filename)) {
            continue
        }
        var mydir = catfile(timelinedir, filename)
        if (! directoryexists(mydir)) {
            objFSO.CreateFolder(mydir)
        }
        var mtimenumber = objFSO.GetFile(filename).DateLastModified
        // DateLastModified PRINTS like a date, but it's just a number...
        // give me STRONG TYPING DAMMIT!!! or at least typeof()!!!
        var mtime = new Date(mtimenumber)
        var year = mtime.getFullYear()
        var month = t2(mtime.getMonth())
        var day = t2(mtime.getDay())
        var hours = t2(mtime.getHours())
        var minutes = t2(mtime.getMinutes())
        var seconds = t2(mtime.getSeconds())
        var stamp = "" + year + month + day + hours + minutes + seconds
        // XXX windows has 100ns time resolution, unix usually 1ns, FAT 2 seconds...
        var dest = catfile(mydir, stamp + " " + filename);
        if (fileexists(dest)) {
            continue
        }
        echo("bkup " + filename + " to " + dest)
        copyfile(filename, dest)
        // mtime is preserved automagically :D
    }
}

function fileexists(filename) {
    var fso = WScript.CreateObject("Scripting.FileSystemObject")
    return fso.FileExists(filename)
}

function stringEndsWith(s,t) { // don't ask
    return s.length >= t.length && s.substr(s.length - t.length).localeCompare(t) == 0
}
if(stringEndsWith("abc", "b")) throw "abc/b"
if(!stringEndsWith("abc", "c")) throw "abc/c"
function stringStartsWith(s,t) { // don't ask
    return s.length >= t.length && s.substr(0, t.length).localeCompare(t) == 0
}
if(stringStartsWith("abc", "b")) throw "start"
if(!stringStartsWith("abc", "a")) throw "!start"

// ONLY files named "save012.extension", so that eg "my first savegame" is left as is
function wantbackup(filename) {
    var keepAutosaves = true  // probably too much - unless debugging
    var keepEverything = false // backup even "my first game.dod"
    var extensions = ["mm6", "mm7", "dod"] // no "mm8"
    for(i = 0; i < extensions.length; i++) {
        e = extensions[i]
        if(e[0] == '.') {
            throw e
        }
        if (!stringEndsWith(filename, "." + e)) {
            continue
        }
        if (keepEverything) {
            return true
        }
        // regex in JScript???
        if (stringStartsWith(filename, "save")) {
            return filename.length == ("save001." + e).length
        }
        if (keepAutosaves && stringStartsWith(filename,"autosave.")) {
            return true
        }
    }
    return false
}

function catfile(a, b) {
    return a + "\\" + b // XXX
}

function copyfile(orig, bkup) {
    var fso = WScript.CreateObject("Scripting.FileSystemObject")
    fso.CopyFile(orig, bkup, true)
    fso = null
}

function chdir(dir) {
    var objShell = WScript.CreateObject ("WScript.Shell")
    //WScript.Echo("chdir '" + dir + "'")
    objShell.CurrentDirectory = dir
}
function pwd() {
    var objShell = WScript.CreateObject ("WScript.Shell")
    //WScript.Echo("chdir '" + dir + "'")
    return objShell.CurrentDirectory
}

function sleep(sec) {
    WScript.Sleep(sec*1000)
}

function main() {
    savesdir = savesDirectory();
    switch(WScript.arguments.length) {
        case 0: break
        case 1:
            savesdir = WScript.arguments(0);
            break
        default:
            throw "Usage: prog [installationdirectory/Saves]"
    }
    chdir(savesdir)
    if (!stringEndsWith(pwd(), "Saves")) {
        throw pwd()
    }
    // merge vs mm6 vs ... avoid confusion :D
    echo(savesdir)
    WScript.Echo(pwd())
    var fdlock = flock("timeline.lock")
    while(true) {
        createTimeline()
        sleep(13)
    }
}
main()


What both of them do is keep a copy of every version every time you save (assuming you don't save more than once every few seconds, or you may miss a few seconds).
The windows version is especially hideous, I'll deny having written it... if anyone wants to write a more decent version be my guest; just please write it in something that requires as little effort as possible for nontechnical people (that's why I avoided powershell or compiled languages).

eilacomeva
Pixie
Pixie
Posts: 100
Joined: 20 Jun 2019

Re: Might and Magic 6, 7, 8 merge based on mm8 engine. [upd. 22.09.2019]

Postby eilacomeva » Feb 14 2020, 18:00

joanthedark wrote:
cthscr wrote:
joanthedark wrote:Is there any way to choose which place you want to go while changing continents? No matter how many times I reload I cannot seem to be able to teleport to Emerald Island anymore. A console command maybe?

Code: Select all

evt[0].MoveToMap{0,0,0,0,0,0,0,0,"7out01.odm"}

Note for Templayer: I didn't know that command 5 minutes ago. Manuals are good thing.


Thank you for the command!

I believe it is imperative to teleport any parties who started in Enroth or Jadame continents to Emerald Island as soon as they try to Town Portal to Antagarich continent, otherwise you will have stuff like this:

(skip image)

Lord Markham is not in his throne room in Tatalia because we never triggered (or finished) the Emerald Island quest, no idea if it's intentional.

You also miss out on Mr. Malwick's subquest which can only trigger in Emerald Island.

The good thing is that as soon as I entered the command provided by cthscr I got the second MM7 cutscene (Lord Markham speech in Emerald Island's treasure hunt) and all the fetch quests for the hunt were added to my quest log, meaning I can start MM7 as if my first continent choice was Antagarich. Hopefully this also means Lord Markham will be in Tatalia but I'll continue playing later and figure that out.

I would like to know what you guys think about it, should all parties who didn't start in Antagarich be teleported to Emerald Island as soon as they try out any MM7 content? Seems like there will be less headaches this way, otherwise you would be "forced" to always select Antagarich everytime you make a new game or you'll miss out some content.


My memory is a bit blurry because I've just played two games starting in Antagarich (dark magic, then light magic), but iirc you immediately get a message scroll telling you to go to Emerald Island, that was good enough for me.
Last edited by eilacomeva on Feb 14 2020, 18:01, edited 1 time in total.


Return to “Might and Magic”

Who is online

Users browsing this forum: No registered users and 12 guests