Skip to content

Commit

Permalink
Merge pull request #28 from Attnam/master
Browse files Browse the repository at this point in the history
(ready) Fantasy name generator (Attnam#363)
  • Loading branch information
AquariusPower authored May 31, 2018
2 parents 9979cf8 + 2eebbb3 commit 8714ec6
Show file tree
Hide file tree
Showing 13 changed files with 968 additions and 4 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,4 @@ add_subdirectory(Main)
add_subdirectory(igor)
add_subdirectory(mihail)
add_subdirectory(xbrzscale)
add_subdirectory(fantasyname)
4 changes: 2 additions & 2 deletions Main/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ set_source_files_properties(
PROPERTIES HEADER_FILE_ONLY TRUE)

add_executable(ivan ${IVAN_SOURCES} Resource/Ivan.rc)
target_include_directories(ivan PUBLIC Include ../Felib/Include ../audio)
target_link_libraries(ivan FeLib FeAudio SDL2_mixer pcre xbrzscale)
target_include_directories(ivan PUBLIC Include ../Felib/Include ../audio ../fantasyname)
target_link_libraries(ivan FeLib FeAudio SDL2_mixer pcre xbrzscale fantasyname)

if(UNIX)
install(TARGETS ivan DESTINATION "${CMAKE_INSTALL_BINDIR}")
Expand Down
2 changes: 1 addition & 1 deletion Main/Include/game.h
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ class game
static void CalculateGodNumber();
static void IncreaseTick() { ++Tick; }
static ulong GetTick() { return Tick; }
static festring GetAutoSaveFileName() { return game::GetSaveDir() + PlayerName + ".AutoSave"; }
static festring GetAutoSaveFileName() { return SaveName() + ".AutoSave"; }
static int DirectionQuestion(cfestring&, truth = true, truth = false);
static void RemoveSaves(truth = true,truth onlyBackups=false);
static truth IsInWilderness() { return InWilderness; }
Expand Down
3 changes: 3 additions & 0 deletions Main/Include/iconf.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class ivanconfig
{
public:
static cfestring& GetDefaultName() { return DefaultName.Value; }
static cfestring& GetFantasyNamePattern() { return FantasyNamePattern.Value; }
static cfestring& GetDefaultPetName() { return DefaultPetName.Value; }
static long GetAutoSaveInterval() { return AutoSaveInterval.Value; }
static long GetContrast() { return Contrast.Value; }
Expand Down Expand Up @@ -94,6 +95,7 @@ class ivanconfig
static void ContrastDisplayer(const numberoption*, festring&);
static void DirectionKeyMapDisplayer(const cycleoption*, festring&);
static truth DefaultNameChangeInterface(stringoption*);
static truth FantasyNameChangeInterface(stringoption* O);
static truth DefaultPetNameChangeInterface(stringoption*);
static truth AutoSaveIntervalChangeInterface(numberoption*);
static truth XBRZSquaresAroundPlayerChangeInterface(numberoption* O);
Expand Down Expand Up @@ -143,6 +145,7 @@ class ivanconfig
static void BackGroundDrawer();

static stringoption DefaultName;
static stringoption FantasyNamePattern;
static stringoption DefaultPetName;
static numberoption AutoSaveInterval;
static truthoption AltAdentureInfo;
Expand Down
12 changes: 11 additions & 1 deletion Main/Source/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
#include "team.h"
#include "whandler.h"
#include "wsquare.h"
#include "namegen.h"

#define DBGMSG_BLITDATA
#include "dbgmsgproj.h"
Expand Down Expand Up @@ -619,14 +620,23 @@ void game::PrepareStretchRegionsLazy(){ // the ADD order IS important IF they ov
UpdateSRegionsXBRZ();
}

void FantasyName(festring& rfsName){ DBG2(rfsName.CStr(),ivanconfig::GetFantasyNamePattern().CStr());
if(ivanconfig::GetFantasyNamePattern().IsEmpty())return;

NameGen::Generator gen(ivanconfig::GetFantasyNamePattern().CStr());
rfsName << gen.toString().c_str(); DBG1(rfsName.CStr());
}

truth game::Init(cfestring& Name)
{
{ DBG2(Name.CStr(),ivanconfig::GetDefaultName().CStr());
if(Name.IsEmpty())
{
if(ivanconfig::GetDefaultName().IsEmpty())
{
PlayerName.Empty();

FantasyName(PlayerName); DBG1(PlayerName.CStr());

if(iosystem::StringQuestion(PlayerName, CONST_S("What is your name? (1-20 letters)"),
v2(30, 46), WHITE, 1, 20, true, true) == ABORTED
|| PlayerName.IsEmpty())
Expand Down
19 changes: 19 additions & 0 deletions Main/Source/iconf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ stringoption ivanconfig::DefaultName( "DefaultName",
"",
&configsystem::NormalStringDisplayer,
&DefaultNameChangeInterface);
stringoption ivanconfig::FantasyNamePattern("FantasyNamePattern",
"fantasy name generator pattern",
"!ss !sV",
&configsystem::NormalStringDisplayer,
&FantasyNameChangeInterface);
stringoption ivanconfig::DefaultPetName( "DefaultPetName",
"starting pet's default name",
CONST_S("Kenny"),
Expand Down Expand Up @@ -433,6 +438,19 @@ truth ivanconfig::DungeonGfxScaleChangeInterface(cycleoption* O)
return true;
}

truth ivanconfig::FantasyNameChangeInterface(stringoption* O)
{
festring String;

if(iosystem::StringQuestion(String, CONST_S("Set name generator pattern (recommended \"!ss !sV\"):"),
GetQuestionPos(), WHITE, 0, 20, !game::IsRunning(), true) == NORMAL_EXIT)
O->ChangeValue(String);

clearToBackgroundAfterChangeInterface();

return false;
}

truth ivanconfig::DefaultNameChangeInterface(stringoption* O)
{
festring String;
Expand Down Expand Up @@ -762,6 +780,7 @@ void ivanconfig::Initialize()

fsCategory="Core Game Setup";
configsystem::AddOption(fsCategory,&DefaultName);
configsystem::AddOption(fsCategory,&FantasyNamePattern);
configsystem::AddOption(fsCategory,&DefaultPetName);
configsystem::AddOption(fsCategory,&AutoSaveInterval);
configsystem::AddOption(fsCategory,&AltAdentureInfo);
Expand Down
5 changes: 5 additions & 0 deletions fantasyname/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
file(GLOB FANTASYNAME_SOURCES namegen.cc namegen.h)

set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")

add_library(fantasyname ${FANTASYNAME_SOURCES})
18 changes: 18 additions & 0 deletions fantasyname/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
.POSIX:
.SUFFIXES: .cc
CXX = c++
CXXFLAGS = -std=c++11 -Wall -Wextra -O3 -g3

all: namegen

namegen: namegen.o example.o
$(CXX) $(LDFLAGS) -o $@ namegen.o example.o $(LDLIBS)

namegen.o: namegen.cc
example.o: example.cc

clean:
rm -rf namegen namegen.o example.o

.cc.o:
$(CXX) -c $(CXXFLAGS) -o $@ $<
47 changes: 47 additions & 0 deletions fantasyname/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Fantasy Name Generator

Four implementations -- JavaScript, C++, Elisp, and Perl -- of the
[name generator described at RinkWorks](http://rinkworks.com/namegen/).
The JavaScript and C++ implementations are by far the most mature.


## JavaScript

The JavaScript version uses an optimizing template-compiler to create
an efficient generator object.

```javascript
var generator = NameGen.compile("sV'i");
generator.toString(); // => "entheu'loaf"
generator.toString(); // => "honi'munch"
```

## C++

The C++ version also uses a template-compiler (based on the one for JavaScript)
to create an efficient generator object. It requires C++11.

```c++
NameGen::Generator generator("sV'i");
generator.toString(); // => "drai'sneeze"
generator.toString(); // => "ardou'bumble"
```
## Emacs Lisp
The Emacs Lisp version doesn't include a parser. It operates on
s-expressions.
```el
(fset 'generator (apply-partially #'namegen '(s V "'" i)))
(generator) ; => "essei'knocker"
(generator) ; => "tiaoe'nit"
```

## Perl

The Perl version is exceptionally slow, due to a slow parser.

```perl
generate("sV'i"); # => "echoi'bum"
```
24 changes: 24 additions & 0 deletions fantasyname/UNLICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.

In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

For more information, please refer to <http://unlicense.org/>
33 changes: 33 additions & 0 deletions fantasyname/example.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#include "namegen.h"

#include <stdio.h>
#include <clocale>
#include <iostream>


int main(int argc, char **argv)
{
int num = 1;
std::setlocale(LC_CTYPE, "");
if (argc < 2 || argc > 3 || (argc == 3 && (num = atoi(argv[2])) && num == -1)) {
std::cerr << "Usage: " << argv[0] << " <pattern> [num]\n";
std::cerr << " pattern - Template for names to generate.\n";
std::cerr << " num - Number of names to generate.\n";
return 64;
}

char * pattern = argv[1];
// std::cerr << "> pattern = " << pattern << "\n";

NameGen::Generator generator(pattern);

std::cerr << "> combinations = " << generator.combinations() << "\n";
// std::cerr << "> min = " << generator.min() << "\n";
// std::cerr << "> max = " << generator.max() << "\n";

for (int i = 0; i < num; i++) {
std::cout << generator.toString() << "\n";
}

return 0;
}
Loading

0 comments on commit 8714ec6

Please sign in to comment.