Index: ps/trunk/binaries/data/mods/public/gui/prelobby/common/terms/terms.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/gui/prelobby/common/terms/terms.xml (revision 21886)
+++ ps/trunk/binaries/data/mods/public/gui/prelobby/common/terms/terms.xml (nonexistent)
@@ -1,21 +0,0 @@
-
-
Property changes on: ps/trunk/binaries/data/mods/public/gui/prelobby/common/terms/terms.xml
___________________________________________________________________
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Index: ps/trunk/binaries/data/config/default.cfg
===================================================================
--- ps/trunk/binaries/data/config/default.cfg (revision 21886)
+++ ps/trunk/binaries/data/config/default.cfg (revision 21887)
@@ -1,506 +1,508 @@
; Global Configuration Settings
;
; **************************************************************
; * DO NOT EDIT THIS FILE if you want personal customisations: *
; * create a text file called "local.cfg" instead, and copy *
; * the lines from this file that you want to change. *
; * *
; * If a setting is part of a section (for instance [hotkey]) *
; * you need to append the section name at the beginning of *
; * your custom line (for instance you need to write *
; * "hotkey.pause = Space" if you want to change the pausing *
; * hotkey to the spacebar). *
; * *
; * On Linux, create: *
; * $XDG_CONFIG_HOME/0ad/config/local.cfg *
; * (Note: $XDG_CONFIG_HOME defaults to ~/.config) *
; * *
; * On OS X, create: *
; * ~/Library/Application\ Support/0ad/config/local.cfg *
; * *
; * On Windows, create: *
; * %appdata%\0ad\config\local.cfg *
; * *
; **************************************************************
; Enable/disable windowed mode by default. (Use Alt+Enter to toggle in the game.)
windowed = false
; Show detailed tooltips (Unit stats)
showdetailedtooltips = false
; Pause the game on window focus loss (Only applicable to single player mode)
pauseonfocusloss = true
; Persist settings after leaving the game setup screen
persistmatchsettings = true
; Default player name to use in multiplayer
; playername = "anonymous"
; Default server name or IP to use in multiplayer
multiplayerserver = "127.0.0.1"
; Force a particular resolution. (If these are 0, the default is
; to keep the current desktop resolution in fullscreen mode or to
; use 1024x768 in windowed mode.)
xres = 0
yres = 0
; Force a non-standard bit depth (if 0 then use the current desktop bit depth)
bpp = 0
; Preferred display (for multidisplay setups, only works with SDL 2.0)
display = 0
; Emulate right-click with Ctrl+Click on Mac mice
macmouse = false
; System settings:
; if false, actors won't be rendered but anything entity will be.
renderactors = true
watereffects=true ; When disabled, force usage of the fixed pipeline water. This is faster, but really, really ugly.
waterfancyeffects = false
waterrealdepth = true
waterrefraction = true
waterreflection = true
shadowsonwater = false
shadows = true
shadowquality = 0 ; Shadow map resolution. (-2 - Very Low, -1 - Low, 0 - Medium, 1 - High, 2 - Very High)
; High values can crash the game when using a graphics card with low memory!
shadowpcf = true
vsync = false
particles = true
fog = true
silhouettes = true
showsky = true
nos3tc = false
noautomipmap = true
novbo = false
noframebufferobject = false
; Disable hardware cursors
nohwcursor = false
; Linux only: Set the driconf force_s3tc_enable option at startup,
; for compressed texture support
force_s3tc_enable = true
; Specify the render path. This can be one of:
; default Automatically select one of the below, depending on system capabilities
; fixed Only use OpenGL fixed function pipeline
; shader Use vertex/fragment shaders for transform and lighting where possible
; Using 'fixed' instead of 'default' may work around some graphics-related problems,
; but will reduce performance and features when a modern graphics card is available.
renderpath = default
;;;;; EXPERIMENTAL ;;;;;
; Prefer GLSL shaders over ARB shaders. Allows fancier graphical effects.
preferglsl = false
; Experimental probably-non-working GPU skinning support; requires preferglsl; use at own risk
gpuskinning = false
; Use smooth LOS interpolation
smoothlos = false
; Use screen-space postprocessing filters (HDR, bloom, DOF, etc). Incompatible with fixed renderpath.
postproc = false
; Quality level of shader effects (set to 10 to display all effects)
materialmgr.quality = 2.0
; Maximum distance to display parallax effect. Set to 0 to disable parallax.
materialmgr.PARALLAX_DIST.max = 150
; Maximum distance to display high quality parallax effect.
materialmgr.PARALLAX_HQ_DIST.max = 75
; Maximum distance to display very high quality parallax effect. Set to 30 to enable.
materialmgr.PARALLAX_VHQ_DIST.max = 0
;;;;;;;;;;;;;;;;;;;;;;;;
; Replace alpha-blending with alpha-testing, for performance experiments
forcealphatest = false
; Color of the sky (in "r g b" format)
skycolor = "0 0 0"
[adaptivefps]
session = 60 ; Throttle FPS in running games (prevents 100% CPU workload).
menu = 30 ; Throttle FPS in menus only.
[hotkey]
; Each one of the specified keys will trigger the action on the left
; for multiple-key combinations, separate keys with '+'.
; See keys.txt for the list of key names.
; > SYSTEM SETTINGS
exit = "Ctrl+Break", "Super+Q" ; Exit to desktop
cancel = Escape ; Close or cancel the current dialog box/popup
leave = Escape ; End current game or Exit
confirm = Return ; Confirm the current command
pause = Pause ; Pause/unpause game
screenshot = F2 ; Take PNG screenshot
bigscreenshot = "Shift+F2" ; Take large BMP screenshot
togglefullscreen = "Alt+Return" ; Toggle fullscreen/windowed mode
screenshot.watermark = "Alt+K" ; Toggle product/company watermark for official screenshots
wireframe = "Alt+Shift+W" ; Toggle wireframe mode
silhouettes = "Alt+Shift+S" ; Toggle unit silhouettes
showsky = "Alt+Z" ; Toggle sky
; > DIALOG HOTKEYS
summary = "Ctrl+Tab" ; Toggle in-game summary
lobby = "Alt+L" ; Show the multiplayer lobby in a dialog window.
structree = "Alt+Shift+T" ; Show structure tree
civinfo = "Alt+Shift+H" ; Show civilization info
; > CLIPBOARD CONTROLS
copy = "Ctrl+C" ; Copy to clipboard
paste = "Ctrl+V" ; Paste from clipboard
cut = "Ctrl+X" ; Cut selected text and copy to the clipboard
; > CONSOLE SETTINGS
console.toggle = BackQuote, F9 ; Open/close console
; > OVERLAY KEYS
fps.toggle = "Alt+F" ; Toggle frame counter
realtime.toggle = "Alt+T" ; Toggle current display of computer time
session.devcommands.toggle = "Alt+D" ; Toggle developer commands panel
timeelapsedcounter.toggle = "F12" ; Toggle time elapsed counter
session.showstatusbars = Tab ; Toggle display of status bars
session.highlightguarding = PgDn ; Toggle highlight of guarding units
session.highlightguarded = PgUp ; Toggle highlight of guarded units
session.toggleattackrange = "Alt+C" ; Toggle display of attack range overlays of selected defensive structures
session.toggleaurasrange = "Alt+V" ; Toggle display of aura range overlays of selected units and structures
session.togglehealrange = "Alt+B" ; Toggle display of heal range overlays of selected units
session.diplomacycolors = "Alt+X" ; Toggle diplomacy colors
; > HOTKEYS ONLY
chat = Return ; Toggle chat window
teamchat = "T" ; Toggle chat window in team chat mode
privatechat = "L" ; Toggle chat window and select the previous private chat partner
; > QUICKSAVE
quicksave = "Shift+F5"
quickload = "Shift+F8"
[hotkey.camera]
reset = "R" ; Reset camera rotation to default.
follow = "F" ; Follow the first unit in the selection
rallypointfocus = unused ; Focus the camera on the rally point of the selected building
zoom.in = Plus, Equals, NumPlus ; Zoom camera in (continuous control)
zoom.out = Minus, NumMinus ; Zoom camera out (continuous control)
zoom.wheel.in = WheelUp ; Zoom camera in (stepped control)
zoom.wheel.out = WheelDown ; Zoom camera out (stepped control)
rotate.up = "Ctrl+UpArrow", "Ctrl+W" ; Rotate camera to look upwards
rotate.down = "Ctrl+DownArrow", "Ctrl+S" ; Rotate camera to look downwards
rotate.cw = "Ctrl+LeftArrow", "Ctrl+A", Q ; Rotate camera clockwise around terrain
rotate.ccw = "Ctrl+RightArrow", "Ctrl+D", E ; Rotate camera anticlockwise around terrain
rotate.wheel.cw = "Shift+WheelUp", MouseX1 ; Rotate camera clockwise around terrain (stepped control)
rotate.wheel.ccw = "Shift+WheelDown", MouseX2 ; Rotate camera anticlockwise around terrain (stepped control)
pan = MouseMiddle ; Enable scrolling by moving mouse
left = A, LeftArrow ; Scroll or rotate left
right = D, RightArrow ; Scroll or rotate right
up = W, UpArrow ; Scroll or rotate up/forwards
down = S, DownArrow ; Scroll or rotate down/backwards
scroll.speed.increase = "Ctrl+Shift+S" ; Increase scroll speed
scroll.speed.decrease = "Ctrl+Alt+S" ; Decrease scroll speed
rotate.speed.increase = "Ctrl+Shift+R" ; Increase rotation speed
rotate.speed.decrease = "Ctrl+Alt+R" ; Decrease rotation speed
zoom.speed.increase = "Ctrl+Shift+Z" ; Increase zoom speed
zoom.speed.decrease = "Ctrl+Alt+Z" ; Decrease zoom speed
[hotkey.camera.jump]
1 = F5 ; Jump to position N
2 = F6
3 = F7
4 = F8
;5 =
;6 =
;7 =
;8 =
;9 =
;10 =
[hotkey.camera.jump.set]
1 = "Ctrl+F5" ; Set jump position N
2 = "Ctrl+F6"
3 = "Ctrl+F7"
4 = "Ctrl+F8"
;5 =
;6 =
;7 =
;8 =
;9 =
;10 =
[hotkey.profile]
toggle = "F11" ; Enable/disable real-time profiler
save = "Shift+F11" ; Save current profiler data to logs/profile.txt
[hotkey.profile2]
toggle = "Ctrl+F11" ; Enable/disable HTTP/GPU modes for new profiler
[hotkey.selection]
add = Shift ; Add units to selection
militaryonly = Alt ; Add only military units to the selection
nonmilitaryonly = "Alt+Y" ; Add only non-military units to the selection
idleonly = "I" ; Select only idle units
woundedonly = "O" ; Select only wounded units
remove = Ctrl ; Remove units from selection
cancel = Esc ; Un-select all units and cancel building placement
idleworker = Period ; Select next idle worker
idlewarrior = ForwardSlash ; Select next idle warrior
idleunit = BackSlash ; Select next idle unit
offscreen = Alt ; Include offscreen units in selection
[hotkey.selection.group.add]
0 = "Shift+0"
1 = "Shift+1"
2 = "Shift+2"
3 = "Shift+3"
4 = "Shift+4"
5 = "Shift+5"
6 = "Shift+6"
7 = "Shift+7"
8 = "Shift+8"
9 = "Shift+9"
[hotkey.selection.group.save]
0 = "Ctrl+0"
1 = "Ctrl+1"
2 = "Ctrl+2"
3 = "Ctrl+3"
4 = "Ctrl+4"
5 = "Ctrl+5"
6 = "Ctrl+6"
7 = "Ctrl+7"
8 = "Ctrl+8"
9 = "Ctrl+9"
[hotkey.selection.group.select]
0 = 0
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
[hotkey.session]
kill = Delete ; Destroy selected units
stop = "H" ; Stop the current action
backtowork = "Y" ; The unit will go back to work
unload = "U" ; Unload garrisoned units when a building/mechanical unit is selected
move = unused ; Modifier to move to a point instead of another action (e.g. gather)
attack = Ctrl ; Modifier to attack instead of another action (e.g. capture)
attackmove = Ctrl ; Modifier to attackmove when clicking on a point
attackmoveUnit = "Ctrl+Q" ; Modifier to attackmove targeting only units when clicking on a point (should contain the attackmove keys)
garrison = Ctrl ; Modifier to garrison when clicking on building
autorallypoint = Ctrl ; Modifier to set the rally point on the building itself
guard = "G" ; Modifier to escort/guard when clicking on unit/building
patrol = "P" ; Modifier to patrol a unit
repair = "J" ; Modifier to repair when clicking on building/mechanical unit
queue = Shift ; Modifier to queue unit orders instead of replacing
orderone = Alt ; Modifier to order only one entity in selection.
batchtrain = Shift ; Modifier to train units in batches
massbarter = Shift ; Modifier to barter bunch of resources
masstribute = Shift ; Modifier to tribute bunch of resources
noconfirmation = Shift ; Do not ask confirmation when deleting a building/unit
fulltradeswap = Shift ; Modifier to put the desired trade resource to 100%
unloadtype = Shift ; Modifier to unload all units of type
deselectgroup = Ctrl ; Modifier to deselect units when clicking group icon, instead of selecting
rotate.cw = RightBracket ; Rotate building placement preview clockwise
rotate.ccw = LeftBracket ; Rotate building placement preview anticlockwise
[hotkey.session.gui]
toggle = "Alt+G" ; Toggle visibility of session GUI
menu.toggle = "F10" ; Toggle in-game menu
barter.toggle = "Ctrl+B" ; Toggle in-game barter/trade page
tutorial.toggle = "Ctrl+P" ; Toggle in-game tutorial panel
[hotkey.session.savedgames]
delete = Delete ; Delete the selected saved game asking confirmation
noconfirmation = Shift ; Do not ask confirmation when deleting a game
[hotkey.session.queueunit] ; > UNIT TRAINING
1 = "Z" ; add first unit type to queue
2 = "X" ; add second unit type to queue
3 = "C" ; add third unit type to queue
4 = "V" ; add fourth unit type to queue
5 = "B" ; add fivth unit type to queue
6 = "N" ; add sixth unit type to queue
7 = "M" ; add seventh unit type to queue
8 = Comma ; add eighth unit type to queue
[hotkey.session.timewarp]
fastforward = Space ; If timewarp mode enabled, speed up the game
rewind = Backspace ; If timewarp mode enabled, go back to earlier point in the game
[hotkey.tab]
next = "Tab", "Alt+S" ; Show the next tab
prev = "Shift+Tab", "Alt+W" ; Show the previous tab
[hotkey.text] ; > GUI TEXTBOX HOTKEYS
delete.left = "Ctrl+Backspace" ; Delete word to the left of cursor
delete.right = "Ctrl+Del" ; Delete word to the right of cursor
move.left = "Ctrl+LeftArrow" ; Move cursor to start of word to the left of cursor
move.right = "Ctrl+RightArrow" ; Move cursor to start of word to the right of cursor
[gui]
cursorblinkrate = 0.5 ; Cursor blink rate in seconds (0.0 to disable blinking)
scale = 1.0 ; GUI scaling factor, for improved compatibility with 4K displays
[gui.gamesetup]
enabletips = true ; Enable/Disable tips during gamesetup (for newcomers)
assignplayers = everyone ; Whether to assign joining clients to free playerslots. Possible values: everyone, buddies, disabled.
aidifficulty = 3 ; Difficulty level, from 0 (easiest) to 5 (hardest)
aibehavior = "random" ; Default behavior of the AI (random, balanced, aggressive or defensive)
settingsslide = true ; Enable/Disable settings panel slide
[gui.session]
camerajump.threshold = 40 ; How close do we have to be to the actual location in order to jump back to the previous one?
timeelapsedcounter = false ; Show the game duration in the top right corner
ceasefirecounter = false ; Show the remaining ceasefire time in the top right corner
batchtrainingsize = 5 ; Number of units to be trained per batch by default (when pressing the hotkey)
scrollbatchratio = 1 ; Number of times you have to scroll to increase/decrease the batchsize by 1
woundedunithotkeythreshold = 33 ; The wounded unit hotkey considers the selected units as wounded if their health percentage falls below this number
attackrange = true ; Display attack range overlays of selected defensive structures
aurasrange = true ; Display aura range overlays of selected units and structures
healrange = true ; Display heal range overlays of selected units
rankabovestatusbar = true ; Show rank icons above status bars
respoptooltipsort = 0 ; Sorting players in the resources and population tooltip by value (0 - no sort, -1 - ascending, 1 - descending)
[gui.session.minimap]
blinkduration = 1.7 ; The blink duration while pinging
pingduration = 50.0 ; The duration for which an entity will be pinged after an attack notification
[gui.session.notifications]
attack = true ; Show a chat notification if you are attacked by another player
tribute = true ; Show a chat notification if an ally tributes resources to another team member if teams are locked, and all tributes in observer mode
barter = true ; Show a chat notification to observers when a player bartered resources
phase = completed ; Show a chat notification if you or an ally have started, aborted or completed a new phase, and phases of all players in observer mode. Possible values: none, completed, all.
[gui.splashscreen]
enable = true ; Enable/disable the splashscreen
version = 0 ; Splashscreen version (date of last modification). By default, 0 to force splashscreen to appear at first launch
[gui.session.diplomacycolors]
self = "21 55 149" ; Color of your units when diplomacy colors are enabled
ally = "86 180 31" ; Color of allies when diplomacy colors are enabled
neutral = "231 200 5" ; Color of neutral players when diplomacy colors are enabled
enemy = "150 20 20" ; Color of enemies when diplomacy colors are enabled
[joystick] ; EXPERIMENTAL: joystick/gamepad settings
enable = false
deadzone = 8192
[joystick.camera]
pan.x = 0
pan.y = 1
rotate.x = 3
rotate.y = 2
zoom.in = 5
zoom.out = 4
[chat]
timestamp = true ; Show at which time chat messages have been sent
[chat.session]
extended = true ; Whether to display the chat history
[lobby]
history = 0 ; Number of past messages to display on join
room = "arena23" ; Default MUC room to join
server = "lobby.wildfiregames.com" ; Address of lobby server
require_tls = true ; Whether to reject connecting to the lobby if TLS encryption is unavailable.
verify_certificate = false ; Whether to reject connecting to the lobby if the TLS certificate is invalid (TODO get a valid certificate)
terms_of_service = "0" ; Version (hash) of the Terms of Service that the user has accepted
terms_of_use = "0" ; Version (hash) of the Terms of Use that the user has accepted
xpartamupp = "wfgbot23" ; Name of the server-side XMPP-account that manage games
echelon = "echelon23" ; Name of the server-side XMPP-account that manages ratings
buddies = "," ; Comma separated list of playernames that the current user has marked as buddies
rememberpassword = true ; Whether to store the encrypted password in the user config
[lobby.columns]
gamerating = false ; Show the average rating of the participating players in a column of the gamelist
[lobby.stun]
enabled = true ; The STUN protocol allows hosting games without configuring the firewall and router.
; If STUN is disabled, the game relies on direct connection, UPnP and port forwarding.
server = "lobby.wildfiregames.com" ; Address of the STUN server.
port = 3478 ; Port of the STUN server.
delay = 200 ; Duration in milliseconds that is waited between STUN messages.
; Smaller numbers speed up joins but also become less stable.
[mod]
enabledmods = "mod public"
[modio]
public_key = "RWQBhIRg+dOifTWlwgYHe8RfD8bqoDh1cCvygboAl3GOUKiCo0NlF4fw" ; Public key corresponding to the private key valid mods are signed with
+disclaimer = "0" ; Version (hash) of the Disclaimer that the user has accepted
[modio.v1]
baseurl = "https://api.mod.io/v1"
api_key = "23df258a71711ea6e4b50893acc1ba55"
name_id = "0ad"
[network]
duplicateplayernames = false ; Rename joining player to "User (2)" if "User" is already connected, otherwise prohibit join.
lateobservers = everyone ; Allow observers to join the game after it started. Possible values: everyone, buddies, disabled.
observerlimit = 8 ; Prevent further observer joins in running games if this limit is reached
gamestarttimeout = 60000 ; Don't disconnect clients timing out in the loading screen and rejoin process before exceeding this timeout.
[overlay]
fps = "false" ; Show frames per second in top right corner
realtime = "false" ; Show current system time in top right corner
netwarnings = "true" ; Show warnings if the network connection is bad
[profiler2]
autoenable = false ; Enable HTTP server output at startup (default off for security/performance)
gpu.arb.enable = true ; Allow GL_ARB_timer_query timing mode when available
gpu.ext.enable = true ; Allow GL_EXT_timer_query timing mode when available
gpu.intel.enable = true ; Allow GL_INTEL_performance_queries timing mode when available
[sound]
mastergain = 0.9
musicgain = 0.2
ambientgain = 0.6
actiongain = 0.7
uigain = 0.7
[sound.notify]
nick = true ; Play a sound when someone mentions your name in the lobby or game
[tinygettext]
debug = false ; Print error messages each time a translation for an English string is not found.
[userreport] ; Opt-in online user reporting system
url = "http://feedback.wildfiregames.com/report/upload/v1/"
+terms = "0" ; Version (hash) of the UserReporter Terms that the user has accepted
[view] ; Camera control settings
scroll.speed = 120.0
scroll.speed.modifier = 1.05 ; Multiplier for changing scroll speed
rotate.x.speed = 1.2
rotate.x.min = 28.0
rotate.x.max = 60.0
rotate.x.default = 35.0
rotate.y.speed = 2.0
rotate.y.speed.wheel = 0.45
rotate.y.default = 0.0
rotate.speed.modifier = 1.05 ; Multiplier for changing rotation speed
drag.speed = 0.5
zoom.speed = 256.0
zoom.speed.wheel = 32.0
zoom.min = 50.0
zoom.max = 200.0
zoom.default = 120.0
zoom.speed.modifier = 1.05 ; Multiplier for changing zoom speed
pos.smoothness = 0.1
zoom.smoothness = 0.4
rotate.x.smoothness = 0.5
rotate.y.smoothness = 0.3
near = 2.0 ; Near plane distance
far = 4096.0 ; Far plane distance
fov = 45.0 ; Field of view (degrees), lower is narrow, higher is wide
height.smoothness = 0.5
height.min = 16
Index: ps/trunk/binaries/data/mods/mod/gui/common/terms.js
===================================================================
--- ps/trunk/binaries/data/mods/mod/gui/common/terms.js (nonexistent)
+++ ps/trunk/binaries/data/mods/mod/gui/common/terms.js (revision 21887)
@@ -0,0 +1,51 @@
+var g_Terms = {};
+
+function initTerms(terms)
+{
+ g_Terms = terms;
+}
+
+function openTerms(page)
+{
+ Engine.PushGuiPage("page_termsdialog.xml", {
+ "file": g_Terms[page].file,
+ "title": g_Terms[page].title,
+ "buttons": g_Terms[page].buttons || [],
+ "page": page,
+ "callback": "acceptTerms"
+ });
+}
+
+function acceptTerms(data)
+{
+ g_Terms[data.page].accepted = data.accepted;
+
+ let value = data.accepted ? getTermsHash(data.page) : "0";
+ Engine.ConfigDB_CreateValue("user", g_Terms[data.page].config, value);
+ Engine.ConfigDB_WriteValueToFile("user", g_Terms[data.page].config, value, "config/user.cfg");
+
+ if (g_Terms[data.page].callback)
+ g_Terms[data.page].callback(data);
+}
+
+function checkTerms()
+{
+ for (let page in g_Terms)
+ if (!g_Terms[page].accepted)
+ return g_Terms[page].instruction || page;
+
+ return "";
+}
+
+function getTermsHash(page)
+{
+ return Engine.CalculateMD5(
+ (g_Terms[page].salt ? g_Terms[page].salt() : "") +
+ (Engine.FileExists(g_Terms[page].file) ? Engine.ReadFile(g_Terms[page].file) : g_Terms[page].file));
+}
+
+function loadTermsAcceptance()
+{
+ for (let page in g_Terms)
+ g_Terms[page].accepted = Engine.ConfigDB_GetValue("user", g_Terms[page].config) == getTermsHash(page);
+}
Property changes on: ps/trunk/binaries/data/mods/mod/gui/common/terms.js
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.js
===================================================================
--- ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.js (revision 21886)
+++ ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.js (revision 21887)
@@ -1,415 +1,399 @@
/**
* @file This GUI page displays all available mods and allows the player to enabled and launch a set of compatible mods.
*/
/**
* A mod is defined by a mod.json file, for example
* {
* "name": "0ad",
* "version": "0.0.23",
* "label": "0 A.D. - Empires Ascendant",
* "url": "https://wildfiregames.com/",
* "description": "A free, open-source, historical RTS game.",
* "dependencies": []
* }
*
* Or:
* {
* "name": "mod2",
* "label": "Mod 2",
* "version": "1.1",
* "description": "",
* "dependencies": ["0ad<=0.0.23", "rote"]
* }
*
* A mod is identified by the directory name.
* A mod must define the "name", "version", "label", "description" and "dependencies" property.
* The "url" property is optional.
*
* The property "name" can consist alphanumeric characters, underscore and dash.
* The name is used for version comparison of mod dependencies.
* The property "version" may only contain numbers and up to two periods.
* The property "label" is a human-readable name of the mod.
* The property "description" is a human-readable summary of the features of the mod.
* The property "url" is reference to a website about the mod.
* The property "dependencies" is an array of strings. Each string is either a modname or a mod version comparison.
* A mod version comparison is a modname, followed by an operator (=, <, >, <= or >=), followed by a mod version.
* This allows mods to express upwards and downwards compatibility.
*/
/**
* Mod definitions loaded from the files, including invalid mods.
*/
var g_Mods = {};
/**
* Folder names of all mods that are or can be launched.
*/
var g_ModsEnabled = [];
var g_ModsDisabled = [];
/**
* Name of the mods installed by the ModInstaller.
*/
var g_InstalledMods;
var g_ColorNoModSelected = "255 255 100";
var g_ColorDependenciesMet = "100 255 100";
var g_ColorDependenciesNotMet = "255 100 100";
function init(data, hotloadData)
{
g_InstalledMods = data && data.installedMods || hotloadData && hotloadData.installedMods || [];
+
initMods();
initGUIButtons(data);
}
function initMods()
{
loadMods();
loadEnabledMods();
validateMods();
initGUIFilters();
}
function getHotloadData()
{
return { "installedMods": g_InstalledMods };
}
function loadMods()
{
g_Mods = Engine.GetAvailableMods();
deepfreeze(g_Mods);
}
function loadEnabledMods()
{
g_ModsEnabled = Engine.ConfigDB_GetValue("user", "mod.enabledmods").split(/\s+/).filter(folder => !!g_Mods[folder]);
g_ModsDisabled = Object.keys(g_Mods).filter(folder => g_ModsEnabled.indexOf(folder) == -1);
}
function validateMods()
{
for (let folder in g_Mods)
validateMod(folder, g_Mods[folder], true);
}
function initGUIFilters()
{
Engine.GetGUIObjectByName("negateFilter").checked = false;
Engine.GetGUIObjectByName("modGenericFilter").caption = translate("Filter");
displayModLists();
}
function initGUIButtons(data)
{
// Either get back to the previous page or quit if there is no previous page
let cancelButton = !data || data.cancelbutton;
Engine.GetGUIObjectByName("cancelButton").hidden = !cancelButton;
Engine.GetGUIObjectByName("quitButton").hidden = cancelButton;
}
function saveMods()
{
sortEnabledMods();
Engine.ConfigDB_CreateValue("user", "mod.enabledmods", ["mod"].concat(g_ModsEnabled).join(" "));
Engine.ConfigDB_WriteFile("user", "config/user.cfg");
}
function startMods()
{
sortEnabledMods();
Engine.SetMods(["mod"].concat(g_ModsEnabled));
Engine.RestartEngine();
}
function displayModLists()
{
displayModList("modsEnabledList", g_ModsEnabled);
displayModList("modsDisabledList", g_ModsDisabled);
}
function displayModList(listObjectName, folders)
{
let listObject = Engine.GetGUIObjectByName(listObjectName);
if (listObjectName == "modsDisabledList")
{
let sortFolder = folder => String(g_Mods[folder][listObject.selected_column] || folder);
folders.sort((folder1, folder2) =>
listObject.selected_column_order *
sortFolder(folder1).localeCompare(sortFolder(folder2)));
}
folders = folders.filter(filterMod);
listObject.list_name = folders.map(folder => g_Mods[folder].name).map(name => g_InstalledMods.indexOf(name) == -1 ? name : coloredText(name, "green"));
listObject.list_folder = folders;
listObject.list_label = folders.map(folder => g_Mods[folder].label);
listObject.list_url = folders.map(folder => g_Mods[folder].url || "");
listObject.list_version = folders.map(folder => g_Mods[folder].version);
listObject.list_dependencies = folders.map(folder => g_Mods[folder].dependencies.join(" "));
listObject.list = folders;
}
function enableMod()
{
let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList");
let pos = modsDisabledList.selected;
if (pos == -1 || !areDependenciesMet(g_ModsDisabled[pos]))
return;
g_ModsEnabled.push(g_ModsDisabled.splice(pos, 1)[0]);
if (pos >= g_ModsDisabled.length)
--pos;
modsDisabledList.selected = pos;
displayModLists();
}
function disableMod()
{
let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList");
let pos = modsEnabledList.selected;
if (pos == -1)
return;
g_ModsDisabled.push(g_ModsEnabled.splice(pos, 1)[0]);
// Remove mods that required the removed mod and cascade
// Sort them, so we know which ones can depend on the removed mod
// TODO: Find position where the removed mod would have fit (for now assume idx 0)
sortEnabledMods();
for (let i = 0; i < g_ModsEnabled.length; ++i)
if (!areDependenciesMet(g_ModsEnabled[i]))
{
g_ModsDisabled.push(g_ModsEnabled.splice(i, 1)[0]);
--i;
}
modsEnabledList.selected = Math.min(pos, g_ModsEnabled.length - 1);
displayModLists();
}
function applyFilters()
{
// Save selected rows
let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList");
let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList");
let selectedDisabledFolder = modsDisabledList.list_folder[modsDisabledList.selected];
let selectedEnabledFolder = modsEnabledList.list_folder[modsEnabledList.selected];
// Remove selected rows to prevent a link to a non existing item
modsDisabledList.selected = -1;
modsEnabledList.selected = -1;
displayModLists();
// Restore previously selected rows
modsDisabledList.selected = modsDisabledList.list_folder.indexOf(selectedDisabledFolder);
modsEnabledList.selected = modsEnabledList.list_folder.indexOf(selectedEnabledFolder);
Engine.GetGUIObjectByName("globalModDescription").caption = "";
}
function filterMod(folder)
{
let mod = g_Mods[folder];
let negateFilter = Engine.GetGUIObjectByName("negateFilter").checked;
let searchText = Engine.GetGUIObjectByName("modGenericFilter").caption;
if (searchText &&
searchText != translate("Filter") &&
folder.indexOf(searchText) == -1 &&
mod.name.indexOf(searchText) == -1 &&
mod.label.indexOf(searchText) == -1 &&
(mod.url || "").indexOf(searchText) == -1 &&
mod.version.indexOf(searchText) == -1 &&
mod.description.indexOf(searchText) == -1 &&
mod.dependencies.indexOf(searchText) == -1)
return negateFilter;
return !negateFilter;
}
function closePage()
{
Engine.SwitchGuiPage("page_pregame.xml", {});
}
/**
* Moves an item in the list up or down.
*/
function moveCurrItem(objectName, up)
{
let obj = Engine.GetGUIObjectByName(objectName);
let idx = obj.selected;
if (idx == -1)
return;
let num = obj.list.length;
let idx2 = idx + (up ? -1 : 1);
if (idx2 < 0 || idx2 >= num)
return;
let tmp = g_ModsEnabled[idx];
g_ModsEnabled[idx] = g_ModsEnabled[idx2];
g_ModsEnabled[idx2] = tmp;
obj.list = g_ModsEnabled;
obj.selected = idx2;
displayModList("modsEnabledList", g_ModsEnabled);
}
function areDependenciesMet(folder)
{
let guiObject = Engine.GetGUIObjectByName("message");
for (let dependency of g_Mods[folder].dependencies)
{
if (isDependencyMet(dependency))
continue;
guiObject.caption = coloredText(
sprintf(translate('Dependency not met: %(dep)s'), { "dep": dependency }),
g_ColorDependenciesNotMet);
return false;
}
guiObject.caption = coloredText(translate('All dependencies met'), g_ColorDependenciesMet);
return true;
}
/**
* @param dependency is a mod name or a mod version comparison.
*/
function isDependencyMet(dependency)
{
let operator = dependency.match(g_RegExpComparisonOperator);
let [name, version] = operator ? dependency.split(operator[0]) : [dependency, undefined];
return g_ModsEnabled.some(folder =>
g_Mods[folder].name == name &&
(!operator || versionSatisfied(g_Mods[folder].version, operator[0], version)));
}
-function modIo()
-{
- messageBox(500, 250,
- translate("You are about to connect to the mod.io online service. This provides easy access to community-made mods, but is not under the control of Wildfire Games.\n\nWhile we have taken care to make this secure, we cannot guarantee with absolute certainty that this is not a security risk.\n\nDo you really want to connect?"),
- translate("Connect to mod.io?"),
- [translate("Cancel"), translateWithContext("mod.io connection message box", "Connect")],
- [
- null,
- () => {
- Engine.PushGuiPage("page_modio.xml", {
- "callback": "initMods"
- });
- }
- ]
- );
-}
-
/**
* Compares the given versions using the given operator.
* '-' or '_' is ignored. Only numbers are supported.
* @note "5.3" < "5.3.0"
*/
function versionSatisfied(version1, operator, version2)
{
let versionList1 = version1.split(/[-_]/)[0].split(/\./g);
let versionList2 = version2.split(/[-_]/)[0].split(/\./g);
let eq = operator.indexOf("=") != -1;
let lt = operator.indexOf("<") != -1;
let gt = operator.indexOf(">") != -1;
for (let i = 0; i < Math.min(versionList1.length, versionList2.length); ++i)
{
let diff = +versionList1[i] - +versionList2[i];
if (gt && diff > 0 || lt && diff < 0)
return true;
if (gt && diff < 0 || lt && diff > 0 || eq && diff)
return false;
}
// common prefix matches
let ldiff = versionList1.length - versionList2.length;
if (!ldiff)
return eq;
// NB: 2.3 != 2.3.0
if (ldiff < 0)
return lt;
return gt;
}
function sortEnabledMods()
{
let dependencies = {};
for (let folder of g_ModsEnabled)
dependencies[folder] = g_Mods[folder].dependencies.map(d => d.split(g_RegExpComparisonOperator)[0]);
g_ModsEnabled.sort((folder1, folder2) =>
dependencies[folder1].indexOf(g_Mods[folder2].name) != -1 ? 1 :
dependencies[folder2].indexOf(g_Mods[folder1].name) != -1 ? -1 : 0);
displayModList("modsEnabledList", g_ModsEnabled);
}
function selectedMod(listObjectName)
{
let listObject = Engine.GetGUIObjectByName(listObjectName);
let otherListObject = Engine.GetGUIObjectByName(listObjectName == "modsDisabledList" ?
"modsEnabledList" : "modsDisabledList");
if (listObject.selected != -1)
{
otherListObject.selected = -1;
Engine.GetGUIObjectByName("visitWebButton").enabled = true;
let toggleModButton = Engine.GetGUIObjectByName("toggleModButton");
toggleModButton.caption = listObjectName == "modsDisabledList" ? "Enable" : "Disable";
toggleModButton.enabled = true;
toggleModButton.onPress = listObjectName == "modsDisabledList" ? enableMod : disableMod;
Engine.GetGUIObjectByName("enabledModUp").enabled = listObjectName == "modsEnabledList";
Engine.GetGUIObjectByName("enabledModDown").enabled = listObjectName == "modsEnabledList";
}
Engine.GetGUIObjectByName("globalModDescription").caption =
listObject.list[listObject.selected] ?
g_Mods[listObject.list[listObject.selected]].description :
'[color="' + g_ColorNoModSelected + '"]' + translate("No mod has been selected.") + '[/color]';
}
function visitModWebsite()
{
let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList");
let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList");
let list = modsEnabledList.selected == -1 ? modsDisabledList : modsEnabledList;
let folder = list.list_folder[list.selected];
let url = folder && g_Mods[folder] && g_Mods[folder].url;
if (!url)
return;
if (!url.startsWith("http://") && !url.startsWith("https://"))
url = "http://" + url;
Engine.OpenURL(url);
}
Index: ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.xml
===================================================================
--- ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.xml (revision 21886)
+++ ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.xml (revision 21887)
@@ -1,208 +1,208 @@
ModificationsapplyFilters();applyFilters();applyFilters();NegateDescriptionAvailable ModsselectedMod(this.name);applyFilters();enableMod();NameVersion(Folder)Mod LabelDependenciesWebsiteEnabled ModsselectedMod(this.name);disableMod();NameVersion(Folder)Mod LabelDependenciesWebsiteChange the order in which mods are launched. This should match the mods dependencies.moveCurrItem("modsEnabledList", true);Change the order in which mods are launched. This should match the mods dependencies.moveCurrItem("modsEnabledList", false);Enable/DisableVisit WebsitevisitModWebsite();QuitEngine.Exit();CancelclosePage();HelpEngine.PushGuiPage("page_modhelp.xml");Download Mods
- modIo();
+ downloadModsButton();Save ConfigurationsaveMods();Start ModsstartMods();
Index: ps/trunk/binaries/data/mods/mod/gui/modmod/modmodio.js
===================================================================
--- ps/trunk/binaries/data/mods/mod/gui/modmod/modmodio.js (nonexistent)
+++ ps/trunk/binaries/data/mods/mod/gui/modmod/modmodio.js (revision 21887)
@@ -0,0 +1,22 @@
+function downloadModsButton()
+{
+ initTerms({
+ "Disclaimer": {
+ "title": translate("Download Mods"),
+ "file": translate("You are about to connect to the mod.io online service. This provides easy access to community-made mods, but is not under the control of Wildfire Games.\n\nWhile we have taken care to make this secure, we cannot guarantee with absolute certainty that this is not a security risk.\n\nDo you really want to connect?"),
+ "config": "modio.disclaimer",
+ "accepted": false,
+ "callback": openModIo
+ }
+ });
+
+ openTerms("Disclaimer");
+}
+
+function openModIo(data)
+{
+ if (data.accepted)
+ Engine.PushGuiPage("page_modio.xml", {
+ "callback": "initMods"
+ });
+}
Property changes on: ps/trunk/binaries/data/mods/mod/gui/modmod/modmodio.js
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: ps/trunk/binaries/data/mods/mod/gui/page_termsdialog.xml
===================================================================
--- ps/trunk/binaries/data/mods/mod/gui/page_termsdialog.xml (nonexistent)
+++ ps/trunk/binaries/data/mods/mod/gui/page_termsdialog.xml (revision 21887)
@@ -0,0 +1,8 @@
+
+
+ common/modern/setup.xml
+ common/modern/styles.xml
+ common/modern/sprites.xml
+
+ termsdialog/termsdialog.xml
+
Property changes on: ps/trunk/binaries/data/mods/mod/gui/page_termsdialog.xml
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: ps/trunk/binaries/data/mods/mod/gui/termsdialog/termsdialog.js
===================================================================
--- ps/trunk/binaries/data/mods/mod/gui/termsdialog/termsdialog.js (nonexistent)
+++ ps/trunk/binaries/data/mods/mod/gui/termsdialog/termsdialog.js (revision 21887)
@@ -0,0 +1,21 @@
+var g_TermsPage = "";
+
+function init(data)
+{
+ g_TermsPage = data.page;
+
+ Engine.GetGUIObjectByName("title").caption = data.title;
+
+ Engine.GetGUIObjectByName("mainText").caption =
+ Engine.FileExists(data.file) ?
+ Engine.TranslateLines(Engine.ReadFile(data.file)) :
+ data.file;
+}
+
+function closeTerms(accepted)
+{
+ Engine.PopGuiPageCB({
+ "page": g_TermsPage,
+ "accepted": accepted
+ });
+}
Property changes on: ps/trunk/binaries/data/mods/mod/gui/termsdialog/termsdialog.js
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: ps/trunk/binaries/data/mods/mod/gui/termsdialog/termsdialog.xml
===================================================================
--- ps/trunk/binaries/data/mods/mod/gui/termsdialog/termsdialog.xml (nonexistent)
+++ ps/trunk/binaries/data/mods/mod/gui/termsdialog/termsdialog.xml (revision 21887)
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cancel
+ closeTerms(false);
+
+
+
+ Connect
+ closeTerms(true);
+
+
+
+
+
+
Property changes on: ps/trunk/binaries/data/mods/mod/gui/termsdialog/termsdialog.xml
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: ps/trunk/binaries/data/mods/public/gui/pregame/userreport/userreport.js
===================================================================
--- ps/trunk/binaries/data/mods/public/gui/pregame/userreport/userreport.js (revision 21886)
+++ ps/trunk/binaries/data/mods/public/gui/pregame/userreport/userreport.js (revision 21887)
@@ -1,59 +1,76 @@
+var g_TermsUserReport = {
+ "TermsAndConditions": {
+ "title": translate("Technical Details"),
+ "instruction": "",
+ "file": "gui/manual/userreport.txt",
+ "config": "userreport.terms",
+ "callback": data => {
+ setUserReportEnabled(data.accepted);
+ },
+ "accepted": false
+ }
+};
+
var g_UserReportStatusFormat = {
"disabled": data => translate("disabled"),
"proxy": data => translate("connecting to server"),
"waiting": data => translate("connecting to server"),
"connecting": data => translate("connecting to server"),
"sending": data => sprintf(translate("uploading (%f%%)"), Math.floor(100 * data[1])),
"completed": data =>
data[1] == 200 ?
translate("upload succeeded") :
sprintf(translate("upload failed (%(errorCode)s)"), {
"errorCode": data[1]
}),
"failed": data => sprintf(translate("upload failed (%(errorMessage)s)"), {
"errorMessage": uneval(data[2])
})
};
function initUserReport()
{
- setUserReportEnabled(Engine.IsUserReportEnabled());
+ initTerms(g_TermsUserReport);
+ loadTermsAcceptance();
+
+ setUserReportEnabled(!checkTerms() && Engine.IsUserReportEnabled());
}
function setUserReportEnabled(enabled)
{
Engine.SetUserReportEnabled(enabled);
updateUserReportButtons();
}
function updateUserReportButtons()
{
+ let termsFeedback = checkTerms();
+
let userReportEnableButton = Engine.GetGUIObjectByName("userReportEnableButton");
userReportEnableButton.caption = Engine.IsUserReportEnabled() ? translate("Disable Feedback") : translate("Enable Feedback");
+ userReportEnableButton.enabled = !termsFeedback;
+ userReportEnableButton.tooltip = termsFeedback;
userReportEnableButton.onPress = () => {
setUserReportEnabled(!Engine.IsUserReportEnabled());
};
let userReportTermsButton = Engine.GetGUIObjectByName("userReportTermsButton");
userReportTermsButton.onPress = () => {
- Engine.PushGuiPage("page_manual.xml", {
- "page": "manual/userreport",
- "title": translate("Technical Details")
- });
+ openTerms("TermsAndConditions");
};
}
function updateUserReportStatus()
{
let statusData = Engine.GetUserReportStatus().split(/:/, 3);
Engine.GetGUIObjectByName("userReportText").caption =
Engine.IsUserReportEnabled() ?
setStringTags(translate("Thank you for helping improve 0 A.D.!"), { "font": "sans-bold-16" }) + "\n\n" +
translate("Anonymous feedback is currently enabled.") + "\n" +
sprintf(translate("Status: %(status)s."), {
"status": g_UserReportStatusFormat[statusData[0]] ? g_UserReportStatusFormat[statusData[0]](statusData) : translate("unknown")
}) :
setStringTags(translate("Help improve 0 A.D.!"), { "font": "sans-bold-16" }) + "\n\n" +
translate("You can automatically send us anonymous feedback that will help us fix bugs, and improve performance and compatibility.");
}
Index: ps/trunk/binaries/data/mods/public/gui/prelobby/common/feedback/feedback.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/gui/prelobby/common/feedback/feedback.xml (revision 21886)
+++ ps/trunk/binaries/data/mods/public/gui/prelobby/common/feedback/feedback.xml (revision 21887)
@@ -1,15 +1,18 @@
onTick();
-
- Cancel
- cancelButton();
-
+
+
+
+ Cancel
+ cancelButton();
+
-
- continueButton();
+
+ continueButton();
+
Index: ps/trunk/binaries/data/mods/public/gui/prelobby/common/terms/termslobby.js
===================================================================
--- ps/trunk/binaries/data/mods/public/gui/prelobby/common/terms/termslobby.js (nonexistent)
+++ ps/trunk/binaries/data/mods/public/gui/prelobby/common/terms/termslobby.js (revision 21887)
@@ -0,0 +1,44 @@
+var g_TermsButtonHeight = 40;
+
+function initLobbyTerms()
+{
+ let terms = {
+ "Service": {
+ "title": translate("Terms of Service"),
+ "instruction": translate("Please read the Terms of Service"),
+ "file": "gui/prelobby/common/terms/Terms_of_Service.txt",
+ "config": "lobby.terms_of_service",
+ "salt": () => Engine.GetGUIObjectByName("username").caption,
+ "accepted": false,
+ "callback": updateFeedback
+ },
+ "Use": {
+ "title": translate("Terms of Use"),
+ "instruction": translate("Please read the Terms of Use"),
+ "file": "gui/prelobby/common/terms/Terms_of_Use.txt",
+ "config": "lobby.terms_of_use",
+ "salt": () => Engine.GetGUIObjectByName("username").caption,
+ "accepted": false,
+ "callback": updateFeedback
+ }
+ };
+
+ Object.keys(terms).forEach((page, i) => {
+
+ let button = Engine.GetGUIObjectByName("termsButton[" + i + "]");
+
+ button.caption = terms[page].title;
+
+ button.onPress = () => {
+ openTerms(page);
+ };
+
+ let size = button.size;
+ size.top = i * g_TermsButtonHeight;
+ size.bottom = i * g_TermsButtonHeight + 28;
+ button.size = size;
+ });
+
+ initTerms(terms);
+ loadTermsAcceptance();
+}
Property changes on: ps/trunk/binaries/data/mods/public/gui/prelobby/common/terms/termslobby.js
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: ps/trunk/binaries/data/mods/public/gui/prelobby/common/terms/termslobby.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/gui/prelobby/common/terms/termslobby.xml (nonexistent)
+++ ps/trunk/binaries/data/mods/public/gui/prelobby/common/terms/termslobby.xml (revision 21887)
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
Property changes on: ps/trunk/binaries/data/mods/public/gui/prelobby/common/terms/termslobby.xml
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: ps/trunk/binaries/data/mods/public/gui/prelobby/login/login.js
===================================================================
--- ps/trunk/binaries/data/mods/public/gui/prelobby/login/login.js (revision 21886)
+++ ps/trunk/binaries/data/mods/public/gui/prelobby/login/login.js (revision 21887)
@@ -1,51 +1,51 @@
function init()
{
g_LobbyMessages.connected = onLogin;
Engine.GetGUIObjectByName("continue").caption = translate("Connect");
// Shorten the displayed password for visual reasons only
Engine.GetGUIObjectByName("username").caption = Engine.ConfigDB_GetValue("user", "lobby.login");
Engine.GetGUIObjectByName("password").caption = Engine.ConfigDB_GetValue("user", "lobby.password").substr(0, 10);
- loadTermsAcceptance();
+ initLobbyTerms();
+
initRememberPassword();
updateFeedback();
}
function updateFeedback()
{
setFeedback(checkUsername(false) || checkPassword(false) || checkTerms());
}
// Remember which user agreed to the terms
function onUsernameEdit()
{
loadTermsAcceptance();
updateFeedback();
}
function continueButton()
{
setFeedback(translate("Connecting…"));
Engine.StartXmppClient(
Engine.GetGUIObjectByName("username").caption,
getEncryptedPassword(),
Engine.ConfigDB_GetValue("user", "lobby.room"),
Engine.GetGUIObjectByName("username").caption,
+Engine.ConfigDB_GetValue("user", "lobby.history"));
Engine.ConnectXmppClient();
}
function onLogin(message)
{
saveCredentials();
- saveTermsAcceptance();
Engine.SwitchGuiPage("page_lobby.xml", {
"dialog": false
});
}
Index: ps/trunk/binaries/data/mods/public/gui/prelobby/login/login.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/gui/prelobby/login/login.xml (revision 21886)
+++ ps/trunk/binaries/data/mods/public/gui/prelobby/login/login.xml (revision 21887)
@@ -1,34 +1,34 @@
-
+ Connect to the game lobby
-
-
+
+
-
+
Index: ps/trunk/binaries/data/mods/public/gui/prelobby/register/register.js
===================================================================
--- ps/trunk/binaries/data/mods/public/gui/prelobby/register/register.js (revision 21886)
+++ ps/trunk/binaries/data/mods/public/gui/prelobby/register/register.js (revision 21887)
@@ -1,44 +1,45 @@
function init()
{
g_LobbyMessages.registered = onRegistered;
Engine.GetGUIObjectByName("continue").caption = translate("Register");
+ initLobbyTerms();
+
initRememberPassword();
updateFeedback();
}
function updateFeedback()
{
setFeedback(checkUsername(true) || checkPassword(true) || checkPasswordConfirmation() || checkTerms());
}
function onUsernameEdit()
{
updateFeedback();
}
function continueButton()
{
setFeedback(translate("Registering…"));
Engine.StartRegisterXmppClient(
Engine.GetGUIObjectByName("username").caption,
getEncryptedPassword());
Engine.ConnectXmppClient();
}
function onRegistered()
{
saveCredentials();
- saveTermsAcceptance();
setFeedback(translate("Registered"));
Engine.StopXmppClient();
Engine.PopGuiPage();
Engine.PushGuiPage("page_prelobby_login.xml");
}
Index: ps/trunk/binaries/data/mods/public/gui/prelobby/register/register.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/gui/prelobby/register/register.xml (revision 21886)
+++ ps/trunk/binaries/data/mods/public/gui/prelobby/register/register.xml (revision 21887)
@@ -1,38 +1,38 @@
-
+ Registration
-
-
+
+
-
+