summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/lang.txt45
-rw-r--r--lib/VNDB/DB/Chars.pm42
-rw-r--r--lib/VNDB/Handler/Chars.pm60
-rw-r--r--util/sql/func.sql6
-rw-r--r--util/updates/update_2.19.sql9
5 files changed, 141 insertions, 21 deletions
diff --git a/data/lang.txt b/data/lang.txt
index 34213637..5f0e28c9 100644
--- a/data/lang.txt
+++ b/data/lang.txt
@@ -1230,6 +1230,37 @@ hu*:
nl : Beide
+# Character roles
+
+:_charrole_main
+en : Protagonist
+ru*:
+cs*:
+hu*:
+nl :
+
+:_charrole_primary
+en : Primary character
+ru*:
+cs*:
+hu*:
+nl : Belangrijke rol
+
+:_charrole_side
+en : Side character
+ru*:
+cs*:
+hu*:
+nl : Onbelangrijke rol
+
+:_charrole_appears
+en : Makes an appearance
+ru*:
+cs*:
+hu*:
+nl : Figurant
+
+
#############################################################################
@@ -4913,6 +4944,13 @@ cs*:
hu*:
nl : Kenmerken
+:_revfield_c_vns
+en : Visual novels
+ru*:
+cs*:
+hu*:
+nl :
+
:_chdiff_image_proc
en : ~[processing~]
ru : ~[обработка~]
@@ -5222,6 +5260,13 @@ cs*:
hu*:
nl : Nog geen kenmerken aanwezig.
+:_chare_vns
+en : Visual novels
+ru*:
+cs*:
+hu*:
+nl :
+
diff --git a/lib/VNDB/DB/Chars.pm b/lib/VNDB/DB/Chars.pm
index c5c16932..03771132 100644
--- a/lib/VNDB/DB/Chars.pm
+++ b/lib/VNDB/DB/Chars.pm
@@ -9,7 +9,7 @@ our @EXPORT = qw|dbCharGet dbCharRevisionInsert dbCharImageId|;
# options: id rev traitspoil trait_inc trait_exc what results page
-# what: extended traits changes
+# what: extended traits vns changes
sub dbCharGet {
my $self = shift;
my %o = (
@@ -48,27 +48,41 @@ sub dbCharGet {
join(', ', @select), join(' ', @join), \%where
);
- if(@$r && $o{what} =~ /traits/) {
+ if(@$r && $o{what} =~ /(vns|traits)/) {
my %r = map {
$_->{traits} = [];
- ($_->{cid}, $_->{traits})
+ $_->{vns} = [];
+ ($_->{cid}, $_)
} @$r;
- push @{$r{ delete $_->{cid} }}, $_ for (@{$self->dbAll(q|
- SELECT ct.cid, ct.tid, ct.spoil, t.name, t."group", tg.name AS groupname
- FROM chars_traits ct
- JOIN traits t ON t.id = ct.tid
- LEFT JOIN traits tg ON tg.id = t."group"
- WHERE cid IN(!l)|, [ keys %r ]
- )});
+ if($o{what} =~ /traits/) {
+ push @{$r{ delete $_->{cid} }{traits}}, $_ for (@{$self->dbAll(q|
+ SELECT ct.cid, ct.tid, ct.spoil, t.name, t."group", tg.name AS groupname
+ FROM chars_traits ct
+ JOIN traits t ON t.id = ct.tid
+ LEFT JOIN traits tg ON tg.id = t."group"
+ WHERE cid IN(!l)|, [ keys %r ]
+ )});
+ }
+
+ if($o{what} =~ /vns/) {
+ push @{$r{ delete $_->{cid} }{vns}}, $_ for (@{$self->dbAll(q|
+ SELECT cv.cid, cv.vid, cv.rid, cv.spoil, cv.role, vr.title AS vntitle, rr.title AS rtitle
+ FROM chars_vns cv
+ JOIN vn v ON cv.vid = v.id
+ JOIN vn_rev vr ON vr.id = v.latest
+ LEFT JOIN releases r ON cv.rid = r.id
+ LEFT JOIN releases_rev rr ON rr.id = r.latest
+ WHERE cv.cid IN(!l)|, [ keys %r ]
+ )});
+ }
}
-
return wantarray ? ($r, $np) : $r;
}
# Updates the edit_* tables, used from dbItemEdit()
-# Arguments: { columns in chars_rev + traits },
+# Arguments: { columns in chars_rev + traits + vns },
sub dbCharRevisionInsert {
my($self, $o) = @_;
@@ -80,6 +94,10 @@ sub dbCharRevisionInsert {
$self->dbExec('DELETE FROM edit_char_traits');
$self->dbExec('INSERT INTO edit_char_traits (tid, spoil) VALUES (?,?)', $_->[0],$_->[1]) for (@{$o->{traits}});
}
+ if($o->{vns}) {
+ $self->dbExec('DELETE FROM edit_char_vns');
+ $self->dbExec('INSERT INTO edit_char_vns (vid, rid, spoil, role) VALUES(!l)', $_) for (@{$o->{vns}});
+ }
}
diff --git a/lib/VNDB/Handler/Chars.pm b/lib/VNDB/Handler/Chars.pm
index 5a6d2e0e..ef15b823 100644
--- a/lib/VNDB/Handler/Chars.pm
+++ b/lib/VNDB/Handler/Chars.pm
@@ -19,7 +19,7 @@ sub page {
my $r = $self->dbCharGet(
id => $id,
- what => 'extended traits'.($rev ? ' changes' : ''),
+ what => 'extended traits vns'.($rev ? ' changes' : ''),
$rev ? ( rev => $rev ) : ()
)->[0];
return $self->resNotFound if !$r->{id};
@@ -29,7 +29,7 @@ sub page {
return if $self->htmlHiddenMessage('c', $r);
if($rev) {
- my $prev = $rev && $rev > 1 && $self->dbCharGet(id => $id, rev => $rev-1, what => 'changes extended traits')->[0];
+ my $prev = $rev && $rev > 1 && $self->dbCharGet(id => $id, rev => $rev-1, what => 'changes extended traits vns')->[0];
$self->htmlRevision('c', $prev, $r,
[ name => diff => 1 ],
[ original => diff => 1 ],
@@ -53,6 +53,11 @@ sub page {
$_->{tid}, $_->{name}, mt("_spoil_$_->{spoil}")),
sort { ($a->{groupname}||$a->{name}) cmp ($b->{groupname}||$b->{name}) || $a->{name} cmp $b->{name} } @{$_[0]}
}],
+ [ vns => join => '<br />', split => sub {
+ map sprintf('<a href="/v%d">v%d</a> %s %s (%s)', $_->{vid}, $_->{vid},
+ $_->{rid}?sprintf('[<a href="/r%d">r%d</a>]', $_->{rid}, $_->{rid}):'',
+ mt("_charrole_$_->{role}"), mt("_spoil_$_->{spoil}")), @{$_[0]};
+ }],
);
}
@@ -130,6 +135,42 @@ sub page {
end;
}
+ # vns
+ # TODO: handle spoilers!
+ if(@{$r->{vns}}) {
+ my %vns;
+ push @{$vns{$_->{vid}}}, $_ for(sort { !defined($a->{rid})?1:!defined($b->{rid})?-1:$a->{rtitle} cmp $b->{rtitle} } @{$r->{vns}});
+ Tr ++$i % 2 ? (class => 'odd') : ();
+ td class => 'key', 'Visual novels';
+ td;
+ my $first = 0;
+ for my $g (sort { $vns{$a}[0]{vntitle} cmp $vns{$b}[0]{vntitle} } keys %vns) {
+ br if $first++;
+ my @r = @{$vns{$g}};
+ # special case: all releases, no exceptions
+ if(@r == 1 && !$r[0]{rid}) {
+ txt mt("_charrole_$r[0]{role}").' - ';
+ a href => "/v$r[0]{vid}", $r[0]{vntitle};
+ next;
+ }
+ # otherwise, print VN title and list releases separately
+ a href => "/v$r[0]{vid}", $r[0]{vntitle};
+ for(@r) {
+ br;
+ b class => 'grayedout', '> ';
+ txt mt("_charrole_$_->{role}").' - ';
+ if($_->{rid}) {
+ b class => 'grayedout', "r$_->{rid}:";
+ a href => "/r$_->{rid}", $_->{rtitle};
+ } else {
+ txt 'All other releases';
+ }
+ }
+ }
+ end;
+ end;
+ }
+
# description
if($r->{desc}) {
Tr;
@@ -156,7 +197,7 @@ sub page {
sub edit {
my($self, $id, $rev) = @_;
- my $r = $id && $self->dbCharGet(id => $id, what => 'changes extended traits', $rev ? (rev => $rev) : ())->[0];
+ my $r = $id && $self->dbCharGet(id => $id, what => 'changes extended vns traits', $rev ? (rev => $rev) : ())->[0];
return $self->resNotFound if $id && !$r->{id};
$rev = undef if !$r || $r->{cid} == $r->{latest};
@@ -166,7 +207,9 @@ sub edit {
my %b4 = !$id ? () : (
(map +($_ => $r->{$_}), qw|name original alias desc image ihid ilock s_bust s_waist s_hip height weight bloodt gender|),
bday => $r->{b_month} ? sprintf('%02d-%02d', $r->{b_month}, $r->{b_day}) : '',
- traits => join(' ', map sprintf('%d-%d', $_->{tid}, $_->{spoil}), @{$r->{traits}}),
+ traits => join(' ', map sprintf('%d-%d', $_->{tid}, $_->{spoil}), sort { $a->{tid} <=> $b->{tid} } @{$r->{traits}}),
+ vns => join(' ', map sprintf('%d-%d-%d-%s', $_->{vid}, $_->{rid}||0, $_->{spoil}, $_->{role}),
+ sort { $a->{vid} <=> $b->{vid} || ($a->{rid}||0) <=> ($b->{rid}||0) } @{$r->{vns}}),
);
my $frm;
@@ -187,6 +230,7 @@ sub edit {
{ post => 'weight', required => 0, default => 0, template => 'int' },
{ post => 'bloodt', required => 0, default => 'unknown', enum => $self->{blood_types} },
{ post => 'traits', required => 0, default => '', regex => [ qr/^(?:[1-9]\d*-[0-2])(?: +[1-9]\d*-[0-2])*$/, 'Incorrect trait format.' ] },
+ { post => 'vns', required => 0, default => '', regex => [ qr/^(?:[1-9]\d*-\d+-[0-2]-[a-z]+)(?: +[1-9]\d*-\d+-[0-2]-[a-z]+)*$/, 'Incorrect VN format.' ] },
{ post => 'editsum', required => 0, maxlength => 5000 },
{ post => 'ihid', required => 0 },
{ post => 'ilock', required => 0 },
@@ -199,7 +243,9 @@ sub edit {
if(!$frm->{_err}) {
# parse and normalize
my @traits = sort { $a->[0] <=> $b->[0] } map /^(\d+)-(\d+)$/&&[$1,$2], split / /, $frm->{traits};
+ my @vns = sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] } map [split /-/], split / /, $frm->{vns};
$frm->{traits} = join(' ', map sprintf('%d-%d', @$_), @traits);
+ $frm->{vns} = join(' ', map sprintf('%d-%d-%d-%s', @$_), @vns);
$frm->{ihid} = $frm->{ihid} ?1:0;
$frm->{ilock} = $frm->{ilock}?1:0;
@@ -210,6 +256,8 @@ sub edit {
# modify for dbCharRevisionInsert
($frm->{b_month}, $frm->{b_day}) = delete($frm->{bday}) =~ /^(\d{2})-(\d{2})$/ ? ($1, $2) : (0, 0);
$frm->{traits} = \@traits;
+ $_->[1]||=undef for (@vns);
+ $frm->{vns} = \@vns;
my $nrev = $self->dbItemEdit(c => $id ? $r->{cid} : undef, %$frm);
@@ -279,6 +327,10 @@ sub edit {
td colspan => 2, '';
end; end 'table';
}],
+ ],
+
+ chare_vns => [ mt('_chare_vns'),
+ [ input => short => 'vns', name => 'VNs (debug)' ],
]);
$self->htmlFooter;
}
diff --git a/util/sql/func.sql b/util/sql/func.sql
index 6ae0312b..5a43ae0f 100644
--- a/util/sql/func.sql
+++ b/util/sql/func.sql
@@ -415,8 +415,10 @@ BEGIN
ALTER TABLE edit_char DROP COLUMN cid;
CREATE TEMPORARY TABLE edit_char_traits (LIKE chars_traits INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
ALTER TABLE edit_char_traits DROP COLUMN cid;
+ CREATE TEMPORARY TABLE edit_char_vns (LIKE chars_vns INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
+ ALTER TABLE edit_char_vns DROP COLUMN cid;
EXCEPTION WHEN duplicate_table THEN
- TRUNCATE edit_char, edit_char_traits;
+ TRUNCATE edit_char, edit_char_traits, edit_char_vns;
END;
PERFORM edit_revtable('c', hid);
-- new char
@@ -426,6 +428,7 @@ BEGIN
ELSE
INSERT INTO edit_char SELECT name, original, alias, image, "desc", gender, s_bust, s_waist, s_hip, b_month, b_day, height, weight, bloodt FROM chars_rev WHERE id = hid;
INSERT INTO edit_char_traits SELECT tid, spoil FROM chars_traits WHERE cid = hid;
+ INSERT INTO edit_char_vns SELECT vid, rid, spoil, role FROM chars_vns WHERE cid = hid;
END IF;
END;
$$ LANGUAGE plpgsql;
@@ -442,6 +445,7 @@ BEGIN
SELECT INTO r * FROM edit_commit();
INSERT INTO chars_rev SELECT r.cid, r.iid, name, original, alias, image, "desc", gender, s_bust, s_waist, s_hip, b_month, b_day, height, weight, bloodt FROM edit_char;
INSERT INTO chars_traits SELECT r.cid, tid, spoil FROM edit_char_traits;
+ INSERT INTO chars_vns SELECT r.cid, vid, rid, spoil, role FROM edit_char_vns;
UPDATE chars SET latest = r.cid WHERE id = r.iid;
RETURN r;
END;
diff --git a/util/updates/update_2.19.sql b/util/updates/update_2.19.sql
index c8fb1119..bc1b5afe 100644
--- a/util/updates/update_2.19.sql
+++ b/util/updates/update_2.19.sql
@@ -73,11 +73,12 @@ CREATE TABLE chars_traits (
CREATE TABLE chars_vns (
cid integer NOT NULL REFERENCES chars_rev (id),
vid integer NOT NULL REFERENCES vn (id),
- rid integer REFERENCES releases (id),
- spoil boolean NOT NULL DEFAULT false,
- role char_role NOT NULL DEFAULT 'main',
- PRIMARY KEY(cid, vid, rid)
+ rid integer NULL REFERENCES releases (id),
+ spoil smallint NOT NULL DEFAULT 0,
+ role char_role NOT NULL DEFAULT 'main'
);
+-- primary key won't work when one column allows NULL
+CREATE UNIQUE INDEX chars_vns_pkey ON chars_vns (cid, vid, COALESCE(rid, 0));
-- cache table
CREATE TABLE traits_chars (