The Battle for Wesnoth 1.21.0-dev
 
Loading...
Searching...
No Matches
lua_race.cpp
Go to the documentation of this file.
1/*
2 Copyright (C) 2014 - 2025
3 by Chris Beck <render787@gmail.com>
4 Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY.
12
13 See the COPYING file for more details.
14*/
15
17
18#include "units/race.hpp"
21#include "units/types.hpp"
22
23#include <string>
24#include <cstring>
25
26
27/**
28 * Implementation for a lua reference to a race,
29 * used by the wesnoth in-game races table.
30 */
31
32// Registry key
33static const char * Race = "race";
34static const char * Gen = "name generator";
35
36/**
37 * Gets some data on a race (__index metamethod).
38 * - Arg 1: table containing an "id" field.
39 * - Arg 2: string containing the name of the property.
40 * - Ret 1: something containing the attribute.
41 */
42static int impl_race_get(lua_State* L)
43{
44 const unit_race& race = luaW_checkrace(L, 1);
45 char const* m = luaL_checkstring(L, 2);
46
47 return_tstring_attrib("description", race.description());
48 return_tstring_attrib("name", race.name());
49 return_int_attrib("num_traits", race.num_traits());
52 return_tstring_attrib("plural_name", race.plural_name());
53 return_bool_attrib("ignore_global_traits", !race.uses_global_traits());
54 return_string_attrib("undead_variation", race.undead_variation());
55 return_string_attrib("footprints", race.footprints());
56 return_cfgref_attrib("__cfg", race.get_cfg());
57 if (strcmp(m, "traits") == 0) {
58 lua_newtable(L);
59 if (race.uses_global_traits()) {
60 for (const config& trait : unit_types.traits()) {
61 const std::string& id = trait["id"];
62 lua_pushlstring(L, id.c_str(), id.length());
63 luaW_pushconfig(L, trait);
64 lua_rawset(L, -3);
65 }
66 }
67 for (const config& trait : race.additional_traits()) {
68 const std::string& id = trait["id"];
69 lua_pushlstring(L, id.c_str(), id.length());
70 luaW_pushconfig(L, trait);
71 lua_rawset(L, -3);
72 }
73 return 1;
74 }
75 if (strcmp(m, "male_name_gen") == 0) {
77 luaL_getmetatable(L, Gen);
78 lua_setmetatable(L, -2);
79 return 1;
80 }
81 if (strcmp(m, "female_name_gen") == 0) {
83 luaL_getmetatable(L, Gen);
84 lua_setmetatable(L, -2);
85 return 1;
86 }
87
88 return 0;
89}
90
91/**
92 * Turns a lua proxy race to string. (__tostring metamethod)
93 */
94static int impl_race_tostring(lua_State* L)
95{
96 const unit_race& race = luaW_checkrace(L, 1);
97 std::ostringstream str;
98 str << "race: <" << race.id() << '>';
99 lua_push(L, str.str());
100 return 1;
101}
102
103namespace lua_race {
104
105 std::string register_metatable(lua_State * L)
106 {
107 luaL_newmetatable(L, Race);
108
109 static luaL_Reg const callbacks[] {
110 { "__index", &impl_race_get},
111 { "__tostring", &impl_race_tostring},
112 { nullptr, nullptr }
113 };
114 luaL_setfuncs(L, callbacks, 0);
115
116 lua_pushstring(L, "race");
117 lua_setfield(L, -2, "__metatable");
118
119 return "Adding getrace metatable...\n";
120 }
121}
122
123void luaW_pushrace(lua_State *L, const unit_race & race)
124{
125 lua_createtable(L, 0, 1);
126 lua_pushstring(L, race.id().c_str());
127 lua_setfield(L, -2, "id");
128 luaL_setmetatable(L, Race);
129}
130
131void luaW_pushracetable(lua_State *L)
132{
133 const race_map& races = unit_types.races();
134 lua_createtable(L, 0, races.size());
135
136 for (const race_map::value_type &race : races)
137 {
138 assert(race.first == race.second.id());
139 luaW_pushrace(L, race.second);
140 lua_setfield(L, -2, race.first.c_str());
141 }
142}
143
144const unit_race& luaW_checkrace(lua_State* L, int idx)
145{
146 lua_pushstring(L, "id");
147 lua_rawget(L, idx);
148 const unit_race* raceptr = unit_types.find_race(lua_tostring(L, -1));
149 if(!raceptr) {
150 luaL_argerror(L, idx, "unknown race");
151 throw "UNREACHABLE";
152 }
153 return *raceptr;
154}
A config object defines a single node in a WML file, with access to child nodes.
Definition config.hpp:157
bool uses_global_traits() const
Definition race.cpp:122
const t_string & plural_name() const
Definition race.hpp:38
const std::string & id() const
Definition race.hpp:35
const config & get_cfg() const
Definition race.hpp:34
unsigned int num_traits() const
Definition race.cpp:137
const t_string & name(GENDER gender=MALE) const
Definition race.hpp:37
const t_string & description() const
Definition race.hpp:39
const config::const_child_itors & additional_traits() const
Definition race.cpp:127
const std::string & footprints() const
Definition race.hpp:50
const std::string & undead_variation() const
Definition race.hpp:49
const name_generator & generator(GENDER gender) const
Definition race.cpp:117
@ FEMALE
Definition race.hpp:28
const race_map & races() const
Definition types.hpp:408
const unit_race * find_race(const std::string &) const
Definition types.cpp:1359
config_array_view traits() const
Definition types.hpp:412
void luaW_pushconfig(lua_State *L, const config &cfg)
Converts a config object to a Lua table pushed at the top of the stack.
#define return_string_attrib(name, accessor)
#define return_cfgref_attrib(name, accessor)
#define return_int_attrib(name, accessor)
#define return_bool_attrib(name, accessor)
#define return_tstring_attrib(name, accessor)
static int impl_race_get(lua_State *L)
Gets some data on a race (__index metamethod).
Definition lua_race.cpp:42
static int impl_race_tostring(lua_State *L)
Turns a lua proxy race to string.
Definition lua_race.cpp:94
static const char * Race
Implementation for a lua reference to a race, used by the wesnoth in-game races table.
Definition lua_race.cpp:33
void luaW_pushrace(lua_State *L, const unit_race &race)
Definition lua_race.cpp:123
void luaW_pushracetable(lua_State *L)
Definition lua_race.cpp:131
const unit_race & luaW_checkrace(lua_State *L, int idx)
Definition lua_race.cpp:144
static const char * Gen
Definition lua_race.cpp:34
This namespace contains bindings for lua to hold a pointer to a race, and to access and modify it.
Definition lua_race.cpp:103
std::string register_metatable(lua_State *L)
Definition lua_race.cpp:105
void lua_push(lua_State *L, const T &val)
std::map< std::string, unit_race > race_map
Definition race.hpp:106
unit_type_data unit_types
Definition types.cpp:1499