Development Philosophy[]
A few insights about the development philosophy of this game as stated by Droid Productions:
Droid Productions:
- "[tries] to make the core story be a single path, but making the side-stories be where the player gets to have agency."
- "[tries to] let the game unfold 'organically', to give reasons for doing things, as opposed to forcing them." "and nudge where necessary"
File Locations[]
Love of Magic stores its save and logfiles by default in the following locations:
PC(*): %USERPROFILE%/AppData/LocalLow/Droid Productions/Love of Magic
OSX: ~/Library/Application Support/Droid Productions/Love of Magic
- Note: On a MAC player.log may be located instead at ~/Library/Logs/Droid Productions/Love of Magic/
Linux: $XDG_CONFIG_HOME/unity3d/Droid Productions/Love of Magic
- Note: if $XDG_CONFIG_HOME is empty or unset $HOME/.config should be used: $HOME/.config/unity3d/Droid Productions/Love of Magic
Android: (may vary) internal storage/android/data/com.droidproductions.loveofmagic[1,2,3]
Steam/Wine: ~/.steam/steam/steamapps/compatdata/1270210/pfx/drive_c/users/steamuser/AppData/LocalLow/Droid Productions/Love of Magic
Book 1 save files have a .sav extension, Book 2 have .sav2 and in due time Book 3 will be presumably .sav3
Save files can be used cross platform.
The file used by Book 2 to import a Book 1 playthrough is the file act6.sav. If you want to safeguard a playthrough for import while playing Book 1 again you can make a copy of the file elsewhere and later place it back in the folder appropriate for your operating system to import it in Book 2.
Achievement progress, data on what tutorials have been seen etc. are registered in system.sav. Removing/renaming this file means starting over with a clean slate.
Love of Magic writes information useful to the developer in the file Player.log. Whenever the game is started the previous Player.log will be renamed to Player-prev.log.
(*) - While you can link directly to this on Windows PCs, if you attempt to browse down to your saves folder in Explorer you will need to show hidden files since the "AppData" folder is hidden. You can paste the entire path %USERPROFILE%/AppData/LocalLow/Droid Productions/Love of Magic into your search bar to get there also.
Stuck Achievements[]
Why They Get Stuck[]
Achievements are stored locally, and on Steam. These can get out of sync if you played early versions of the game before achievements were added/finished, or if you play offline, or played on the Beta or Development branches. When this happens you will find that you cannot seem to ever get the achievement on Steam.
This is because if you already have the local achievement, the achievement does not trigger again in game and Steam never sees it.
Resolution Process[]
The general process to resolve this is to remove the local achievements then do a playthrough to trigger them.
1) Exit the game.
2) Disable Cloud Saves in Steam
From your Library, go to Love of Magic. Select the gear/Properties. Under 'General' deselect "[ ] Keep games saves in the Steam Cloud for Love of Magic ((Book 2: The War / Book 3: The Return)"
3) Go to your saves and logfiles location (see file locations) and make a complete copy of it somewhere safe. --> Then completely clear the directory. <--
*Note: If you are playing Book 2, you can now put back all .SAV files and select 'I have an existing end of Book 1 Save.' If you are playing Book 3(when released), you can now put back all .SAV and .SAV2 files and select 'I have an existing end of Book 2 Save.' It is important there are no .SAV files if you are playing Book 1, no .SAV2 files if you are playing Book 2, and no .SAV3 files if you are playing Book 3.
4) Start the game and begin a fresh play through.
5) Clear Achievements in debug(CTRL J) - (This should be redundant, but won't hurt anything either)
6) Achievements are now obtainable on Steam as expected. Continue the play through until you get the achievement(s) you are missing.
7) When you have the achievement(s) you needed, exit the game.
8) Go to your saves directory again and clear it (or save it somewhere else if you've grown attached to this play through.)
9) Copy your original saves information back.
10) Turn cloud saves back on in Steam.
From your Library, go to Love of Magic. Select the gear/Properties. Under 'General' select "[X] Keep games saves in the Steam Cloud for Love of Magic (Book 2: The War / Book 3: The Return)"
11) Load the game back up, all your old saves and achievements will be there, your saves will sync back up to Steam, and you will also now have the achievements you just added that were previously stuck.
Why Separate Apps/Downloads?[]
There are multiple reasons for this:
1) For developmental reasons, DroidProductions forks the code when a book is complete. This keeps changes in Book 2 from breaking the game in Book 1.
2) Android has application file size limitations (2GB), with a single book approaching that size, the choices are to re-architect the application to have it side load content or split into multiple applications.
3) It provides a clean break allowing development to move forward on the new content without the major time-sink of revisiting and adjusting old content excessively.
Obtaining and Supporting the Game[]
Supporting the game primarily consists of purchasing it or funneling money to DroidProductions in some fashion. You can obtain the game without purchasing it however, although if you help support the game you get other perks and access to development builds. (Droid's 'development' builds tend to be as stable and polished as many 'release' quality builds.)
There are several ways to go about obtaining the game with various advantages and disadvantages.
STEAM[]
You can purchase the game on Steam for $15 and it will be in your Steam library forever.
Advantages:
- You can leave a review which is counted by Steam. This is very helpful in getting the game visibility.
- You have access to the most frequent 'beta' updates on Steam (Steam Published Beta Builds)
- Updates are done as differential updates and handled automatically by Steam.
Neutral:
- One time purchase. Does not provide ongoing support for the author (or expense for you.)
Disadvantages:
- Requires Steam. Not available in some countries (e.g. Germany).
- Some individuals do not want an AVN game (even a relatively tame one like LoM) visible to their friends on Steam.
PATREON[]
You can join Droid's Patreon at various levels to help support ongoing development of the game.
Advantages:
- Provides ongoing support for game development.
- Discord role assigned based on subscription level
- Free Steam Key for the game if desired (access to frequent Steam Beta Builds)
Disadvantages:
- Monthly Subscription
- Supports Patreon (some individuals have very strong reservations about supporting Patreon.)
- Free Steam key reviews of the game do not count towards Steam game stats.
ITCH.IO[]
You can purchase the game on Itch.IO for $15 or more.
Advantages:
- Can purchase at a higher price to support game development
- Access to Public Beta Builds, downloadable from ITCH.IO
- Droid will provide a free Steam Key for the game if desired (access to frequent Steam Beta Builds)
- Doesn't support Patreon :-)
Neutral:
- No ongoing support for the author (or expense for you)
Disadvantages:
- Free Steam key reviews do not count towards games stats on Steam. Only Steam purchased key reviews do.
GAMEJOLT[]
You can obtain Public Release Builds on GameJolt
Neutral:
- Does not support the game.
Disadvantages:
- Official Public Releases only.
- No access to Public or Steam Beta Builds
DISCORD[]
Discord is primarily a communication, support and chat medium. It is not a way to support the game, but links to builds are available there.
Advantages:
- Latest Discord Published Beta builds (most frequent behind Steam Published Beta builds) download locations listed in the #lom-builds discord channel
- #love-of-magic is the most active chatter channel regarding all things Love of Magic, with sometimes hundreds of messages per day. DroidProductions is extremely active in the channels providing support and assistance as needed. (Note that Droid has a 'day job' and is on an Asian time zone.)
Disadvantages:
- Does not support the game.
F95Zone.to[]
Arrrrr matey, ye ken obtain that thar game on F95Zone
The Game thread links to various download sites for Public Betas.
There is also a less well known Development Thread there. It is mostly useful for wallpapers and sigs with no active discussions.
Advantages:
- Access to Public Beta Builds downloadable from various download sites.
- Most active external forum.
Disadvantages:
- Does not support the game.
Other[]
Any way you can funnel funds to Droid might work. Other possibilities will be listed here as they are discovered.
The following is a list of known ways some provide additional support:
- Gift Cards - Bear in mind cards must be usable in Asia, where Droid resides. Check with Droid what works for him.
- Rendering - Droid's 'Rendering Intern Extraordinaire' (Pandaman) will assist him doing complicated rendering on his higher-end system at times. Droid is not actively looking for additional assistance in rendering, but if you are highly proficient in Daz/Blender etc. with a high end rendering system, you could always offer.
- Wiki Updating and maintenance - This WIKI is by fans of LoM for fans of LoM. It is not managed by Droid, although he will answer questions related to it to help make it more accurate. If a part of the wiki is missing or outdated, updating the wiki helps makes things better for other players and the experience more enjoyable. This can indirectly lead to additional support or additional available time for Droid.
- Bug Reporting - Always useful. Providing screenshots and player.log files in the #lom-bug-reports channel helps Droid improve the game. Spell Checking errors are reported in a standardized fashion on the #lom-spellcheck channel.
- Answering Routine Questions - Many questions on various forums (Steam, F95, Discord...) are repeats. Answering these (respectfully) can help free up Droid for other activities (like working on the game!)
- WIshlisting the book(s) on Steam improves their visibility.
Latest Builds[]
Book 1, 2, and 3 (eventually) are available as separate downloads. This reduces download sizes and keeps build size within Android's limits.
BOOK 3 PLAN
"Development plan is Book 3 day to day updates on development branch, then when I finish an act I push it to beta, then when I finish the 5-6 acts of the game, I release it as a new product" - Droid Productions
Builds and updates are published on three tracks.
STEAM PUBLISHED BUILDS[]
- The very latest beta-build is always available on Steam.
- If you are not able to use Steam to play Love of Magic then you will need to stick with the non-steam (Discord Published) builds.
- Steam builds are iterated quickly, short-lived beta builds often appear only on Steam.
- Steam downloads are 'diffs' by nature and generally small. Conversely, "Discord Published" and "Official Public" builds are available as full downloads only. Steam is the only way the game is available in update/diff downloads.
- Steam beta builds often do not include all platforms. If a tester is interested in a platform he will include it, but if noone is testing on a platform he may not.
DISCORD PUBLISHED BUILDS[]
- The latest public (non-steam) beta builds are posted on the #lom-builds channel on the LoM Discord and available from the usual free download sites. These are not posted anywhere except the discord, but are not hidden.
- DroidProductions updates the Discord published builds slightly less often than Steam builds for the practical reasons noted here. The difference between Discord and Steam builds varies, sometimes they are close and others they can be game 'days' behind.
- Discord Published Builds are available on a variety of download sites and are always full/standalone builds.
- Discord Published Builds may not include all platforms depending on feedback. (If someone wants it, he will be sure to include it.)
OFFICIAL PUBLIC BUILDS[]
- Official Public Builds are less frequent. These are released typically after each ACT is completed and are uploaded to a variety of public sites.
- Public builds are not delayed and are current when they are published.
- Official Public Builds are available on a variety of download sites and are always full/standalone builds.
- Official Public Builds will always include all platforms available.
Game+/Act+ Play[]
In Book 2 and later it will sometimes be possible to continue playing content after the end of the current act. e.g. "Act VII+"
When Act+ play is available, you can engage it by playing all the way through to the end of the current act.
This will create the "End of Act ###" save file.
Once this file is created you can load it from the load menu and continue playing indefinitely.
Once the next act is available, the game will offer to roll back to the day the new Act starts and continue the timeline from there, while retaining the levels, stats, quest progress, etc. gained in Act+ play. You can return to the game, or continue in Act+ play.
This means you can buff yourself grinding away for game 'months' in the Act+ world, and be much stronger for the next Act.
The downside is that this also means you are playing content that may be intended to last all the way through the various acts in the book and may starve yourself for content later as the main story progresses. For example you could read ALL of Dylan's books.
GETTING MORE TIME IN BOOK 1[]
The End of Content has moved to Book 2, so Game+ doesn't exist in Book 1 anymore. You can achieve similar results as follows:
- Load from ~day 114
- Open the Debug Menu (CTRL+J, then click the 'bug' at the top)
- Type 120 in the box next to the [Force Start Day] button and then click [Force Start Day], then click [RESUME] at the bottom.
Now play as long as you want before finishing Book 1.
- Note that you can save and load games normally while in this endless play mode
- When you are done and want to finish Book 1 and move on to Book 2, again use the debug menu (CTRL+J)
- Type 114 in the box next to the [Force Start Day] button and then click [Force Start Day], then click [RESUME] at the bottom.
- Play the game to completion (at the end of day 115 you complete Book 1 and create a current End of Act VI save)
- Start Book 2 and use your Book 1 save normally ([START] and then [I Have an existing end of Book 1 Save])
- Having played days 120 and later in book 1 won't affect Book 2, apart from you bringing your resources, stats and flags with you
You can gather cash and improve stats during Book 2 normally, but preparing in advance in Book 1 can make the play a bit less stressful. You will want a decent amount of cash early in Book 2 in order to avoid waiting on various activities.
Stat Checks in Book 2 to prepare for include
- STR - will be checked multiple times in Book 2. The highest check needs 100 for best result.
- Sword - You want this above 30 regardless for the damage boost
- Cash - You will want around $10k in book 2 for purchases.
GETTING MORE TIME IN BOOK 2[]
Now that end of content has moved to Book 3, use the exact same process as Getting More Time in Book 1, however the end of content is day 195 in Book 2, so load from ~day 194 and jump to day 200 or so. When done jump back to day 194 and play through the end.
Saves and Saving[]
Save Compatibility[]
1. Switching from Platform X to Platform Y and want to know if you can keep your saves[]
YES! Mac, PC, Linux, Android save formats are cross compatible. However you will have to copy the files from one system to another. The save locations are noted here File Locations
2. Switching from offline game saves to playing on steam. What do I need to do?
Nothing at all. The game should see your old saves when you load the game in Steam and allow you to continue playing them normally. Note that if you are playing public beta releases (e.g. Act VII chapter release before all of Book 2 is released) you will need to enable beta play in Steam to play those saves (they will play without doing this, but it will just be free roam.)
End of Act VII save not updated on replay[]
It does, but it won't re-cache it (which it does the first time you enter the save game screen). Restart the game and the save will update.
Can't Find New "End of Act ####" Save![]
Don't Panic!
The first time you complete an Act in any version it creates the "End of Act ####" file, and its place in the saved game list is set.
When you replay the end of the act, it overwrites the file, but the location stays at the same place in the saves list in game. The game is looking for that file in the list at that spot and doesn't care that the timestamp has changed. You will have to scroll down through your old saves to find it. You will not get a new save entry in the list (in other words you will never get two "End of Act ####" saves.)
IF this bothers you (you really only have to find it once since you will be saving your Act+ play anyway in new saves), there is a trick you can use to move it to the top of the list (there are several ways to do this, this is just one):
- Confirm in STEAM that under your properties/General tab "Keep games saves in the Steam Cloud for Love of Magic" is checked.
- Close the game
- Go to your saves directory
- Find the current Act#.sav# file you want to move
- Rename the current Act#.sav# file to something else for safekeeping (e.g. Act#.old#)
- Load the game.
- In the LoM list, the "End of Act ####" will be removed from the current slot (since it is not there.) Then Steam will notice it is missing and immediately pull the file back down from the cloud and the game will recreate it at the top of the saves list.
Another possibility is caching. The first time you open the saves screen, saves are cached. This is done so the screenshot can be presented. Because of this it won't see an update to an existing save properly until you exit and reload the game
Book 1 save not seen by Book 2 (Android)[]
Currently Android treats Book 1 and Book 2 as different games. Built in protections keep the two games from reading each other's files.
To work around this, you can use any Android file manager and navigate to the Android saves directory and copy the act6.sav file from the Book 1 save location to the Book 2 Save location (see file locations)
Beta Play[]
Why on Steam?
According to Droid Productions it is a lot easier (click a button) to do Delta-patches on Steam rather than re-building nine builds, zipping, uploading 50+ GB (5 builds, +4 mirrors, +Steam, +Itch.io, +GameJolt), waiting for mirrors to come online and not fail, etc. Overall this saves him several hours each time he wants to push an update.
This time savings allows for more frequent updates, and more time to be put into developing and progressing the game itself, which is a benefit for everyone.
Note that public builds will still be pushed out, but they will be less frequent.
UPDATE: Due to complaints about broken saves on the Beta branch. In April 2022 DroidProductions added a 'Development' branch, for in development content. For Book 3, Beta branch will now be updated at the end of each Act giving it a higher degree of stability. As-it-happens in development content has moved to the Development Branch.
Do I have to repurchase?[]
No, if you are a supporter or purchased the game somewhere other than Steam and want to play the beta you can poke Droid in the Discord channel, he will get you a free Steam key for it. Of course if you want an easy way to show some extra support, feel free to pick up a copy on Steam anyway to help the stats on the game. :-)
Free Steam keys and key holder reviews aren't counted in statistics like ones from Steam purchased copies.
Applying a Steam Key[]
After obtaining a Steam key (It will look something like H53JG-NE5Y7-ZVLJM)
1) Go to 'Activate a product on Steam' on the bottom left of the STORE page.
2) Click 'Next' on the Product Activation popup.
3) Click "I Agree" on the Subscriber Agreement.
4) Type in the Steam Key and click 'Next'
By default you will be on the main line, which gets updated with the public builds.
If you would like to get the more frequent (sometimes several daily, other times could be a week or more) builds, the next step is enabling the beta.
Enabling the Beta[]
1) Enable the Beta in Steam
From your Library, go to Love of Magic. Select the gear/Beta. In the drop down select "Beta - Beta" or "development - In development. May contain bugs."
- DO NOT attempt to enter a 'beta code', leave that blank. No code is needed.
2) Start the game. (Note - you must do so from within the Steam interface, NOT from the desktop shortcut.)
3) Instead of launching directly into the game you will now be presented with a Selection box (if you are not, your game has not updated from Steam yet)
- Play Love of Magic
- Play Book 2: The War
Select 'Play Book 2: The War' and click 'Play' to play the beta.
Note that if you have purchased BOOK 2, the options change and you have the option to play Book 3 beta/dev but not Book 1:
- Play Love of Magic Book 2: The War
- Play Book 3: The Return (Development Branch)
- Play Love of Magic Book 2: The War (Development Branch)
Notes on Beta Play[]
Droid Productions has remarked that the 'beta' is really more of an 'alpha'.
From update to update you may see systems, quests and events added or tweaked. The beta is very much a work in progress and there is not always an obvious heads-up when you reach the end of current beta content.
Swing by the discord forums for current information.
Development Branch[]
In April 2022 DroidProductions added a 'Development' branch on Steam
Accessing and enabling this is identical to accessing the 'beta' branch. This appears to be intended as a more 'Alpha' type of branch for development ongoing and is expected to break frequently. This will cause the 'beta' branch to be updated less frequently, but be more stable and reduce issues players run into with broken saves etc.
Enabling the Development Branch[]
1) Enable the Development Branch in Steam
From your Library, go to Love of Magic. Select the gear/Beta. In the drop down select "development - In development build. May accidentally break your savegames."
- Do not enter a 'beta access code' or click 'Check Code' - These are not necessary. Just close settings.
2) Start the game. (Note - you must do so from within the Steam interface, NOT from the desktop shortcut.)
3) Instead of launching directly into the game you will now be presented with a Selection box (if you are not, your game has not updated from Steam yet)
- Play Love of Magic Book 2: The War
- Play Book 3: The Return (Development Branch)
- Play Love of Magic Book 2: The War (Development Branch)
Select 'Play Love of Magic Book 2: The War (Development Branch)' and click 'Play' to play the development code for Book 2.
Select 'Play Book 3: The Return (Development Branch)' and click 'Play' to play the development code for Book 3.
General Troubleshooting[]
OpenGL[]
OpenGL play is now available although still experimental. It can be used to expose video driver issues. To switch to this from the default DirectX video, add one of these to your Love of Magic command line or to the Steam Launch options under Love of Magic.
-force-glcore
-force-opengl
Getting Stuck[]
While rare, if something is out of sync between saving, rewinding, playing the beta or doing something Droid just never accounted for you may get 'stuck' in a location with no exit options and no location pin to select (or a non-working pin)
You've got a few options other than replaying from your last save or loading from day to try:
- Rewind - Often a good option, this may get you out of the issue.
- no_exit flag - Open the debug menu (Control J) and look for the flag “no_exit” at the bottom left corner. This flag, if checked, prevents you from moving around locations and is set during certain scripted events to keep you from exiting prematurely. If you uncheck it, you should be able to move around at will. In the beta in an unfinished location, there may simply be no exit option at all, in which case this won't help.
- Load From Day - You can probably check what your current day is and then Load from Day and only lose 1 days worth of effort.
- Advance time - Late at night will send you to bed, taking you out of the location.
- Revert to last save - Worst case option.
- 'Force Change Location: Ctrl J (to enable the debug menu, then click the 'bug' to open the menu). Once you have the debug menu open, in the Execute Script' Box type "GoToLocation=Camelot" and hit Enter. (This will jump you to Camelot)
If you do get stuck, it's not intended behavior. Be sure to drop a note in the LoM Discord on the #lom-bug-reports channel with details so Droid can go fix it.
There is also a background crash that can occur that can result in 'stuck' behavior you can check for.
Stuck on the Elsewhere Map[]
If you are playing at the very end of content, or manage to get into an unexpected situation, or Droid just forgets to clear the condition, it is possible to get trapped on the map of Elsewhere. This can occur because Droid has implemented a mechanism to make sure you exit Elsewhere exactly where desired for story reasons. LockElsewhereExit
If you are stuck on the map, you can enter the debug menu (CTRL J and click the bug icon) and put the following in the 'Execute Script' field and hit Enter.
- LockElsewhereExit=
This will clear the Elsewhere map exit restrictions.
Another example would be
- LockElsewhereExit=Camelot
Which would allow exiting only at Camelot.
Hang/Crash Stuck[]
On Windows, when running the downloaded version (not Steam) of the game, if you
- Use unusually long pathing
- Include special characters in your path such as $ {} [] - *
- Do redirection on your folders in a fashion that Unity doesn't like
- Or probably various other things.
Unity, the engine the game is built on, may be unable to load the addressables and crash in the background. When this occurs, the game may continue 'running' but be unresponsive, missing options, or stuck.
To check for a crash, look at the player.log in the usual location and see if it contains a section towards the end:
- Crash!!!
- SymInit: Symbol-Searchpath: <very long or sketchy paths>, symOptions: 534, Username: <username>
- After which will be a Long list of files, A stack trace, invalid address errors, missing functions, etc.
- At the end of the stack trace there will be a note to see the crash report in
- c:/Users/<username>/AppData/Local/Temp/Droid Productions/Love of Magic/Crashes
If you see this, try unzipping the game into something like c:\temp and playing it from there instead.
MAC Permissions Issues[]
Solution 1
- As of a recent update, OS-X auto-quarantines downloaded apps. You'll need to remove the quarantine flag to get it fixed.
- At the command prompt you want to type just these two command strings:
- xattr -rc /Users/zzz/Desktop/love_of_magic_book2
- sudo chmod -R 755 /Users/zzz/Desktop/love_of_magic_book2
- where "zzz" is your username.
Solution 2
- I'm assuming you've downloaded and decompressed the app.
- Open up the Terminal app. Type
- xattr -rc
- Drag the app from the Finder into the terminal window (or type the path if you are so inclined). Do be sure to have a space in between the -rc and the path. Hit enter. Again in the Terminal app type
- sudo chmod -R 755
- And again drag the app from the Finder (or type the path if that is more your speed), making sure there is a space between the 755 and the path. The SUDO command will ask you for your password so you will need admin privileges.
High GPU Usage[]
There's an optimization setting for graphics cards, on Nvidia it's called "Performance".
If you set that, the driver will ignore the game's VSync settings, and try to crank out maximum FPS.
That's probably great if you're playing Fortnite, but Love of Magic (and other Visual Novel style games) are really quite simple to render, so rather than getting 100FPS, you're getting 1000 FPS. Fortnite, or Assassin's Creed, would max out the CPU well before you got too insane, but LoM barely pushes the CPU at all. If you had some way of checking the framerate you might notice some truly insane numbers.
You can switch from 'performance', or if you wish to keep the driver set to performance, using G-sync/Freesync/other VRR technologies will keep the FPS (and GPU usage) in check.
Settings will vary depending on card, driver version etc. Some reported options:
- In the Nvidia control panel check "Let application control 3d"
Avast False Positives[]
A couple of revisions of the game downloaded from Steam have been incorrectly flagged by Avast as 'IDP.Generic'
If this occurs, it will likely cause the game to be unplayable, 'missing executable', or the file verification from Steam to fail with write failures attempting to re-acquire the file.
You can upload the executable to VirusTotal or otherwise validate for yourself that it is not malicious and have Avast create an exception.
It may be necessary to restart Steam after restoring the file.
Understanding Rewind[]
Rewind can behave unexpectedly in some situations. This is due to how it works.
Every time you begin a conversation, the game creates an 'autosave', if you hit rewind, it reloads that last autosave.
If you begin a conversation and save the game part way through it. Then go load some other save and play, new autosaves will be created. If you then load the save from the middle of a conversation the game will load the last created autosave, which may be a very different state and day from the current conversation.
Once you are aware of this, the behavior of rewind makes better sense in those edge cases.
Android Updates after download![]
As of 0.2.22, assets in Book 2 (images and animations) make the game simply too large to fit within the 2gb APK limit of Android.
Droid has resolved this by having Android (only) pull down assets from the cloud (LoveOfMagic.Net) on first run.
- Currently the amount of data in the cloud is ~1GB
- Subsequent updates may be 'diff' capable, so if things change you don't pull down the entire 1GB again.
- Steam remains the primary distribution for PCs
- The current hosting is known to throttle if too many people hit it in a short time. He may switch to a proper CDN.
Debug Menu[]
There be dragons here...
The debug menu is not locked out during game play. This means that you can enter the debug menu and fix odd issues, or totally and completely destroy the game and all chance of enjoying it. In general it is best to avoid the debug menu unless you have a reason to enter it.
The Debug menu is accessed by hitting "CTRL J" during play. A small 'bug' will appear at the top next to the other game icons. Clicking on this will open the debug menu.
The Debug menu is broken into four sections.
Stats[]
Book 1: STR, INT, CHR, SWORD, RP, Cash
Book 2: STR, INT, CHR, day, levels, INGREDIENT, FACIAL_MOM, Questions, OLIVIA, INGREDIENTX, CROWLEY, ROSE, SWORD, POWER, RP, MP, Emily_ALLY, Molly_ALLY, Bella_ALLY, DARK, DOJO_TRAINING, MEDITATION, Katie_ALLY, Dylan_ALLY,
As with any game, using cheats can ruin gameplay and story and keeps the game from being played as intended. The game has character advancement along the way that is intended to be more than sufficient (Elsewhere runs, reading, training in the dojo, eating meals, etc.) to play and fully enjoy the game.
Notes
- Raising character stats too high , especially early in the game in Book 1, will break scripted events.
- It is best to keep your stats below 20 up until the End of Act 1. Below ~50 until Act IV, and below 100 until the end of book 1
- For example in the. Minotaur, Lich, Dragon, & Golem fights it can become possible to kill the mob in combat before the scripted outcome occurs. This can cause your game to become stuck or miss needed flags.
- Raising character stats above 200 is not recommended in Book 2 for similar reasons.
Flags[]
- All known game flags set are visible in this section, along with their current state.
- You can add additional flags if they are missing, or change the set state of a specific flag. When created, a flag is 'checked' by default. Setting flags can destroy continuity or introduce errors and crashes. In general, unless you have a good reason to do so, it is best to avoid changing these.
Some Commonly used flags[]
BOOK 1[]
GAME_OF_FRIENDS - mentioned by Droid in a discussion online. You can enable this flag to see the Pr0n games on the protagonist's computer that are normally removed due to Steam requirements.
BLACK_ROSE1
BLACK_ROSE2
BLACK_ROSE3
- If you are playing BOOK 2 and did not complete the Black Rose quests in Book 1, you can set the "BLACK_ROSE2" and "BLACK_ROSE3" flags to enable the continuing Black Rose content in Book 2.
NO_EXIT
- If this is set you will not be able to exit a location. Generally used if you need to complete activities at a location before leaving and unset after that is done. Set this to enable linked locations so you can move normally to connected locations (e.g. if stuck)
BOOK 2[]
BLACK_ROSE4
WARTHOG_AMMO
FOR_THE_HORDE
- Setting these two flags enables the event to head to elsewhere and watch the Warthog attack the Outsider with the Orcs.
TEA_HOUSE_CONVO
- May unlock the Dining Room in the Tea House if that is stuck (or ctrl+J, UnlockRoom=DiningRoom)
MERMAID_AVAILABLE
- If you are having trouble getting the A Little Mermaid quest and are going to elsewhere alone correctly. You can set this to force it.
KATIE_FIREMASTER1
Mentioned by droid in chat - if you forget to get Katie the flawless fire gem in Book 1, you can set this in Book 2.
KATIE_FIREGEM
- Flag in Book 2 to increase Katie's fire damage. "if KATIE_FIREGEM is set, she'll use that."
KATIE_FIREGEM
- After the WarthogComplete conversation these trigger a short (in development) event.
- DRUNK_ORCS, IN_GreatHall
dresden_first
- On day 149 if you chose Dresden this flag is set. There is apparently no similar cult_first flag.
DRACO_HUNT
- After talking to Jannice and Draco in the KD for the first time, this is set to enable the Draco hunting quest. Can be used if you just want to see it or it isn't triggering for some reason.
- Giving Molly to build a room will set one of the following flags
WANT_DOJO
WANT_TEA_HOUSE
WANT_DINING_ROOM
WANT_OUTDOOR_BATH
Once built, the following are set
BUILT_TEA_HOUSE
BUILT_DOJO
BUILT_DINING_ROOM
BUILT_OUTDOOR_BATH
- These four flags are set as you build the expansions to the King's Dragon. If you have issues with an event in a location triggering, you can double check that you have the associated flag.
BOUGHT_BODYSUIT
- Buying the Lingerie for Emily (After day 167) will also set the following.
- SetDelayFlag=EMILY_BODYSUIT,1
- SetDelayFlag=GIFTWRAPPED,3
VCR Quest Related
TriggerQuest=VCR_2
TriggerQuest=VCR_3
- VCR_1
- VCR_2GIM, VCR_3
Additional Cheats[]
- Notably - Force Start Day, Give All Gems, Unlock All Cards, Unlock Locations, Reset Achievements.
- You can also execute specific scripts if desired and you know which one to run.
- The bottom half of this section is the final lines of the player.log file.
Execute Script[]
Scripts in the game can be executed directly within the Debug menu. This is done by typing script=parameters on the Execute Script line and hitting enter.
This is primarily included for reference.
Example Uses:
GoToRoom=Camelot
Jump location to Camelot
Remove=Dylan
Remove Dylan from the current room.
Add=Molly,4
Add Molly to the current room all the way to the right (1,2,3,4 are valid positions Far Left, Left, Right, Far Right)
Be sure to create a save before executing scripts. Issues introduced via scripts are not supported.
Known Scripts[]
These are known scripts as of the end of Act VIII.
In general unless DroidProductions recommends use of one of these they are best avoided.
Remove | (string name)=>World.instance.RemoveCharacter(name)); |
Swap | (string nameAndName)=>World.instance.SwapCharacter(nameAndName)); |
Add | (string nameAndSlot)=>AddCharacter(nameAndSlot)); |
MoveRoom | (string nameAndSlot)=>MoveCharacter(nameAndSlot)); |
JumpToRoom | (string roomName)=>GoToRoom(roomName, true)); |
GoToRoom | (string roomName)=>GoToRoom(roomName)); |
MoveAll | (string roomName)=>MoveAll(roomName)); |
ForceDay | (string ignore)=>World.instance.currentLocation.ForceDay()); |
ForceNight | (string ignore)=>World.instance.currentLocation.ForceNight()); |
UpdateTimeOfDay | (string ignore)=>World.instance.currentLocation.UpdateTimeOfDay()); |
UnlockCard | (string cardName) => Board.instance.UnlockCard(cardName)); |
SetActiveCharacter | (string charName)=>forceActiveCharacter = charName); |
SetState | (string nameAndEmotion)=>SetCharacterState(nameAndEmotion)); |
SetDelayFlag | (string nameAndTime)=>AddDelayedFlag(nameAndTime, true)); |
DelayMessage | (string nameAndTime)=>AddDelayedMsg(nameAndTime)); |
ClearDelayFlag | (string nameAndTime)=>AddDelayedFlag(nameAndTime, false)); |
ShowItem | (string name) => {Item item = World.instance.GetItem(name);if (item)GameUI.instance.inspectItemPopup.Popup(item);} ); |
GainItem | (string name) => {World.getPlayer.Inventory.AddItem(name);} ); |
LoseItem | (string name) => {World.getPlayer.Inventory.AddItem(name, -1);} ); |
Message | (string messageName) =>GameUI.instance.computerUI.UnlockMessage(messageName)); |
OpenComputer | (string none) => { GameUI.instance.saveLoadUI.QuickSave(start_conversation+SaveLoadUI.saveExt); GameUI.instance.computerUI.Show(true); }); |
CloseComputer | (string none) => GameUI.instance.computerUI.Show(false)); |
Achievement | (string achievement) => GameUI.instance.achievementsUI.TriggerAchievement(achievement)); |
IncCounter | (string counterName) => GameUI.instance.achievementsUI.IncCounter(counterName, 1)); |
IncLocalCounter | (string counterName) => GameUI.instance.achievementsUI.IncLocalCounter(counterName, 1)); |
Cash | (string intNum) => GameUI.instance.frontendUI.MakeCash(StrReplace.ParseInt(intNum))); |
sfx | (string effectName) => GameUI.PlaySound(effectName)); |
StopMusic | (string ignore) => GameUI.instance.uiAudio.StopMusic()); |
Music | (string musicName) => GameUI.PlayMusic(musicNam, 1.0f)); |
PlayMusic | (string musicName) => GameUI.PlayMusic(musicName, 2.0f)); |
PlayMusicFade | (string musicName) => GameUI.PlayMusic(musicName, 5.0f)); |
GainStr | (string intNum) => {World.getPlayer.GainStat(CorePlayerStats.STR, OptionalInt(intNum));}); |
GainChr | (string intNum) => {World.getPlayer.GainStat(CorePlayerStats.CHR, OptionalInt(intNum));}); |
GainInt | (string intNum) => {World.getPlayer.GainStat(CorePlayerStats.INT, OptionalInt(intNum));}); |
HighlightIcon | (string icon) => { GameUI.instance.frontendUI.HighlightIcon(icon); } ); |
GemTutorial | (string tutorial) => { GameUI.instance.gemUI.Show(true); TriggerTutorial(Equipment);}); |
Tutorial | (string tutorial) => { TriggerTutorial(tutorial);}); |
TriggerFade | (string ignore) => { GameUI.instance.TriggerFade();}); |
ShutdownVideo | (string ignore) => { GameUI.instance.fullscreenGraphics.ShutdownVideo(); }); |
///HideConversation | (string time) => HideConversation(time) ); |
UnlockLocation | (string newLocation) => { GameUI.instance.frontendUI.UnlockLocation(newLocation); }); |
LockLocation | (string newLocation) => { GameUI.instance.frontendUI.LockLocation(newLocation); }); |
RefreshIngredients | (string ignore) => RefreshIngredients() ); |
SellIngredients | (string ignore) => SellIngredients() ); |
QueueConversation | (string conversationName) => { GameUI.instance.conversationUI.QueueConversation(conversationName); } ); |
SaveScene | (string sceneName) => GameUI.instance.saveLoadUI.SaveScene(sceneName) ); |
Plan | (string planName) => { GameUI.instance.planUI.TriggerPlan(planName);}); |
ReadChunk | (string ignore) => { if (currentBook != null) currentBook.ReadChunk();}); |
AdvanceTime | (string isNight) => { AdvanceTime(false); }); |
AdvanceTimeAndSleep | (string isNight) => { AdvanceTime(true); }); |
AdvanceDay | (string ignore) => { World.instance.AdvanceDay(); GameUI.instance.conversationUI.AdvancedTime(); }); |
CalenderEvent | (string planName) => { World.getSave.TriggerCalenderEvent(planName);}); |
OpenURL | (string url) => { Application.OpenURL(url);}); |
EndOfAct | (string actNum) => { GameUI.instance.endActUI.End(actNum); GameUI.instance.endActUI.Show(true); } ); |
SilentEndOfAct | (string actNum) => GameUI.instance.endActUI.End(actNum));
|
Upsell | (string itemName) => GameUI.instance.endActUI.UpsellItem(itemName)); |
SetChloeName | (string charName) =>SetHerName(Chloe, What was her name again?, I think it was... C something?)); |
SetEmilyName | (string charName) =>SetHerName(Emily, What's her name?, She feels like the most important person in the world to me...)); |
SetKatieName | (string charName) =>SetHerName(Katie, What's your name?, I guess we'll get to know each other pretty well.)); |
SetMollyName | (string charName) =>SetHerName(Molly, What's your name?, Who on earth is this?)); |
SetErecName | (string charName) =>SetHerName(Erec, Who's the guy?, Who's the stern guy in front?)); |
SetSarahName | (string charName) =>SetHerName(Sarah, Who is she?, That teacher looks pretty smoking.. what was her name?)); |
SetTormanName | (string charName) =>SetHerName(Torman, What's his name?, He's a bloody giant.)); |
SetJennyName | (string charName) =>SetHerName(Jenny, What's her name?, I guess this is a good place to be a goth.)); |
SetDianaName | (string charName) =>SetHerName(Diana, What's her name?, What's your name, ma'm?)); |
SetDylanName | (string charName) =>SetHerName(Dylan, Who are you?, Hi I'm....)); |
SetOliviaName | (string charName) =>SetHerName(Olivia, What's her name?, I'm pretty sure she's several cans short of a sixpack, but that rack is magnificent.)); |
SetAkaneName | (string charName) =>SetHerName(Akane, What's her name?, She seems so elegant and poised. Totally unlike that fox girl. )); |
SetAoifeName | (string charName) =>SetHerName(Aoife, What's her name?, Power radiates off the slim Fae girl, unlike anything you've ever seen before.)); |
SetSnowdropName | (string charName) =>SetHerNick(Snowdrop, Snowdrop, What's your name?, Oh, <b>me</b>? I'm...)); |
SetMollyNick | (string charName) =>SetHerNick(Master, Master, You will call me..., What do you want her to call you?)); |
SetBellaNick | (string charName) =>SetHerNick(BMaster, Master, I am your..., What should Bella call you?)); |
SetAkaneNick | (string charName) =>SetHerNick(AMaster, Master, I am your..., What should <AKANE> call you?)); |
SetEmilyNick | (string charName) =>SetHerNick(Beloved, Beloved, Just call me... , You will always be my...)); |
SetJennyNick | (string charName) =>SetHerNick(Lord, My Lord, Just call me... , In your dreams, what do you call me?)); |
SetGroupNick | (string charName) =>SetHerNick(Group, Knights of the Lake, We should be called The ..., We need a cool name for ourselves. Like a band name. We're The...)); |
SetIndustryNick | (string charName) =>SetHerNick(Corporation, Pendragon Enterprises, What should we call it..., Our new corporation should be called...)); |
SetKDNick | (string charName) =>SetHerNick(KD, Draco, What should we call him..., He looks like a... )); |
SetJalsaNick | (string charName) =>SetHerNick(JMaster, Lord, She should call you..?, No, bitch, I'm your...)); |
JalsaDefault | (string ignore) => World.getSave.SetNick(JMaster, Senapati)); |
// start of book 2 stuff | |
InitialPath | (string path) => InitialPath(path)); |
InitialGems | (string path) => InitialGems(path)); |
SexScene | (string name) => GameUI.instance.sexSceneUI.StartScene(name)); |
SetMyName | (string ignore) => GameUI.instance.computerUI.RenameMe()); |
SetBlur | (string enableBlur) => SetBlur(enableBlur == 1) ); |
PlayTheme | (string charName) =>PlayTheme(charName)); |
SetTheme | (string charName) =>PlayTheme(charName)); |
JoinTeam | (string charName) =>JoinParty(charName)); |
JoinParty | (string charName) =>JoinParty(charName)); |
LeaveParty | (string charName) =>LeaveParty(charName)); |
ClearAllies | (string charName) =>ClearAllies()); |
StartElsewhere | (string charName) => { Elsewhere.StartElsewhere(null, null, null); } ); |
PlayCharacterEffect | (string nameAndEffect) => PlayCharacterEffect(nameAndEffect)); |
EndCharacterEffect | (string charName) => EndCharacterEffect(charName)); |
Sorcery | (string sorceryName) => TriggerSorcery(sorceryName)); |
// poker | |
StartBattle | (string battleName) => GameUI.instance.TriggerFade( ()=> StartBattle(battleName, true))); |
EndBattle | (string ignored) => GameUI.instance.TriggerFade( ()=> Board.instance.EndBattle())); |
StartBattleNoDialog | (string battleName) => GameUI.instance.TriggerFade( ()=> StartBattle(battleName, false))); |
PokerEffect | (string gemName) => AddPokerEffect(gemName, true)); |
PokerEffectEnemy | (string gemName) => AddPokerEffect(gemName, false)); |
AddRandomGem | (string tier) => AddRandomGem(tier)); |
AddGems | (string gemlist) => AddGems(gemlist));
|
AddInitialGems | (string ignore) => AddInitialGems()); |
AddAlly | (string allyName) => AddAlly(allyName)); |
RemoveAlly | (string allyName) => RemoveAlly(allyName)); |
AllyUI | (string fromLocation) => { GameUI.instance.elsewhereTeamUI.Show(true); GameUI.instance.elsewhereTeamUI.openElsewhere = fromLocation; } ); |
ChargeX | (string ignore) => { GameUI.instance.cardGameUI.ChargeX(true); } ); |
GainMoves | (string turnCount) => GameUI.instance.elsewhereUI.AddTurns(StrReplace.ParseInt(turnCount))); |
// books | |
SelectBook | (string bookName) => World.getSave.currentBook = bookName); |
ClearBook | (string bookName) => World.getSave.currentBook = ); |
BuyBook | (string ignore) => PurchaseBook() ); |
// gems | |
SelectGemType | (string gemType) => World.getSave.currentGemType = gemType); |
SelectGemSize | (string intSize) => World.getSave.currentGemSize = StrReplace.ParseInt(intSize)); |
BuyGem | (string ignore) => PurchaseGem() ); |
SellGems | (string ignore) => GameUI.instance.sellGemsUI.Popup() ); |
GemShop | (string ignore) => GameUI.instance.gemshopUI.Show(true) ); |
GemsCombat | (string tutorial) => { GameUI.instance.gemUI.Show(true); GameUI.instance.gemUI.SetReadOnly(false);}); |
// elsewhere related actions | |
Heal20 | (string ignore) => HealPlayer(20) ); |
Heal50 | (string ignore) => HealPlayer(50) ); |
Heal100 | (string ignore) => HealPlayer(100) ); |
Like | (string charName) => AddLike(charName, 1)); |
Dislike | (string charName) => AddLike(charName, -1)); |
TriggerQuest | (string questNameAndStage)=>{ GameUI.instance.questUI.TriggerQuest(questNameAndStage); }); |
CompleteQuest | (string questName)=>{ GameUI.instance.questUI.CompleteQuest(questName); }); |
EnableElsewhere | (string location) => { World.instance.ShowElsewhereMap(true, location); }); |
DisableElsewhere | (string ignore) => { World.instance.ShowElsewhereMap(false, ); }); |
RefreshElsewhere | (string ignore) => { World.instance.ElsewhereMap.RefreshVisible();}); |
FocusElsewhere | (string onNode) => { World.instance.ElsewhereMap.PanTo(onNode);}); |
LockElsewhereExit | (string toLoc) => World.getSave.lockElsewhereExit = toLoc ); |
SetElsewhereZoom | (string zoomValue) => World.getSave.elsewhereZoom = StrReplace.ParseFloat(zoomValue) ); |
OpenKingdomEvent | (string ignore) => GameUI.instance.kingdomEventUI.Show(true)); |
KingdomEvent | (string name) => GameUI.instance.kingdomEventUI.UnlockEvent(name)); |
GainRP | (string amount) => GameUI.instance.kingdomEventUI.GainRP(amount)); |
VideoSpeed | (string speedPercentage) => SetVideoSpeed(speedPercentage)); |