Генератор персонажей

This commit is contained in:
Alexander Yakovlev 2013-04-28 10:14:20 +07:00
parent 2312976058
commit 24165487cc
6 changed files with 382 additions and 2 deletions

View File

@ -8,7 +8,7 @@
<link rel="stylesheet" href="stylesheets/stylesheet.css" media="screen"/>
<link rel="stylesheet" href="stylesheets/pygment_trac.css"/>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript" src="http://yandex.st/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script>
<script type="text/javascript" src="javascripts/script.js"></script>

11
chargen.html Normal file
View File

@ -0,0 +1,11 @@
---
layout: main
---
<script type="text/javascript" src="javascripts/chargen.js"></script>
<link rel="stylesheet" href="stylesheets/chargen.css"/>
<div id="wrapper_overview">
<div class="group" id="specials"></div>
<div class="group" id="derived"></div>
<div class="group">Осталось отметить навыков: <div id="skills_to_tag"></div></div>
<div id="skills" class="group"></div>
</div>

View File

@ -2,6 +2,9 @@
layout: main
---
# Создание персонажа
Для удобства существует [онлайн-генератор](chargen.html) персонажей 1го уровня.
## Первичные характеристики
Каждая из характеристик может принимать любое значение от 1 до 10 включительно.

177
javascripts/chargen.js Normal file
View File

@ -0,0 +1,177 @@
function parameter(id, name, value) {
if (typeof value === 'undefined') {
value = 5;
}
return {
id: id,
name: name,
value: value,
tagged: false
};
}
function positive(value) {
if (value < 1) return 1;
else return value;
}
var options = {
specials: {
strength: parameter('strength', 'Сила'),
endurance: parameter('endurance', 'Выносливость'),
charisma: parameter('charisma', 'Обаяние'),
intelligence: parameter('intelligence', 'Интеллект'),
agility: parameter('agility', 'Ловкость'),
luck: parameter('luck', 'Удача'),
},
special_points: 5,
skills_to_tag: 3,
derived: [
parameter('action_points','Очки действий', function(specials){
return Math.floor(5 + specials.agility.value * 0.5);
}),
parameter('carry_weight','Максимальный вес, кг', function(specials){
return 6 + specials.strength.value * 10;
}),
parameter('critical_chance','Критический шанс, %', function(specials){
return specials.luck.value;
}),
parameter('hit_points','Очки Здоровья', function(specials){
return 15 + specials.strength.value + specials.endurance.value * 2;
}),
parameter('skill_points','Очки навыков на уровень', function(specials){
return 5 + specials.intelligence.value * 2;
}),
parameter('combat_sequence','Очерёдность в бою', function(specials){
return Math.floor(specials.agility.value + (specials.luck.value + specials.strength.value) * 0.5);
}),
parameter('healing_rate','Скорость лечения', function(specials){
return specials.endurance.value + 6;
}),
parameter('throwing_range','Дальность броска, м', function(specials){
return specials.strength.value + 6;
}),
parameter('poison_resistance','Сопротивление яду, %', function(specials){
return specials.endurance.value * 5;
}),
parameter('armor_class','Базовый класс брони', function(specials){
return specials.agility.value;
}),
parameter('melee_damage','Рукопашный урон', function(specials){
return positive(specials.strength.value - 5);
})
],
skills: [
parameter('guns','Огнестрельное Оружие', function(specials){
return specials.agility.value * 2;
}),
parameter('archery','Стрельба из лука', function(specials){
return 5 + specials.strength.value + specials.agility.value;
}),
parameter('melee','Холодное оружие', function(specials){
return 20 + 2 * (specials.strength.value + specials.agility.value);
}),
parameter('unarmed','Рукопашный бой', function(specials){
return 30 + 2 * (specials.strength.value + specials.agility.value);
}),
parameter('throwing','Метание', function(specials){
return 4 * specials.agility.value;
}),
parameter('lockpick','Взлом', function(specials){
return 10 + specials.agility.value + specials.intelligence.value;
}),
parameter('first_aid','Медицина', function(specials){
return 15 + specials.intelligence.value;
}),
parameter('repair','Ремонт', function(specials){
return 3 * specials.intelligence.value;
}),
parameter('science','Наука', function(specials){
return 4 * specials.intelligence.value;
}),
parameter('stealth','Скрытность', function(specials){
return 3 * specials.agility.value;
}),
parameter('performance','Выступление', function(specials){
return 4 * specials.intelligence.value;
}),
parameter('survival','Выживание', function(specials){
return 2 * (specials.endurance.value + specials.intelligence.value);
}),
parameter('animal_handling','Обращение с животными', function(specials){
return specials.agility.value + specials.strength.value + specials.intelligence.value;
}),
parameter('driving','Вождение', function(specials){
return 2 * (specials.agility.value + specials.endurance.value);
})
]
};
function update_derived() {
var i = 0;
var text = '';
jQuery('#derived').empty();
jQuery('#skills').empty();
for (i = 0; i < options.derived.length; i++) {
value = options.derived[i].value(options.specials);
jQuery('#derived').append('<div class="parameter"><div class="value" id="' + options.derived[i].id + '"> '+ value + ' </div></div><div class="name">' + options.derived[i].name + '</div>');
}
for (i = 0; i < options.skills.length; i++) {
value = options.skills[i].value(options.specials);
if (options.skills[i].tagged) value = value + 15;
text = '<div class="row"><div class="parameter"><div class="value" id="' + options.skills[i].id + '"> '+ value + ' </div></div><div class="name">' + options.skills[i].name + '<input type="checkbox" name="' + i + '"';
if (options.skills[i].tagged) {
text = text + ' checked';
}
text = text + '></div></div>';
jQuery('#skills').append(text);
jQuery('#skills_to_tag').text(options.skills_to_tag);
}
}
jQuery(document).ready(function () {
var i = 0;
objects = ['strength', 'endurance', 'charisma', 'intelligence', 'agility', 'luck'];
for (i = 0; i < objects.length; i++) {
jQuery('#specials').append('<div class="parameter"><a class="decrement" href="#"></a><div class="value" id="' + options.specials[objects[i]].id + '"> '+ options.specials[objects[i]].value + ' </div><a class="increment" href="#">+</a></div><div class="name">' + options.specials[objects[i]].name + '</div>');
}
update_derived();
jQuery('#skills').on('click', 'input[type=checkbox]', function (event) {
if (jQuery(this).is(':checked')) {
if (options.skills_to_tag > 0){
options.skills_to_tag--;
jQuery(this).attr('checked', 'true');
} else {
event.preventDefault();
return false;
}
}
else {
options.skills_to_tag++;
jQuery(this).removeAttr('checked');
}
chosen_skill = jQuery(this).attr('name');
options.skills[chosen_skill].tagged = !options.skills[chosen_skill].tagged;
update_derived();
});
jQuery('#specials .increment').click(function () {
if (options.special_points == 0) return false;
options.special_points--;
for (i = 0; i < objects.length; i++) {
if (options.specials[objects[i]].id == jQuery(this).siblings(".value").attr('id')) {
options.specials[objects[i]].value++;
jQuery(this).siblings(".value").text(' '+options.specials[objects[i]].value+' ');
break;
}
}
update_derived();
});
jQuery('#specials .decrement').click(function () {
options.special_points++;
for (i = 0; i < objects.length; i++) {
if (options.specials[objects[i]].id == jQuery(this).siblings(".value").attr('id')) {
options.specials[objects[i]].value--;
jQuery(this).siblings(".value").text(' '+options.specials[objects[i]].value+' ');
break;
}
}
update_derived();
});
});

186
stylesheets/chargen.css Normal file
View File

@ -0,0 +1,186 @@
/*
Margin, padding, and border resets
except for form elements
*/
body,
div,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
th,
td,
article,
aside,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
margin: 0;
padding: 0;
border: 0;
}
/*
Consistency fixes
adopted from http://necolas.github.com/normalize.css/
*/
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
nav,
section,
audio,
canvas,
video {
display: block;
}
html {
height: 100%;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
body {
min-height: 100%;
font-size: 100%;
}
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
pre {
white-space: pre;
white-space: pre-wrap;
word-wrap: break-word;
}
b,
strong {
font-weight: bold;
}
abbr[title] {
border-bottom: 1px dotted;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
a img,
img {
-ms-interpolation-mode: bicubic;
border: 0;
}
input,
textarea,
button,
select {
margin: 0;
font-size: 100%;
line-height: normal;
vertical-align: baseline;
}
button,
html input[type="button"],
input[type="reset"],
input[type="submit"] {
cursor: pointer;
-webkit-appearance: button;
}
input[type="checkbox"],
input[type="radio"] {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-o-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
textarea {
overflow: auto;
}
#wrapper_overview {
margin: 1em auto;
width: 43.888888888888886em;
}
.group {
margin-top: 18px;
width: 21.666666666666668em;
}
.group .parameter {
width: 3.888888888888889em;
display: inline-block;
}
.group .parameter .value {
display: inline;
}
.group .name {
width: 17.22222222222222em;
display: inline-block;
}
.group .name input {
margin-left: 0.5em;
}
#specials {
float: left;
}
#specials .value,
#skills .value {
text-align: left;
}
#specials .name,
#skills .name {
text-align: right;
}
#derived {
float: right;
}
#derived .value {
text-align: right;
}
#derived .name {
text-align: left;
}
.increment,
.decrement {
visibility: visible;
}
#skills {
/* checkboxes! */
}
/* Colors */
body {
color: #000000;
}
a {
color: #0000ff;
}

View File

@ -578,4 +578,7 @@ footer .owner p a {
.highlight .vc { color: #008080 } /* Name.Variable.Class */
.highlight .vg { color: #008080 } /* Name.Variable.Global */
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
footer, #container:after {
clear: both;
}