Skip to content

Commit

Permalink
civ select screen from battalion mod
Browse files Browse the repository at this point in the history
  • Loading branch information
JustusAvramenko committed Feb 3, 2019
1 parent 156cf7f commit bd1e73b
Show file tree
Hide file tree
Showing 14 changed files with 3,401 additions and 2 deletions.
208 changes: 208 additions & 0 deletions gui/civsel/civsel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
/**
* Is this user in control of game settings (i.e. is a network server, or offline player).
*/

const g_IsController = !Engine.HasNetClient() || Engine.HasNetServer();

/**
* Display selectable civs only.
*/
const g_CivData = loadCivData(true, false);

var g_PlayerSlot;

var g_Selected = {
"code": "athen"
};
var g_margin = 8;
function init(settings)
{
g_PlayerSlot = settings.playerSlot;
if (settings.id != "random")
g_Selected.code = settings.id;
initDraw();
selectCiv(g_Selected.code);
}
function gridArrayRepeatedObjects (basename, splitvar="n", vMargin=0, limit=[], vOffset=0, hOffset=0)
{
basename = basename.split("["+splitvar+"]", 2);

if (limit.length == 0)
{
limit = [0, 0, 1];
while (Engine.GetGUIObjectByName(basename.join("["+ (limit[1]+1) +"]")))
{
++limit[1];
++limit[2];
}
}
else if (limit.length < 2)
{
error("Invalid limit arguments");
return 0;
}
else
limit[2] = limit[1] - limit[0] + 1;

var firstObj = Engine.GetGUIObjectByName(basename.join("["+limit[0]+"]"));
var child = firstObj.getComputedSize();
child.width = child.right - child.left;
child.height = child.bottom - child.top;

var parent = firstObj.parent.getComputedSize();
parent.width = parent.right - parent.left - hOffset;

var rowLength = Math.floor(parent.width / child.width);

var hMargin = parent.width - child.width * rowLength;
hMargin = Math.round(hMargin / (rowLength + 1));

child.width += hMargin;
child.height += vMargin;

var i = limit[0];
for (let r = 0; r < Math.ceil(limit[2]/rowLength); ++r)
{
for (let c = 0; c < rowLength; ++c)
{
let newSize = new GUISize();
newSize.left = c * child.width + hMargin + hOffset;
newSize.right = (c+1) * child.width + hOffset;
newSize.top = r * child.height + vMargin + vOffset;
newSize.bottom = (r+1) * child.height + vOffset;
Engine.GetGUIObjectByName(basename.join("["+ i++ +"]")).size = newSize;

if (i > limit[1])
break;
}
}

var lastObj = Engine.GetGUIObjectByName(basename.join("["+(i-1)+"]"));
return (lastObj.size.bottom - firstObj.size.top);
}
function setEmbSize (objectName, length=128)
{
var objSize = Engine.GetGUIObjectByName(objectName).size;
objSize.right = objSize.left + length;
objSize.bottom = objSize.top + length;
Engine.GetGUIObjectByName(objectName).size = objSize;
}

function setEmbPos (objectName, x=0, y=0)
{
var objSize = Engine.GetGUIObjectByName(objectName).size;
var wid = objSize.right - objSize.left;
objSize.left = x;
objSize.top = y;
Engine.GetGUIObjectByName(objectName).size = objSize;
setEmbSize(objectName, wid);
}
function initDraw()
{
// gridArrayRepeatedObjects("emblem[emb]", "emb", 8);
let emb = 0;
let vOffset = 0;
let row = 6;
let xStart = 58;
let xSize = 80;
let x = xStart;
for (let civ in g_CivData)
{
// g_CivData[civ].embs = [ emb ];
let embImg = Engine.GetGUIObjectByName("emblem["+emb+"]_img");
if (embImg === undefined)
{
error("There are not enough images in the current GUI layout to support that many civs");
break;
}

embImg.sprite = "stretched:";
if (civ !== g_Selected.code)
embImg.sprite += "grayscale:";
embImg.sprite += g_CivData[civ].Emblem;

let embTxt = Engine.GetGUIObjectByName("emblem["+emb+"]_name");
embTxt.caption = g_CivData[civ].Name;

//setEmbSize("emblem["+emb+"]", xSize);
setEmbPos("civ["+emb+"]", x, vOffset+g_margin);
let embBtn = Engine.GetGUIObjectByName("emblem["+emb+"]_btn");
setBtnFunc(embBtn, selectCiv, [ civ ]);
Engine.GetGUIObjectByName("emblem["+emb+"]").hidden = false;
Engine.GetGUIObjectByName("civ["+emb+"]").hidden = false;

x += xSize;
emb++;
if (emb % row == 0) {
let range = [ emb ];
range[1] = emb+6;
// setEmbSize("emblem["+range[0]+"]", xSize);
vOffset += g_margin * 2;
vOffset += gridArrayRepeatedObjects("civ[emb]", "emb", 8, range, vOffset, g_margin);
x = xStart;
}
}
hideRemainingX("civ[", emb, "]");
}
function updateDraw()
{
let emb = 0;
for (let civ in g_CivData)
{
let embImg = Engine.GetGUIObjectByName("emblem["+emb+"]_img");
if (embImg === undefined)
{
error("There are not enough images in the current GUI layout to support that many civs");
break;
}
let embTxt = Engine.GetGUIObjectByName("emblem["+emb+"]_name");
embImg.sprite = "stretched:";
embTxt.textcolor = "white";
if (civ == g_Selected.code) {
embTxt.textcolor = "green";
}
if (civ !== g_Selected.code) {
embImg.sprite += "grayscale:";
}
embImg.sprite += g_CivData[civ].Emblem;
++emb;
}
}
function hideRemainingX(prefix, idx, suffix)
{
let obj = Engine.GetGUIObjectByName(prefix+idx+suffix);
while (obj)
{
obj.hidden = true;
++idx;
obj = Engine.GetGUIObjectByName(prefix+idx+suffix);
}
}
function setBtnFunc (btn, func, vars = null)
{
btn.onPress = function () { func.apply(null, vars); };
}

function selectCiv(code)
{
g_Selected.code = code;
let heading = Engine.GetGUIObjectByName("selected_heading");
heading.caption = g_CivData[code].Name;
let civList = Engine.GetGUIObjectByName("selected_civs");
civList.hidden = false;
let history = Engine.GetGUIObjectByName("selected_history");
history.caption = g_CivData[code].History;
let size = history.parent.size;
size.top = 48;
history.parent.size = size;
updateDraw();
}

function returnCiv(choosed)
{
Engine.PopGuiPageCB({
"code": g_Selected.code,
"playerSlot": g_PlayerSlot,
"change": choosed
});
}
75 changes: 75 additions & 0 deletions gui/civsel/civsel.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8"?>
<objects>
<script directory="gui/common/"/>
<script directory="gui/civsel/"/>

<!-- Add a translucent black background to fade out the menu page -->
<object type="image" sprite="ModernFade"/>

<object type="image" style="ModernDialog" size="50%-488 50%-360 50%+488 50%+360">
<object style="ModernLabelText" type="text" size="50%-128 -18 50%+128 14">
<translatableAttribute id="caption">Civilization Selection</translatableAttribute>
</object>
<!-- draw space -->
<object type="image" size="0 40 100% 100%">
<repeat count="32" var="em">
<object name="civ[em]" size="4 8 4+80 8+100">
<object name="emblem[em]" size="4 8 4+80 8+80">
<object type="image" style="EmblemImage" name="emblem[em]_img"/>
<object type="button" style="EmblemButton" name="emblem[em]_btn"/>
</object>
<object type="text" font="sans-bold-12" name="emblem[em]_name" textcolor="white" text_align="center" size="4 8+80 100% 8+80+20"/>
</object>
</repeat>
</object>
<object sprite="ModernDarkBoxGold" type="image" size="70%+8 32 100%-16 100%-70">
<!-- Selection Details -->
<object
name="selected_heading"
type="text"
font="sans-bold-24"
textcolor="white"
text_align="center"
size="0 12 100% 40"
/>

<object
name="selected_civs"
type="text"
font="sans-16"
textcolor="white"
text_align="center"
size="4 44 100%-4 100%-4"
/>

<object size="8 48 100%-8 100%-8" type="image" sprite="ModernDarkBoxGold">
<object
name="selected_history"
type="text"
font="sans-14"
textcolor="white"
text_align="center"
size="4 4 100%-4 100%-4"
/>
</object>

</object>
<object
name="selected_text"
type="text"
font="sans-12"
textcolor="green"
text_align="center"
text_valign="bottom"
size="70%+8 100%-64 100%-16 100%-48"
/>
<object type="button" style="ModernButtonRed" size="18 100%-45 50%-5 100%-17">
<translatableAttribute id="caption">Cancel</translatableAttribute>
<action on="Press">returnCiv(false);</action>
</object>
<object type="button" style="ModernButtonRed" size="50%+5 100%-45 100%-18 100%-17">
<translatableAttribute id="caption">Confirm</translatableAttribute>
<action on="Press">returnCiv(true);</action>
</object>
</object>
</objects>
6 changes: 6 additions & 0 deletions gui/civsel/sprites.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<sprites>
<sprite name="CivIconPress">
<image texture="session/portraits/emblems/states/click.png"/>
</sprite>
</sprites>
17 changes: 17 additions & 0 deletions gui/civsel/styles.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<styles>
<style name="EmblemButton"
sprite=""
sprite_pressed="CivIconPress"
size="0 0 100% 100%"
sound_pressed="audio/interface/ui/ui_button_click.ogg"
/>
<style name="EmblemImage"
sprite="stretched:pregame/shell/logo/wfg_logo_white.png"
size="0 0 100% 100%"
/>
<style name="HeroImage"
sprite="stretched:pregame/shell/logo/wfg_logo_white.png"
size="0 0 32 32"
/>
</styles>
Loading

0 comments on commit bd1e73b

Please sign in to comment.