Age | Commit message (Collapse) | Author | Files | Lines |
|
|
|
Artifacts of the same name from different runs can overwrite each other.
This makes sure that tests of the cmake pipeline actually test the cmake
artifacts, and similarly for attoconf.
|
|
Previously, only ../conf style includes were excluded from expecting a fwd.hpp
file to be provided for the directory. Permit src/conf style includes too.
|
|
How did this ever work before? Did it expect there to be a previously
installed libtmwa-shared.so and run tests against that, rather than what
was just built?
|
|
This allows files that already exist to be specified relative to SRC_DIR,
rather than just relative to the current file.
This is used in tests, though it appears not to be used in main tmwa.
|
|
|
|
The default value for GTEST_DIR should be deps/googletest/googletest under
the source directory, not under the build directory. The build directory
will often not have anything in it at all in the case of an out-of-tree
build.
This allows some tests to run for out-of-tree builds.
|
|
Also, just require the use of full paths when #including a generated file.
This fixes fresh out-of-tree builds using attoconf, and gets rid of a lot of
annoying terminal output when attoconf is tracing dependencies.
|
|
I appreciate and respect how densely packed Makefile code can be.
hahahaahahahaaa
|
|
|
|
This should be reverted once we drop support for Ubuntu 18.04, and therefore
python3.6, as it does clutter up the code a bit.
Sourced from specing's work on the porting process.
See https://git.themanaworld.org/legacy/tmwa/-/merge_requests/256
|
|
- unicode -> str
- u'' -> ''
- cStringIO -> io
Sourced from specing's work on the porting process.
See https://git.themanaworld.org/legacy/tmwa/-/merge_requests/256
|
|
|
|
|
|
|
|
|
|
|
|
- Correctly handle files in subdirectories in out-of-tree builds
- Handle UTF-8 properly
- Close file resources properly
|
|
|
|
|
|
If we want to be able to filter specific other entries, such as for the sake
of more generated files, we'll want to be doing this over a list that has
already been made relative and simplified.
|
|
A little indentation and formatting, and quite a lot of commenting,
goes a long way.
This doesn't change any code, it only reformats it.
|
|
|
|
|
|
|
|
|
|
Or more specifically, in the attoconf buildchain. attoconf itself directly
generates src/conf/install.hpp alongside Makefile, but version inforation
is only available later.
To generate version.hpp, I extended version.mk slightly to provide the recipe.
It's not anywhere near as generic as real.make tends to be, but with any luck
we'll soon be doing all builds through cmake going forward.
The template for install.hpp has been changed to use variables actually
provided by attoconf. PACKAGE{SYSCONF,LOCALSTATE}DIR are actually only defined
in real.make, and then only in terms of SYSCONFDIR and LOCALSTATEDIR, adding
`/tmwa`. It's simpler to just use the attoconf variable and adjust the
template, which conveniently also simplifies the construction in
CMakeLists.txt, too.
|
|
|
|
Also remove {install,version}.hpp from source control, so they're actually
generated.
There may be a better way to handle this, but I'll just leave a note as a
TODO for now.
|
|
Use execute_process instead of add_custom_target to make sure the
generated files are found on the first configure run.
Set CMAKE_CONFIGURE_DEPENDS so that touching the script generating files
will automatically trigger a re-configre, which will re-run the make
process.
|
|
|
|
The values of defines in these files should be the same as those set
from version.mk / Makefile.in.
|
|
|
|
|
|
attoconf is a bespoke build system that has seen little maintenance, and the
overwhelming majority of build logic happens inside real.mk, here Makefile.in.
While attoconf and real.mk provide a lot of very nice functionality, it
doesn't integrate so well with IDEs, and is very intimidating for prospective
developers. Providing a full cmake based approach solves both of these
problems, and there isn't anything so complicated in tmwa that it needs its
own build system.
WIP: This represents a messy dump of CMakeLists.txt in the last state I left
it. It has been shared to make collaboration easier, but should by no means be
considered anything more than exploratory at this point.
|
|
.mk is more widely understood than .make, for IDE usage.
|
|
C++0x was released as C++11 nearly a decade and a half ago.
My version of cmake doesn't recognize it in CMAKE_CXX_STANDARD, which
makes before/after comparison difficult.
|
|
Extremely minimal, not touching any __future__ imports or such.
For serious use, see specing's WIP PR at:
https://git.themanaworld.org/legacy/tmwa/-/merge_requests/256
|
|
This configuration variable changed from signed to unsigned with the
move to Python-generated config file parsing in
e1418f378c66343a35db3791cbf0d54a4be3fbd3 and
c482e420bcf447073ffe3ff8a106a0561e0baadd.
Changing it back to signed because it is compared to a signed integer
returned from count_users. Also, having it as signed integer allows
setting it to a negative value to refuse any user connection.
|
|
This commit lands fix for infamous AFK-kill summons exploit.
Its what essentially caused summoner spells in cities to be disabled.
This is not free lunch: it comes at expense of little fun where
mob would bite bad master hitting it. But its been minor fun or
cosmetics while spells restriction in cities and so on is annoying
setback for mages.
So if choosing between evil and even more evil, guess...
Technically, server's bug is: it too eager to reattach some things to
wrong RID or something like this. Its what causes aggroed mob to
lock on really wrong random targets and AFK-kill them.
|
|
|
|
|
|
efficient.
Credit to @Hello for figuring this out :)
|
|
|
|
Nice consistency there, past!Freeyorp.
|
|
`npc_scriptcont` now consistently returns 1 on failure, though in practice,
this return value was always ignored.
|
|
055-1 _nodes.txt will call `destroy;` from within OnInit, that is during an
iteration of the global `ev_db`. Previously, concurrent modification
invalidated this iteration, resulting in a crash.
This still nullifes `oid`, dequeues all timers, and effectively calls
`builtin_end`.
`npc_data::deletion_pending` is extended to include a third state.
In addition to no deletion happening, and indicating when `npc_free` is
currently on the stack, it now also tracks whether the NPC is about to be
deleted by a timer.
This means that an NPC which is about to be deleted is still blocked from
triggering new events, much like an NPC actively being deleted would.
Starting or continuing an NPC dialog with an NPC that does not, or is about to
no longer exist, is now also blocked.
|
|
|
|
This is some rather impressive type safety, albeit safety that has evidently
desensitized people to warnings for rather serious problems.
|
|
PR !270 is an ongoing investigation into outstanding compiler warnings.
One such warning is `warning: format '%s' expects a matching 'char*' argument`
from `script_nullpo_end(nd, STRPRINTF("no such npc: '%s'"_fmt, name));` in
`src/map/script-fun.cpp`. No such warning is emitted from a similar line in
`src/map/atcommand.cpp`: `AString output = STRPRINTF("Jump to %s"_fmt, npc);`.
`script_nullpo_end` is a macro, rather than a function. `error` is passed in
verbatim by the preprocessor. The macro definition of `script_nullpo_end`
includes lines such as the following:
```cpp
PRINTF("script:%s: " #error " @ %s\n"_fmt, BUILTIN_NAME(), nullpo_nd->name);
```
`#<variable>` instructs the preprocessor to transform `<variable>` into a
literal string. In this case, the string literal:
```cpp
"STRPRINTF(\"no such npc: '%s'\"_fmt, name)"
```
So the entire line partly resolves to something like:
```cpp
printf("script:%s: STRPRINTF(\"no such npc: '%s'\"_fmt, name) @ %s\n"_fmt, BUILTIN_NAME(), nullpo_nd->name);
```
Once the compiler sees this, it throws out the warning seen here, because
printf is seeing three placeholders in the formatter, but is only given two
value arguments.
Checking with `gcc -E`, the full expansion is as follows:
```cpp
if (nullpo_chk("script-fun.cpp", 4885, __PRETTY_FUNCTION__, nd)) { if (st->oid) { dumb_ptr<npc_data> nullpo_nd = map_id_is_npc(st->oid); if (nullpo_nd && nullpo_nd->name) { ({ struct format_impl { constexpr static FormatString print_format() __asm__("_print_format") { return "script:%s: " "STRPRINTF(\"no such npc: '%s'\"_fmt, npc)" " @ %s\n"_fmt; } }; cxxstdio::PrintFormatter<format_impl>::print((
# 4885 "script-fun.cpp" 3 4
stdout
# 4885 "script-fun.cpp"
), (builtin_functions[st->stack->stack_datav[st->start].get_if<ScriptDataFuncRef>()->numi].name), nullpo_nd->name); }); } else if (nullpo_nd) { ({ struct format_impl { constexpr static FormatString print_format() __asm__("_print_format") { return "script:%s: " "STRPRINTF(\"no such npc: '%s'\"_fmt, npc)" " (unnamed npc)\n"_fmt; } }; cxxstdio::PrintFormatter<format_impl>::print((
# 4885 "script-fun.cpp" 3 4
stdout
# 4885 "script-fun.cpp"
), (builtin_functions[st->stack->stack_datav[st->start].get_if<ScriptDataFuncRef>()->numi].name)); }); } else { ({ struct format_impl { constexpr static FormatString print_format() __asm__("_print_format") { return "script:%s: " "STRPRINTF(\"no such npc: '%s'\"_fmt, npc)" " (no npc)\n"_fmt; } }; cxxstdio::PrintFormatter<format_impl>::print((
# 4885 "script-fun.cpp" 3 4
stdout
# 4885 "script-fun.cpp"
), (builtin_functions[st->stack->stack_datav[st->start].get_if<ScriptDataFuncRef>()->numi].name)); }); } } else { ({ struct format_impl { constexpr static FormatString print_format() __asm__("_print_format") { return "script:%s: " "STRPRINTF(\"no such npc: '%s'\"_fmt, npc)" " (no npc)\n"_fmt; } }; cxxstdio::PrintFormatter<format_impl>::print((
# 4885 "script-fun.cpp" 3 4
stdout
# 4885 "script-fun.cpp"
), (builtin_functions[st->stack->stack_datav[st->start].get_if<ScriptDataFuncRef>()->numi].name)); }); } st->state = ScriptEndState::END; return; };
```
Note the string literal: `"STRPRINTF(\"no such npc: '%s'\"_fmt, npc)"`.
`script_nullpo_end` currently can't take as its argument for `error` any
expression which, when stringified, contains something which `printf` will
interpret as its formatter expecting another argument.
This appears to have been broken since it was first introduced in
https://git.themanaworld.org/legacy/tmwa/-/commit/594eafd4f231a897cbefd
since the first revision implicitly had these requirements, and also
introduced usage which didn't meet them.
This rewrites each PRINTF line in `script_nullpo_end` from the template
```cpp
PRINTF("script:%s: " #error " @ %s\n"_fmt, BUILTIN_NAME(), nullpo_nd->name);
```
to something like
```cpp
PRINTF("script:%s: %s @ %s\n"_fmt, BUILTIN_NAME(), error, nullpo_nd->name);
```
This means that instead of an expression being stringified, error is
interpreted as an expression that resolves (or decays) to a string.
This seems consistent with all current usage of `script_nullpo_end`.
|