openclonk/planet/Tests.ocf/MenuTest.ocs/Script.c

498 lines
13 KiB
C

static active_menu;
func Initialize()
{
var starter_menu =
{
Style = GUI_Multiple | GUI_TextVCenter | GUI_TextHCenter,
Decoration = GUI_MenuDeco,
Left = "100%-7em", Top = "+3em",
Right = "100%-1em", Bottom = "+4em",
Text = "OPEN MENU",
BackgroundColor = {Std = 0, Hover = 0xffff0000},
OnMouseIn = GuiAction_SetTag("Hover"),
OnMouseOut = GuiAction_SetTag("Std"),
OnClick = GuiAction_Call(Scenario, "StartMenu")
};
GuiOpen(starter_menu);
//Schedule(nil, "Scenario->TestDesync()", 2);
}
static desync_menu;
func TestDesync()
{
var rock = CreateObject(Rock);
Random(100);
var menu =
{
Prototype = rock,
BackgroundColor = RGB(255, 100, 0),
OnClick = GuiAction_Call(Scenario, "Desync"),
OnClose = GuiAction_Call(Scenario, "DesyncClose")
};
Log("DESYNC TEST - OPENING MENU*~");
desync_menu = GuiOpen(menu);
Log("DESYNC TEST - OPENING MENU DONE*~*");
}
func Desync()
{
Random(100);
GuiClose(desync_menu);
}
func DesyncClose()
{
Random(100);
Log("Desync Close");
}
func MarginTest()
{
var menu =
{
Style = GUI_GridLayout,
BackgroundColor = RGB(255, 0, 0),
};
for (var i = 0; i < 10; ++i)
{
var sizes = ["8em", "8em", "16em", "16em"];
ShuffleArray(sizes);
var entry =
{
BackgroundColor = RGB(0, 255, 0),
Left = 0, Top = 0,
Right = sizes[0], Bottom = sizes[1],
Margin = ["1em"],//["1em", "1em", "1em", "1em"]
};
GuiAddSubwindow(entry, menu);
}
active_menu = GuiOpen(menu);
}
func CloseCurrentMenu()
{
GuiClose(active_menu);
active_menu = 0;
}
/* -------------------------------- MAIN ----------------------------- */
func MainOnHover(parameter, int ID)
{
GuiUpdateText(parameter, active_menu, 9999);
}
func StartMenu(plr)
{
if (active_menu)
{
if (GuiClose(active_menu)) return;
}
var main_menu =
{
Decoration = GUI_MenuDeco,
head = {Bottom = "+3em", Text = "Please choose a test!", Style = GUI_TextHCenter | GUI_TextVCenter, IDs = 0},
body = {Top = "+3em", right = {ID = 9999, Left = "50%"} },
};
GuiAddCloseButton(main_menu, Scenario, "CloseCurrentMenu");
var menu = CreateObject(MenuStyle_List);
main_menu.body.left = menu;
menu.Right = "50%";
menu->SetMouseOverCallback(Scenario, "MainOnHover");
menu->AddItem(Chest, "Test Multiple Lists (Inventory)", nil, Scenario, "StartMultipleListTest", "Shows multiple list-style menus in one big menu.");
menu->AddItem(Rule_TeamAccount, "Test Client/Host (Scenario Options)", nil, Scenario, "StartScenarioOptionsTest", "Shows how to display a dialogue that behaves differently for players.");
menu->AddItem(Clonk, "Test Multiple Windows (Player List)", nil, Scenario, "StartPlayerListTest", "Shows how to display a permanent info dialogue.");
menu->AddItem(Lorry, "Tests Two Grid Menus (Trade Menu)", nil, Scenario, "StartTransferTest", "Shows how to work with two grid menus.");
menu->AddItem(Sproutberry, "Test HP Bars (HP Bars!)", nil, Scenario, "StartHPBarTest", "HP BARS!!!");
menu->AddItem(Crate, "Test mixed grid layout.", nil, Scenario, "StartMixedGridTest", "Grid menu with differently-sized items.");
active_menu = GuiOpen(main_menu);
}
/* ------------------------ inventory test ----------------------------- */
static selected_inventory, inv_menus;
func StartMultipleListTest()
{
GuiClose(active_menu);
selected_inventory = [];
inv_menus = [];
// layout: headline and four sections with items
var menu =
{
head = { ID = 999, Bottom = "+3em", Text = "Inventory: <c ff0000>Empty</c>", Style = GUI_TextHCenter | GUI_TextVCenter, BackgroundColor = 0x55000000},
contents = { Top = "+5em", Left = "+1em", Right = "100%-1em" },
};
GuiAddCloseButton(menu, Scenario, "CloseCurrentMenu");
var inventory = [[Sword, Axe, Club], [IronBomb, Dynamite, Boompack, Firestone], [Bow, Blunderbuss, Javelin], [Shield, Bread, Sproutberry, CookedMushroom]];
var x = ["0%", "50%", "0%", "50%"], y = ["0%", "0%", "50%", "50%"], w = ["50%", "100%", "50%", "100%"], h = ["50%", "50%", "100%", "100%"];
for (var i = 0; i < 4; ++i)
{
var inv = inventory[i];
var ID = 9000 + i;
var m = CreateObject(MenuStyle_List);
m.Decoration = GUI_MenuDeco;
m.Left = x[i]; m.Top = y[i];
m.Right = w[i]; m.Bottom = h[i];
m.Margin = "2em";
GuiAddSubwindow(m, menu.contents);
PushBack(inv_menus, m); // remember for later
for (var obj in inv)
m->AddItem(obj, obj.Description, nil, Scenario, "SelectInventory", [obj, ID]);
}
active_menu = GuiOpen(menu);
}
func SelectInventory(info)
{
var obj = info[0];
var ID = info[1];
PushBack(selected_inventory, obj);
var text = "Your inventory: ";
for (var item in selected_inventory)
text = Format("%s %s,", text, item.Name);
if (GetLength(selected_inventory) == 4)
{
Log("HERO! YOU WILL SPAWN NOW! %s", text);
for (var m in inv_menus)
if (m) m->Close();
GuiClose(active_menu);
}
else
{
var update = { Text = text };
GuiUpdate(update, active_menu, 999);
}
}
/* ------------------------ scenario options test ----------------------------- */
static scenoptions_dummies;
func StartScenarioOptionsTest(parameter, int ID, int player)
{
GuiClose(active_menu);
scenoptions_dummies = [];
scenoptions_dummies[0] = CreateObject(Dummy, nil, nil, player);
scenoptions_dummies[1] = CreateObject(Dummy, nil, nil, player);
for (var i = 0; i <= 1; ++i)
{
if (i == 0)
{
scenoptions_dummies[i]->SetOwner(player);
scenoptions_dummies[i].Visibility = VIS_Owner;
}
else
{
var vis = [VIS_Select];
for (var p = 0; p <= GetPlayerCount(); ++p)
{
var plr = GetPlayerByIndex(p);
if (plr == player) continue;
vis[plr + 1] = 1;
}
scenoptions_dummies[i].Visibility = vis;
}
}
var menu =
{
list =
{
Right = "50%",
Margin = ["2em", "0em"],
Style = GUI_VerticalLayout,
},
right = {
Left = "50%",
Margin = ["2em", "0em"],
Decoration = GUI_MenuDeco,
hostdesc =
{
ID = 1,
Target = scenoptions_dummies[0],
// this is also a test for updating children by name
icon = {Left="50%-4em", Right="50%+4em", Bottom="5em", Top="1em", Symbol=Clonk},
textwindow =
{
Top = "6em",
Text = "Please select the scenario options!"
}
},
clientdesc =
{
ID = 1,
Target = scenoptions_dummies[1],
Text = Format("%s can set the options now! Please wait!", GetTaggedPlayerName(player))
}
}
};
GuiAddCloseButton(menu, Scenario, "CloseCurrentMenu");
var def, rules =[], i = 0;
while (def = GetDefinition(i++))
{
if (!(def->GetCategory() & C4D_Rule)) continue;
PushBack(rules, {def = def, ID = i});
}
for (var rule in rules)
{
var subm =
{
ID = rule.ID,
Bottom = "+4em",
Tooltip = rule.def->GetName(),
icon = {Priority = 10, Symbol = rule.def, Right = "+4em", Bottom = "+4em"},
text = {Priority = 10, Left = "+4em", Style = GUI_TextVCenter, Text = rule.def.Name},
selector = // only visible for host
{
Target = scenoptions_dummies[0],
Priority = 1,
BackgroundColor = {Std = 0, Hover = 0x50ff0000, On = 0x2000ff00},
OnMouseIn = {
Std = [GuiAction_Call(Scenario, "ScenOptsUpdateDesc", [rule.def, rule.ID, false]), GuiAction_SetTag("Hover")],
On = GuiAction_Call(Scenario, "ScenOptsUpdateDesc", [rule.def, rule.ID, true])
},
OnMouseOut = { Hover = GuiAction_SetTag("Std"), On = nil },
OnClick = {
Hover = [GuiAction_Call(Scenario, "ScenOptsActivate", [rule.def, rule.ID]), GuiAction_SetTag("On")],
On = [GuiAction_Call(Scenario, "ScenOptsDeactivate", [rule.def, rule.ID]), GuiAction_SetTag("Hover")],
},
},
tick =
{
Left = "100%-3em", Top = "50%-1em",
Right = "100%-1em", Bottom = "50%+1em",
Symbol = {Std = 0, Unticked = 0, Ticked = Icon_Ok}
}
};
GuiAddSubwindow(subm, menu.list);
}
active_menu = GuiOpen(menu);
}
func ScenOptsActivate(data, int player, int ID, int subwindowID, object target)
{
if (!ObjectCount(Find_ID(data[0])))
CreateObject(data[0]);
GuiUpdateTag("Ticked", active_menu, data[1], nil);
}
func ScenOptsDeactivate(data, int player, int ID, int subwindowID, object target)
{
RemoveAll(Find_ID(data[0]));
GuiUpdateTag("Unticked", active_menu, data[1], nil);
}
func ScenOptsUpdateDesc(data, int player, int ID, int subwindowID, object target)
{
var text = "<c ff0000>Do you really want to remove the rule???</c>";
if (!data[2])
text = data[0].Description;
var update =
{
icon = {Symbol = data[0]},
textwindow = {Text = text}
};
GuiUpdate(update, active_menu, 1, scenoptions_dummies[0]);
}
/* ------------------------ player list test ----------------------------- */
static player_list_menu;
func StartPlayerListTest(parameter, int ID, int player)
{
if (player_list_menu)
{
GuiClose(player_list_menu);
player_list_menu = nil;
return -1;
}
var menu =
{
Left = "100%-9em", Top = "+6em",
Right = "100%0em", Bottom = "+12em",
Style = GUI_Multiple | GUI_VerticalLayout | GUI_FitChildren,
BackgroundColor = 0x30000000,
};
var player_names = [];
for (var i = 0; i < 15; ++i)
{
var p = GetPlayerByIndex(i);
var name;
if (p == NO_OWNER) name = Format("Player %d", i + 1);
else name = GetTaggedPlayerName(p);
var subm =
{
Priority = i,
Bottom = "+1em",
Text = name,
Style = GUI_TextRight | GUI_TextVCenter,
icon =
{
Symbol = Clonk,
Right = "+1em"
}
};
GuiAddSubwindow(subm, menu);
}
player_list_menu = GuiOpen(menu);
return -1; // keep open
}
/* ------------------------ transfer test ----------------------------- */
static transfer_left, transfer_right, transfer_menus, transfer_id_count;
func StartTransferTest()
{
GuiClose(active_menu);
if (transfer_left == nil)
{
transfer_left = [Rock, Loam, Wood, Metal, Nugget, Coal, Shovel, Sword, Bow, Arrow, Boompack];
transfer_right = [Clonk];
transfer_menus = [];
transfer_id_count = 1;
}
// layout: headline and two submenus
var menu =
{
head = { Bottom = "+3em", Text = "Welcome to the trade menu!", Style = GUI_TextHCenter | GUI_TextVCenter},
contents = { Margin = "1em" },
};
GuiAddCloseButton(menu, Scenario, "CloseCurrentMenu");
for (var i = 0; i < 2; ++i)
{
var m = CreateObject(MenuStyle_Grid);
m.Decoration = GUI_MenuDeco;
m.Text = "FROM";
m.Style = GUI_TextHCenter | GUI_GridLayout;
if (i == 1)
{
m.Left = "50% + 2em";
m.Text = "TO";
} else m.Right = "50% - 2em";
GuiAddSubwindow(m, menu.contents);
var a = transfer_left;
if (i == 1) a = transfer_right;
for (var c = 0; c < GetLength(a); ++c)
{
var obj = a[c];
m->AddItem(obj, obj.Name, ++transfer_id_count, Scenario, "SelectTransferGood", [obj, i]);
}
transfer_menus[i] = m;
}
active_menu = GuiOpen(menu);
}
func SelectTransferGood(data, int user_id, int player)
{
var obj = data[0];
var fromLeft = 0 == data[1];
var menu = transfer_menus[data[1]];
// first, move item from array to array
var from = transfer_left, to = transfer_right;
if (!fromLeft)
{
from = transfer_right;
to = transfer_left;
}
var found = false;
for (var i = 0; i < GetLength(from); ++i)
{
if (from[i] != obj) continue;
found = true;
PushBack(to, obj);
RemoveArrayIndex(from, i);
break;
}
if (!found) return -1;
if (!menu->RemoveItem(user_id, active_menu)) Log("remove fail!");
transfer_menus[1 - data[1]]->AddItem(obj, obj.Name, user_id, Scenario, "SelectTransferGood", [obj, 1 - data[1]], nil, active_menu);
return -1;
}
/* ------------------------ HP bar test ----------------------------- */
static HP_bar_menu;
func StartHPBarTest(parameter, int ID, int player)
{
if (HP_bar_menu)
{
GuiClose(HP_bar_menu);
return -1; // keep open
}
var menu =
{
Left = "+0.5em", Top = "+3em",
Right = "+1em", Bottom = "100%-3em",
Style = GUI_Multiple | GUI_IgnoreMouse,
BackgroundColor = RGB(255, 0, 0),
blackOverlay = {ID = 1, Bottom = "0%", BackgroundColor = RGB(10, 10, 10)},
OnClose = GuiAction_Call(Scenario, "OnHPBarClose")
};
if (!GetEffect("FoolAroundWithHPBars"))
AddEffect("FoolAroundWithHPBar", nil, 1, 2);
HP_bar_menu = GuiOpen(menu);
return -1; // keep open
}
global func FxFoolAroundWithHPBarTimer(target, effect, time)
{
var state = Abs(Cos(time, 100));
var update = {Bottom = Format("%d%%", state)};
GuiUpdate(update, HP_bar_menu, 1);
}
func OnHPBarClose()
{
RemoveEffect("FoolAroundWithHPBar");
HP_bar_menu = nil;
Log("HP bar off!");
}
/* ------------------- mixed grid menu test ---------------*/
func StartMixedGridTest()
{
GuiClose(active_menu);
var menu =
{
toptext = {Bottom = "2em", Text="GUI_TightGridLayout", Style = GUI_TextHCenter},
top = {Top = "2em", Bottom = "50%", Margin = "0.5em", Style = GUI_TightGridLayout, Decoration = GUI_MenuDeco},
bottomtext = {Top = "50%", Bottom = "50% + 2em", Text="GUI_GridLayout", Style = GUI_TextHCenter},
bottom = {Top = "50% + 2em", Margin = "0.5em", Style = GUI_GridLayout, Decoration = GUI_MenuDeco},
BackgroundColor = RGBa(0, 0, 0, 128),
};
GuiAddCloseButton(menu, Scenario, "CloseCurrentMenu");
var seed = 1;
for (var i=0; i < 50; ++i)
{
seed = ((seed * 17) + 7) % 1357;
var w = (seed % 4) + 1;
seed = ((seed * 23) + 13)% 1357;
var h = (seed % 4) + 1;
var item =
{
Right = Format("%dem", w),
Bottom = Format("%dem", h),
Priority = i+1,
BackgroundColor = HSL(seed % 255, 200, 200)
};
GuiAddSubwindow(item, menu.top);
GuiAddSubwindow(item, menu.bottom);
}
active_menu = GuiOpen(menu);
}