Skip to content

Commit 5bcd277

Browse files
committed
lobby faction select
1 parent e9d57b9 commit 5bcd277

File tree

10 files changed

+104
-55
lines changed

10 files changed

+104
-55
lines changed

GLSMAC_data/default/ui/parts/mainmenu/steps/multiplayer_lobby/players.gls.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@ return (i) => {
66
height: 358,
77
}, (body) => {
88

9+
const factions = i.glsmac.game.get_fm().list();
10+
let faction_choices = [
11+
['random', 'Random', {
12+
color: 'white',
13+
}],
14+
];
15+
for (faction of factions) {
16+
#print('F', faction);
17+
faction_choices :+[faction.id, faction.name, {
18+
color: faction.text_color,
19+
}];
20+
}
21+
922
let rows = {};
1023

1124
const add_row = (player) => {
@@ -26,11 +39,7 @@ return (i) => {
2639
}),
2740
faction: row.select({
2841
class: 'lobby-player-faction',
29-
items: [
30-
['random', 'Random'],
31-
['fac1', 'Fac1'],
32-
['fac2', 'Fac2'],
33-
],
42+
items: faction_choices,
3443
value: 'random', // TODO
3544
}),
3645
difficulty: row.select({

src/game/backend/Game.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,16 @@ WRAPIMPL_BEGIN( Game )
844844
return VALUE( gse::value::Undefined );
845845
} )
846846
},
847+
{
848+
"get_fm",
849+
NATIVE_CALL( this ) {
850+
N_EXPECT_ARGS( 0 );
851+
return m_state
852+
? m_state->GetFM()->Wrap( GSE_CALL, true )
853+
: VALUE( gse::value::Undefined )
854+
;
855+
} )
856+
},
847857
};
848858
if ( m_tm ) {
849859
properties.insert(

src/game/backend/Player.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,20 @@ WRAPIMPL_BEGIN( Player )
105105
"id",
106106
VALUE( gse::value::Int, , m_slotnum )
107107
},
108+
{
109+
"type",
110+
VALUE( gse::value::String, , "human" )
111+
},
108112
{
109113
"name",
110114
VALUE( gse::value::String, , m_name )
111115
},
116+
{
117+
"faction",
118+
m_faction
119+
? m_faction->Wrap( GSE_CALL, gc_space )
120+
: VALUE( gse::value::Undefined )
121+
},
112122
{
113123
"is_master",
114124
VALUE( gse::value::Bool, , m_role == PR_SINGLE || m_role == PR_HOST )
@@ -118,20 +128,20 @@ WRAPIMPL_END_PTR()
118128

119129
const types::Buffer Player::Serialize() const {
120130
types::Buffer buf;
121-
131+
122132
buf.WriteString( m_name );
123133
buf.WriteInt( m_role );
124134
buf.WriteBool( m_faction != nullptr );
125135
if ( m_faction ) {
126136
buf.WriteString( m_faction->Serialize().ToString() );
127137
}
128138
buf.WriteString( m_difficulty_level );
129-
139+
130140
return buf;
131141
}
132142

133143
void Player::Unserialize( types::Buffer buf ) {
134-
144+
135145
m_name = buf.ReadString();
136146
m_role = (role_t)buf.ReadInt();
137147
m_faction = {};
@@ -140,7 +150,7 @@ void Player::Unserialize( types::Buffer buf ) {
140150
m_faction->Unserialize( buf.ReadString() );
141151
}
142152
m_difficulty_level = buf.ReadString();
143-
153+
144154
}
145155

146156
}

src/game/backend/faction/Faction.cpp

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "engine/Engine.h"
77
#include "loader/texture/TextureLoader.h"
88
#include "resource/ResourceManager.h"
9+
#include "util/String.h"
910

1011
namespace game {
1112
namespace backend {
@@ -69,23 +70,27 @@ void Faction::Unserialize( types::Buffer buf ) {
6970

7071
WRAPIMPL_BEGIN( Faction )
7172
WRAPIMPL_PROPS
72-
{
73-
"id",
74-
VALUE( gse::value::String,, m_id )
75-
},
76-
{
77-
"name",
78-
VALUE( gse::value::String,, m_name )
79-
},
80-
{
81-
"is_naval",
82-
VALUE( gse::value::Bool,, m_flags & Faction::FF_NAVAL )
83-
},
84-
{
85-
"is_progenitor",
86-
VALUE( gse::value::Bool,, m_flags & Faction::FF_PROGENITOR )
87-
},
88-
};
73+
{
74+
"id",
75+
VALUE( gse::value::String, , m_id )
76+
},
77+
{
78+
"name",
79+
VALUE( gse::value::String, , m_name )
80+
},
81+
{
82+
"text_color",
83+
m_colors.text.Wrap( GSE_CALL ),
84+
},
85+
{
86+
"is_naval",
87+
VALUE( gse::value::Bool, , m_flags & Faction::FF_NAVAL )
88+
},
89+
{
90+
"is_progenitor",
91+
VALUE( gse::value::Bool, , m_flags & Faction::FF_PROGENITOR )
92+
},
93+
};
8994
WRAPIMPL_END_PTR()
9095

9196
UNWRAPIMPL_PTR( Faction )

src/game/backend/faction/FactionManager.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,18 @@ WRAPIMPL_BEGIN( FactionManager )
209209
return VALUE( gse::value::Undefined );
210210
} )
211211
},
212+
{
213+
"list",
214+
NATIVE_CALL( this ) {
215+
N_EXPECT_ARGS( 0 );
216+
gse::value::array_elements_t arr = {};
217+
for ( const auto& f : m_factions_order ) {
218+
ASSERT( m_factions.find( f.second ) != m_factions.end(), "faction id not found: " + f.second );
219+
arr.push_back( m_factions.at( f.second ).faction->Wrap( GSE_CALL ) );
220+
}
221+
return VALUE( gse::value::Array,, arr );
222+
} )
223+
},
212224
};
213225
WRAPIMPL_END_PTR()
214226

src/game/backend/slot/Slot.cpp

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -165,27 +165,9 @@ void Slot::Unserialize( types::Buffer buf ) {
165165
WRAPIMPL_BEGIN( Slot )
166166
ASSERT( m_slot_state == SS_PLAYER, "only player slots can be wrapped for now" );
167167
auto* player = m_player_data.player;
168-
WRAPIMPL_PROPS
169-
{
170-
"id",
171-
VALUE( gse::value::Int, , m_index )
172-
},
173-
{
174-
"type",
175-
VALUE( gse::value::String, , "human" )
176-
},
177-
{
178-
"name",
179-
VALUE( gse::value::String, , player->GetPlayerName() )
180-
},
181-
{
182-
"faction",
183-
player->GetFaction()
184-
? player->GetFaction()->Wrap( GSE_CALL, gc_space )
185-
: VALUE( gse::value::Undefined )
186-
},
187-
};
188-
WRAPIMPL_END_PTR()
168+
ASSERT( player, "can't wrap slot without player" );
169+
return player->Wrap( GSE_CALL );
170+
}
189171

190172
UNWRAPIMPL_PTR( Slot )
191173

src/gse/Value.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ class Value : public gc::Object {
216216

217217
enum type_t : uint8_t {
218218
T_NULLPTR, // special type only for serialization/deserialization
219+
T_NOTHING, // special type meaning 'no type'
219220
T_UNDEFINED,
220221
T_NULL,
221222
T_BOOL,

src/ui/dom/ChoiceList.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ void ChoiceList::SetItems( GSE_CALLABLE, const gse::value::array_elements_t& ite
144144
GSE_ERROR( gse::EC.TYPE_ERROR, "Choicelist items are expected to be value-label pairs, got " + item->GetTypeString() + ": " + item->ToString() );
145145
}
146146
const auto& kv = ( (gse::value::Array*)item )->value;
147-
if ( kv.size() != 2 || kv.at( 0 )->type != gse::Value::T_STRING || kv.at( 1 )->type != gse::Value::T_STRING ) {
148-
GSE_ERROR( gse::EC.TYPE_ERROR, "Choicelist items are expected to be pairs of two strings (value and label), got: " + item->ToString() );
147+
if ( kv.size() < 2 || kv.size() > 3 || kv.at( 0 )->type != gse::Value::T_STRING || kv.at( 1 )->type != gse::Value::T_STRING ) {
148+
GSE_ERROR( gse::EC.TYPE_ERROR, "Choicelist items are expected to be pairs of two strings (value and label) (and optional style object), got: " + item->ToString() );
149149
}
150150
const auto& k = ( (gse::value::String*)kv.at( 0 ) )->value;
151151
const auto& v = ( (gse::value::String*)kv.at( 1 ) )->value;
@@ -162,6 +162,16 @@ void ChoiceList::SetItems( GSE_CALLABLE, const gse::value::array_elements_t& ite
162162
}
163163
);
164164
AddChild( GSE_CALL, element, true );
165+
if ( kv.size() >= 3 ) {
166+
const auto &c = kv.at(2);
167+
if ( c->type != gse::Value::T_OBJECT || ( !((gse::value::Object*)c)->object_class.empty() ) ) {
168+
GSE_ERROR( gse::EC.TYPE_ERROR, "Choicelist items are expected to have style object as third element, got: " + c->ToString() );
169+
}
170+
const auto* style = (gse::value::Object*)c;
171+
for ( const auto& it : style->value ) {
172+
element->WrapSet( it.first, it.second, GSE_CALL );
173+
}
174+
}
165175
const auto& choice = m_choices.insert(
166176
{ k, {
167177
k,

src/ui/dom/Object.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -383,10 +383,12 @@ void Object::OnPropertyChange( GSE_CALLABLE, const std::string& key, gse::Value*
383383
ASSERT( !m_is_destroyed, "object is destroyed" );
384384
const auto& def = m_property_defs.find( key );
385385
ASSERT( def != m_property_defs.end(), "property def not found" );
386-
const auto t1 = value->type;
387-
const auto t2 = def->second.type;
388-
if ( t1 != t2 ) {
389-
GSE_ERROR( gse::EC.UI_ERROR, "Property '" + key + "' is expected to be " + gse::Value::GetTypeStringStatic( def->second.type ) + ", got " + value->GetTypeString() + ": " + value->ToString() );
386+
const auto t1 = def->second.type;
387+
if ( t1 != gse::Value::T_NOTHING ) {
388+
const auto t2 = value->type;
389+
if ( t1 != t2 ) {
390+
GSE_ERROR( gse::EC.UI_ERROR, "Property '" + key + "' is expected to be " + gse::Value::GetTypeStringStatic( def->second.type ) + ", got " + value->GetTypeString() + ": " + value->ToString() );
391+
}
390392
}
391393
for ( const auto& obj : m_wrapobjs ) {
392394
obj->Assign( key, value );

src/ui/dom/Text.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,18 @@ Text::Text( DOM_ARGS )
5454
);
5555

5656
Property(
57-
GSE_CALL, "color", gse::Value::T_STRING, nullptr, PF_NONE,
57+
GSE_CALL, "color", gse::Value::T_NOTHING, nullptr, PF_NONE,
5858
[ this ]( GSE_CALLABLE, gse::Value* const v ) {
5959
types::Color color = {};
60-
ParseColor( GSE_CALL, ( (gse::value::String*)v )->value, color );
60+
if ( v->type == gse::Value::T_STRING ) {
61+
ParseColor( GSE_CALL, ( (gse::value::String*)v )->value, color );
62+
}
63+
else if ( v->type == gse::Value::T_OBJECT && ( (gse::value::Object*)v )->object_class == "Color" ) {
64+
color = types::Color::Unwrap( v );
65+
}
66+
else {
67+
GSE_ERROR( gse::EC.UI_ERROR, "Property 'color' is expected to be String or Color, got " + v->GetTypeString() + ": " + v->ToString() );
68+
}
6169
m_actor->SetColor( color );
6270
},
6371
[ this ]( GSE_CALLABLE ) {

0 commit comments

Comments
 (0)