Initial commit

This commit is contained in:
Alexander Yakovlev 2014-07-23 22:34:34 +07:00
commit 7ada2bb9cc
7 changed files with 2737 additions and 0 deletions

3
Makefile Normal file
View File

@ -0,0 +1,3 @@
all:
lessc style.less >style.css
coffee -c js/game.coffee

2
README.md Normal file
View File

@ -0,0 +1,2 @@
# Муравейник
Короткая игра на Undum 2. Пока что больше proof of concept.

77
index.html Normal file
View File

@ -0,0 +1,77 @@
<!DOCTYPE HTML>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Цветок</title>
<link media="screen" rel="stylesheet" href="style.css">
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<link href='http://fonts.googleapis.com/css?family=Marmelad|Russo+One&subset=latin,cyrillic' rel='stylesheet' type='text/css'>
</head>
<body>
<div id="page">
<div id="mid_panel">
<div id="buffer"></div>
<div id="title">
<div class="label">
<h1>Цветок</h1>
<noscript><p class="noscript_message">Эта игра требует включённого Javascript.</p></noscript>
</div>
</div>
<div id="content_wrapper">
<div id="content">
</div>
<a name="end_of_content"></a>
</div>
<div id="legal">
<p>Автор игры &mdash; <a href="https://oreolek.ru">Oreolek.</a> Для игры требуется активное подключение к сети Интернет.</p>
<p>Содержимое, дизайн выпущены под лицензией CC-BY-SA. Игра использует код и дизайн Scio, а также движок <a href="undum.com">Undum.</a></p>
</div>
</div>
</div> <!-- End of div.page -->
<!-- Holds UI elements that will be cloned and placed in the main
page. This block itself is always hidden. -->
<div id="ui_library">
<div id="quality" class="quality">
<span class="name" data-attr="name"></span>
<span class="value" data-attr="value"></span>
</div>
<div id="quality_group" class="quality_group">
<h2 data-attr="title"></h2>
<div class="qualities_in_group">
</div>
</div>
<div id="progress_bar" class="progress_bar">
<span class="name" data-attr="name"></span>
<span class="value" data-attr="value"></span>
<div class="progress_bar_track">
<div class="progress_bar_color" data-attr="width">
</div>
</div>
<span class="left_label" data-attr="left_label"></span>
<span class="right_label" data-attr="right_label"></span>
</div>
<hr id="turn_separator">
</div>
<div id="content_library">
</div>
<script src="https://cdn.jsdelivr.net/showdown/0.3.1/showdown.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/hyphenator/4.2.0/hyphenator.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/hyphenator/4.2.0/patterns/ru.js"></script>
<script type="text/javascript" src="js/undum.js"></script>
<script type="text/javascript" src="js/game.js"></script>
<script type="text/javascript">
Hyphenator.config({
minwordlength : 4
});
Hyphenator.run();
$('#buffer').css("margin", ($(window).height()-$('#title').outerHeight())/2+"px" );
</script>
</body>
</html>

71
js/game.coffee Normal file
View File

@ -0,0 +1,71 @@
converter = new Showdown.converter()
undum.game.id = "7f7e611e-1276-11e4-beaf-afabc89d7876"
undum.game.version = "1.0"
undum.game.situations =
start: new undum.SimpleSituation(
converter.makeHtml("""
Солнечный день, горная деревня. Маленький мальчик по имени Вова собирает букет цветов для мамы.
"""),
{
choices: "#flowers",
optionText: "Какой цветок он добавит к букету?"
}
),
cornflower: new undum.SimpleSituation(
converter.makeHtml("""
Вася наклоняется и срывает фиолетовый цветочек. Мама любит васильки.
"""),
{
tags: ["flowers"],
optionText: "Василёк"
enter: (character, system, from) ->
character.qualities.chose_flowers = character.qualities.chose_flowers + 1
if character.qualities.chose_flowers > 2
system.setQuality("flower_chosen", "cornflower")
system.doLink("tourist")
}
),
camomile: new undum.SimpleSituation(
converter.makeHtml("""
Вася наклоняется и срывает фиолетовый цветочек. Мама любит васильки.
"""),
{
tags: ["flowers"],
optionText: "Ромашка"
enter: (character, system, from) ->
character.qualities.chose_flowers = character.qualities.chose_flowers + 1
if character.qualities.chose_flowers > 2
system.setQuality("flower_chosen", "camomile")
system.doLink("tourist")
}
),
dandelion: new undum.SimpleSituation(
converter.makeHtml("""
Жёлтый одуванчик &mdash; ничего необычного, но он сделает букетик ярче.
"""),
{
tags: ["flowers"],
optionText: "Одуванчик"
enter: (character, system, from) ->
character.qualities.chose_flowers = character.qualities.chose_flowers + 1
if character.qualities.chose_flowers > 2
system.setQuality("flower_chosen", "dandelion")
system.doLink("tourist")
}
),
tourist: new undum.SimpleSituation(
converter.makeHtml("""
Но прежде чем Вова закончит букетик, я должен рассказать про другого героя.
На вершине высокой горы стоит альпинист. Он смотрит на облака, на горы, на горизонт, на деревню внизу.
""")
),
undum.game.init = (character, system) ->
character.qualities.chose_flowers = 0
character.qualities.flower_chosen = ""

25
js/lang/ru.js Normal file
View File

@ -0,0 +1,25 @@
/* This a language file. It contains ALL the strings of the Undum core. And
* so separates the translation from the implementation. If you want to
* translate Undum to another language, use this file as a basis. - Oreolek
*/
undum.language["ru"] = {
terrible: "ужасно",
poor: "бедно",
mediocre: "средне",
fair: "нормально",
good: "хорошо",
great: "прекрасно",
superb: "идеально",
yes: "да",
no: "нет",
no_group_definition: "Невозможно найти определение группы {id}.",
link_not_valid: "Ссылка '{link}' не выглядит правильной.",
link_no_action: "Ссылка с ситуацией '.' должна иметь действие.",
unknown_situation: "Вы не можете переместиться в неизвестную ситуацию {id}.",
erase_message: "Это навсегда удалит вашего персонажа и немедленно вернёт вас к началу игры. Вы уверены?",
no_current_situation: "Я не могу отобразить, потому что у нас нет текущей ситуации.",
no_local_storage: "Локальное хранилище недоступно.",
random_seed_error: "Вы должны задать верное случайное зерно.",
random_error: "Проинициализируйте Random с непустым зерном перед использованием.",
dice_string_error: "не могу интерпретировать вашу строку кубиков: '{string}'."
};

2216
js/undum.js Normal file

File diff suppressed because it is too large Load Diff

343
style.less Normal file
View File

@ -0,0 +1,343 @@
body {
background: lightblue;
color: black;
font-family: 'Marmelad', 'Open Sans', sans-serif;
font-size: 18px;
line-height: 1.6em;
background-attachment: fixed;
overflow-y: scroll;
}
/* Basic structure */
#page {
margin: 0 auto;
position: relative;
}
#mid_panel {
margin: 0 auto;
}
/* The title block */
#title, #title .label, #content, .tools {
border-radius: 2px;
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
}
#title {
max-width: 28em;
margin: 2.2em auto 1.1em auto;
padding: 1.7em;
border: 1.1em solid rgba(0,0,0,0.25);
cursor: pointer; /* Until we click to start. */
.label {
overflow: hidden;
padding: 2.0em;
padding-left: 0.5em;
padding-right: 0.5em;
margin: auto;
max-width: 30em;
position: relative;
}
h1 {
margin: 0;
font-family: 'Russo One', cursive;
font-size: 1.6em;
line-height: 1.4em;
letter-spacing: 0.2em;
text-shadow: rgba(255,255,255,0.25) 1px 1px 2px;
color: #80806b;
}
h2 {
font-size: 0.74em;
font-weight: normal;
text-align: center;
}
#dynamicsub {
margin: 0;
margin-bottom: -2em;
}
#staticsub {
bottom: 0;
right: 3.4em;
position: absolute;
}
h3 {
font-size: 1.0em;
font-weight: normal;
text-align: center;
margin: 1.1em 0 0 0;
}
.noscript_message {
left: 0;
right: 0;
bottom: 0;
position: absolute;
font-size: 0.9em;
font-style: italic;
text-align: center;
color: #943;
}
}
/* Main content */
#content_wrapper {
max-width: 975px;
position: relative;
background: #060606;
background-color: rgba(0,0,0,0.25);
margin: 0.6em auto 1.1em auto;
padding: 2.8em;
display: none; /* Shown by Javascript */
overflow: auto;
}
span.drop + p {
text-indent: -0.4em;
}
p {
margin: 0;
padding-bottom: 0.2em;
}
hr {
border: none;
background-color: #0a0a0b;
width: 1.1em;
height: 1.1em;
margin-left: -3.2em;
position: absolute;
}
br + * {
text-indent: 1.6em;
}
p + p, p + img + p, p + hr + p {
text-indent: 1.6em;
}
ul {
margin: 0;
padding: 0 0 0 1em;
&.options {
border: 2px solid #876;
padding: 0;
margin-bottom: 0.7em;
list-style-type: none;
border-radius: 4px;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
li {
border-bottom: 1px solid #876;
padding: 0.5em;
}
}
}
ul.options li:hover {
background-color: rgba(153,136,119,0.2);
cursor: pointer;
}
ul.options li:last-child {
border-bottom: none;
}
h1 {
font-size: 1.0em;
text-transform: uppercase;
letter-spacing: 2px;
margin: 2.3em 0 1.1em 0;
color: #654;
text-align: center;
}
h1:first-child {
margin-top: 0;
}
a {
color: #900;
text-decoration: none;
border-bottom: 1px solid transparent;
&:hover {
border-bottom: 1px dotted #900;
}
}
img.float_right {
float: right;
margin: 1.1em 0 1.1em 1.1em;
}
img.float_left {
float: left;
margin: 1.1em 1.1em 1.1em 0;
}
img.float_center {
float: center;
width: 100%;
}
#toolbar {
display: none;
}
#tools_wrapper {
position: fixed;
max-width: 56em;
top: 2.2em;
left: 0.4em;
right: 0.4em;
margin: 0 auto;
display: none; /* Shown by Javascript */
}
#info_panel, #character_panel {
display: none;
}
.tools {
padding: 0.6em;
width: 8.9em;
background: #cec3ae url("../img/tools_bg.jpg") repeat left top;
position: absolute;
}
.tools p {
font-size: 0.95em;
line-height: 1.5em;
}
.tools.left {
left: 0;
}
.tools.right {
right: 0;
}
.tools h1 {
font-size: 1.0em;
font-weight: normal;
border-bottom: 1px solid #321;
margin-bottom: 0.6em;
}
.buttons {
padding-top: 0.6em;
margin-top: 0.6em;
border-top: 1px solid #321;
text-align: center;
}
.buttons button {
font-size: 0.8em;
background: #876;
color: #e6e6c6;
border: none;
padding: 0.3em 1.0em;
cursor: pointer;
border-radius: 4px;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}
.buttons button:hover {
background: #987;
}
.buttons button + button {
margin-left: 0.3em;
}
.buttons button[disabled], .buttons button[disabled]:hover {
background: #ba9;
color: #dcb;
cursor: default;
}
#legal {
max-width: 33em;
color: #654;
margin: 1em auto 0 auto;
padding-bottom: 2.2em;
display: none; /* Shown by Javascript */
}
#legal p {
font-size: 0.7em;
line-height: 1.3em;
margin-bottom: 0.5em;
}
#legal p + p {
text-indent: 0;
}
#character {
font-size: 1.0em;
line-height: 1.4em;
}
#qualities .quality, #character_text {
position: relative;
clear: both;
overflow: hidden;
margin: 0 -0.25em;
padding: 0 0.25em;
}
#character_text {
margin-bottom: 0.6em;
}
#character_text_content {
position: relative;
z-index: 100;
}
#qualities span {
position: relative;
z-index: 100;
}
#qualities span.name {
float: left;
}
#qualities span.value {
float: right;
}
.highlight {
background: rgba(255, 255, 0, 0.75);
position: absolute;
left: -4px;
right: -4px;
top: 0;
bottom: 0;
}
#qualities h2 {
margin: 0.5em 0 0.25em 0;
font-size: 1.0em;
border-bottom: 1px solid #321;
}
.progress_bar {
position: relative;
overflow: hidden;
margin: 0.6em 0;
}
.progress_bar_track {
z-index: 100;
background: rgba(255,255,255,0.25);
border: 2px solid #876;
height: 0.75em;
width: 27.7em;
clear: both;
border-radius: 4px;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}
.progress_bar_color {
background: #987;
width: 0;
height: 0.75em;
}
.progress_bar span {
z-index: 100;
}
.progress_bar .name {
font-weight: bold;
}
.progress_bar .value {
float: right;
}
.progress_bar .left_label {
float: left;
}
.progress_bar .right_label {
float: right;
}
#content_library, #ui_library {
display: none;
}
#menu {
display: none;
}
#content {
font-size: 0.9em;
}