Page MenuHomePhabricator (Chris)

No OneTemporary

Size
40 KB
Referenced Files
None
Subscribers
None
This document is not UTF8. It was detected as ISO-8859-1 (Latin 1) and converted to UTF8 for display.
diff --git a/data/script/Fighter.pl b/data/script/Fighter.pl
index 89974dd..5a96db8 100644
--- a/data/script/Fighter.pl
+++ b/data/script/Fighter.pl
@@ -1,805 +1,805 @@
require 'Collision.pl';
require 'DataHelper.pl';
require 'Damage.pl';
package Fighter;
use strict;
=comment
Fighter's members are:
ID int The ID of the fighter
STATS hash Reference to the fighter's stats (includes GENDER)
NAME string The name of the character, e.g. "Ulmar".
FRAMES array The character's frame description.
STATES hash The character's state description.
NUMBER int Player number (either 0 or 1)
X int The fighter's current anchor, horizontal coordinate.
Y int The fighter's current anchor, vertical coordinate.
ST string The name of the fighter's current state.
FR int The number of the fighter's current frame (same as STATES->{ST}->{F}).
DEL int The amount of time before the character moves to the next state.
NEXTST string The name of the next state after this one (calculated by Advance and Event, user by Update).
DIR int -1: the character is facing left; 1: if the character is facing right.
PUSHY int The character's vertical momentum, from jumping/hits.
PUSHX int The character's horizontal momentum, from hits.
HP int Hit points, from 100 down to 0.
IDLE int The amount of game time since the player is ready.
CHECKEHIT int 1 if the hit needs to be checked soon.
DELIVERED int 1 if a hit was delivered in this state.
COMBO int The number of consecutive hits delivered to this fighter.
COMBOHP int The amount of HP delivered in the last combo.
OTHER hash A reference to the other Fighter
new
Reset
Advance
CheckHit
IsHitAt
Event
Update
Needs to be subclassed: Reset, NextState
=cut
sub new {
my ($class) = @_;
my $self = {
'NUMBER'=> 0,
'ST' => 'Start',
'FR' => 0,
'DEL' => 0,
'DIR' => 1,
'PUSHY' => 0,
'PUSHX' => 0,
};
bless $self, $class;
return $self;
}
sub Reset {
my ($self, $fighterenum) = @_;
die "Insufficient parameters." unless defined $self;# and defined $frames and defined $states;
$fighterenum = $self->{ID} unless defined $fighterenum;
my ($number, $stats);
$number = $self->{NUMBER};
$stats = ::GetFighterStats($fighterenum);
die "Couldn't load stats of fighter $fighterenum\n" unless defined $stats;
unless (defined $stats->{STATES})
{
print "ERROR: The fighter $fighterenum is not yet usable.\n";
$self->{OK} = 0;
return;
}
print STDERR "Resetting fighter $number to character $fighterenum\n";
$self->{ID} = $fighterenum;
$self->{STATS} = $stats;
$self->{NAME} = $stats->{NAME};
$self->{FRAMES} = $stats->{FRAMES};
$self->{STATES} = $stats->{STATES};
$self->{X} = (( $number ? 540 : 100 ) << $::GAMEBITS) + $::BgPosition;
$self->{Y} = $::GROUND2;
$self->{ST} = 'Start';
$self->{FR} = $self->GetCurrentState()->{F};
$self->{DEL} = 0;
$self->{DIR} = ($number ? -1 : 1);
$self->{PUSHY} = 0;
$self->{PUSHX} = 0;
$self->{HP} = 100;
$self->{IDLE} = 0;
$self->{CHECKHIT} = 0;
$self->{DELIVERED} = 0;
$self->{COMBO} = 0;
$self->{COMBOHP}= 0;
$self->{OK} = 1;
&{$self->{STATS}->{STARTCODE}}($self);
}
=comment
Advance should be called once every game tick. It advances the fighter,
preparing his variables for drawing him in the next tick. Advance also
processes the input if it is appropriate to do so in the current state.
Advance prepares the NEXTST attribute of the player. It does not modify
the current ST yet, because that may depend on hits, event, etc. Advance
should be followed by CheckHit and Event calls, and finally Update.
=cut
sub Advance {
my ($self, $in) = @_;
my ($stname, # The name of the current state.
$st, # The descriptor of the current state.
$move, # The move associated with the current state.
$i, $j, # temp var.
@body ); # collision detection
$self->{NEXTST} = '';
$stname = $self->{ST};
$st = $self->{'STATES'}->{$stname};
# 1. DECREMENT 'DEL' PROPERTY
$self->{'DEL'}--;
if ( $st->{SITU} eq 'Ready' )
{
$self->{IDLE} = $self->{IDLE} + 1;
}
else
{
$self->{IDLE} = 0;
}
# 2. UPDATE THE HORIZONTAL POSITION
# 2.1. 'MOVE' PLAYER IF NECESSARY
if ( defined $st->{'MOVE'} )
{
$move = $st->{'MOVE'}*$self->{'DIR'} * 6;
$self->{'X'} += $move;
}
# 2.2. 'PUSH' PLAYER IF NECESSARY
if ( $self->{PUSHX} )
{
$i = ($self->{PUSHX}+7) / 8; # 1/1; syntax highlight..
$self->{X} += $i;
$self->{PUSHX} -= $i if $self->{PUSHY} == 0;
}
# 2.3. MAKE SURE THE TWO FIGHTERS DON'T "WALK" INTO EACH OTHER
if ( $self->{Y} >= $::GROUND2 and
$self->{OTHER}->{Y} >= $::GROUND2 )
{
my ( $centerX, $centerOtherX, $pushDir );
$centerX = $self->GetCenterX;
$centerOtherX = $self->{OTHER}->GetCenterX;
if ( abs($centerX - $centerOtherX) < 60 )
{
$pushDir = ($centerX > $centerOtherX) ? 1 : -1;
$self->{X} += 10 * $pushDir;
$self->{OTHER}->{X} -= 10 * $pushDir;
}
}
# 2.4. HORIZONTAL BOUNDS CHECKING
$self->{X} = $::BgPosition + $::MOVEMARGIN2
if $self->{X} < $::BgPosition + $::MOVEMARGIN2;
$self->{X} = $::BgPosition + $::SCRWIDTH2 - $::MOVEMARGIN2
if $self->{X} > $::BgPosition + $::SCRWIDTH2 - $::MOVEMARGIN2;
# 3. FLYING OR FALLING
if ( $self->{Y} < $::GROUND2 )
{
$self->{PUSHY} += 3;
$self->{Y} += $self->{PUSHY};
if ($self->{Y} >= $::GROUND2)
{
# LANDING
if ( $st->{SITU} eq 'Falling')
{
::AddEarthquake( $self->{PUSHY} / 20 );
push @::Sounds, ('splat.wav') if $self->{PUSHY} > 40;
# print "PUSHY = ", $self->{PUSHY}, "; ";
if ( $self->{PUSHY} > 30 )
{
# Bouncing after a fall
$self->{PUSHY} = - $self->{PUSHY} / 2; # 1/1
$self->{Y} = $::GROUND2 - 1;
}
else
{
# Getting up after a fall.
$self->{PUSHY} = 0;
$self->{Y} = $::GROUND2;
$self->{DEL} = 0;
$self->{NEXTST} = 'Getup';
$self->{NEXTST} = 'Dead' if $self->{HP} <= 0;
}
return;
}
else
{
push @::Sounds, ('thump.wav');
$self->{PUSHY} = 0;
$self->{Y} = $::GROUND2;
if ( substr($self->{ST},0,4) eq 'Jump' )
{
# Landing after a jump
$self->{DEL} = 0;
$self->{NEXTST} = 'Stand';
}
else
{
print "Landed; state: ", $self->{ST}, "\n";
}
return;
}
}
}
return if $self->{'DEL'} > 0;
# 4. DELAYING OVER. MAKE END-OF-STATE CHANGES.
# 4.1. 'DELTAX' displacement if so specified
if ($st->{DELTAX})
{
$self->{X} += $st->{DELTAX} * $self->{DIR} * $::GAMEBITS2;
}
# 4.2. 'TURN' if so specified
if ($st->{TURN})
{
$self->{DIR} = - $self->{DIR};
# Swap input keys..
$i = $in->{Keys}->[2];
$in->{Keys}->[2] = $in->{Keys}->[3];
$in->{Keys}->[3] = $i;
}
# 5. CALCULATE THE NEXT STATE
my ($nextst, $con, $input, $mod, $action, $dist);
$nextst = $st->{NEXTST};
$con = $st->{CON};
$dist = ($self->{OTHER}->{X} - $self->{X}) * $self->{DIR};
undef $con if $::ko;
if ( defined $con )
{
$self->ComboEnds();
# 5.1. The current state has connections!
($input,$mod) = $in->GetAction();
$mod = '' unless defined $mod;
$action = $input;
# Try to find the best matching connection.
for ( $i = length($mod); $i>=0; --$i )
{
$action = $input . substr( $mod, 0, $i );
last if defined $con->{$action};
}
if ( defined $con->{$action} )
{
# print "dist = $dist. ";
if ( ($action eq 'hpunch' or $action eq 'lpunch') and ($dist>=0) and ($dist<800) )
{
$action = 'hpunchF' if defined $con->{'hpunchF'};
}
elsif ( ($action eq 'hkick' or $action eq 'lkick') and ($dist>=0) and ($dist<900) )
{
$action = 'lkickF' if defined $con->{'lkickF'};
}
$nextst = $con->{$action};
$in->ActionAccepted;
}
}
$self->{'NEXTST'} = $nextst;
}
sub CheckHit
{
my ($self) = @_;
return 0 unless $self->{CHECKHIT};
$self->{CHECKHIT} = 0;
my ($st, # A reference to the next state.
$nextst, # The name of the next state.
@hit, # The hit array
$i,
);
$st = $self->{STATES}->{$self->{ST}};
return 0 unless $st->{HIT};
return 0 unless defined $self->{FRAMES}->[$st->{F}]->{hit};
@hit = @{$self->{FRAMES}->[$st->{F}]->{hit}};
if ( $self->{DIR}<0 )
{
::MirrorPolygon( \@hit );
}
::OffsetPolygon( \@hit,
$self->{X} / $::GAMEBITS2,
$self->{Y} / $::GAMEBITS2 );
$i = $self->{OTHER}->IsHitAt( \@hit );
$self->{DELIVERED} = 1 if $i;
print "Collision = $i; ";
if ( $i == 0 )
{
# Make the 'Woosh' sound - maybe.
$nextst = $st->{NEXTST};
print "NEXTST = $nextst";
$nextst = $self->{STATES}->{$nextst};
print "NEXTST->HIT = ", $nextst->{HIT}, "\n";
push @::Sounds, ('woosh.wav') unless $nextst->{HIT} and defined $self->{FRAMES}->[$nextst->{F}]->{hit};
}
return $i;
}
sub IsHitAt
{
my ($self, $poly) = @_;
my ($frame, @a);
$frame = $self->{FRAMES}->[$self->{FR}];
::OffsetPolygon( $poly, -$self->{X} / $::GAMEBITS2, -$self->{Y} / $::GAMEBITS2 );
if ( $self->{DIR}<0 )
{
::MirrorPolygon( $poly );
}
#print "IsHitAt (", join(',',@{$poly}),")\n (",
# join(',',@{$frame->{head}}),")\n (",
# join(',',@{$frame->{body}}),")\n (",
# join(',',@{$frame->{legs}}),")\n";
return 1 if ::Collisions( $poly, $frame->{head} );
return 2 if ::Collisions( $poly, $frame->{body} );
return 3 if ::Collisions( $poly, $frame->{legs} );
return 0;
}
=comment
Event($self, $event, $eventpar): Handles the following events:
'Won', 'Hurt', 'Thread', 'Fun', 'Turn'
=cut
sub Event($$$)
{
my ($self, $event, $eventpar) = @_;
my ($st);
$st = $self->GetCurrentState();
if ( ($st->{SITU} eq 'Ready' or $st->{SITU} eq 'Stand') and $event eq 'Won' )
{
$self->{NEXTST} = 'Won' unless substr($self->{ST}, 0, 3) eq 'Won' ;
return;
}
if ( $st->{SITU} eq 'Ready' and $self->{NEXTST} eq '' )
{
$self->{IDLE} = 0;
if ( $event =~ /Hurt|Threat|Fun|Turn/ )
{
if ( $event eq 'Fun' and defined $self->{STATES}->{'Funb'} and rand() < 0.5 )
{
$event = 'Funb';
}
$self->{NEXTST} = $event;
}
}
}
=comment
Event($self, $event, $eventpar): Handles the following events:
'Highhit', 'Uppercut', 'Hit', 'Groinhit', 'Leghit', 'Fall'
=cut
sub HitEvent($$$)
{
my ($self, $event, $eventpar) = @_;
my ($st, $blocked, $damage);
$st = $self->GetCurrentState();
# Do events: Highhit, Uppercut, Hit, Groinhit, Leghit, Fall
$eventpar = '' unless defined $eventpar; # Supress useless warning
if ( $eventpar eq 'Maxcombo' ) { $damage = 0; }
else { $damage = ::GetDamage( $self->{OTHER}->{NAME}, $self->{OTHER}->{ST} ); }
$blocked = $st->{BLOCK};
$blocked = 0 if ( $self->IsBackTurned() );
print "Event '$event', '$eventpar'\n";
print "Blocked.\n" if ( $blocked );
# Hit point adjustment here.
$self->{HP} -= $blocked ? $damage >> 3 : $damage;
# Turn if we must.
$self->{DIR} = ( $self->{X} > $self->{OTHER}->{X} ) ? -1 : 1;
# Handle the unfortunate event of the player "dying".
if ( $self->{HP} <= 0 )
{
push @::Sounds, ('bowling.voc');
$self->{NEXTST} = 'Falling';
$self->{PUSHX} = -20 * 3 * $self->{DIR};
$self->{PUSHY} = -80;
$self->{Y} -= 10;
$self->{COMBO} += 1;
$self->{COMBOHP} += $damage;
$self->ComboEnds();
$::ko = 1;
return;
}
# Handle blocked attacks.
if ( $blocked )
{
push @::Sounds, ('thump.wav');
$self->HitPush( - $damage * 20 * $self->{DIR} );
# $self->{PUSHX} = - $damage * 5 * $self->{DIR};
return;
}
# Handle the rest of the events.
if ( $event eq 'Uppercut' )
{
push @::Sounds, ('evil_laughter.voc');
::AddEarthquake( 20 );
}
elsif ($event eq 'Groinhit') { push @::Sounds, ('woman_screams.voc'); }
{ push @::Sounds, ('thump3.voc'); }
$self->{COMBO} += 1;
$self->{COMBOHP} += $damage;
$damage *= $self->{COMBO}; # Only for the purpose of pushing
if ( $self->{COMBO} >= $::MAXCOMBO )
{
$self->ComboEnds();
$event = 'Uppercut';
$self->{OTHER}->HitEvent( 'Fall', 'Maxcombo' );
}
if ( $st->{SITU} eq 'Crouch' )
{
if ( $event eq 'Uppercut' or $event eq 'Fall' )
{
$self->{NEXTST} = 'Falling';
$self->{PUSHX} = -48 * 3 * $self->{DIR};
$self->{PUSHY} = -100;
$self->{Y} -= 10;
}
else
{
if ($eventpar == 1) {
$self->{NEXTST} = 'KneelingPunched';
} else {
$self->{NEXTST} = 'KneelingKicked';
}
$self->HitPush( - $damage * 20 * $self->{DIR} );
# $self->{PUSHX} = - $damage * 20 * $self->{DIR};
}
return;
}
if ( $st->{SITU} eq 'Falling' )
{
$self->{PUSHY} -= 50;
$self->{PUSHY} = -80 if $self->{PUSHY} > -80;
$self->{Y} -= 10;
return;
}
if ( $self->{Y} < $::GROUND2 )
{
$self->{NEXTST} = 'Falling';
$self->{PUSHY} -= 50;
$self->{PUSHX} = -48 * 3 * $self->{DIR};
return;
}
if ( $event eq 'Highhit' )
{
$self->{NEXTST} = 'HighPunched';
$self->HitPush( - $damage * 20 * $self->{DIR} );
# $self->{PUSHX} = - $damage * 20 * $self->{DIR};
}
elsif ( $event eq 'Hit' )
{
if ($eventpar == 1) {
$self->{NEXTST} = 'HighPunched';
} elsif ($eventpar == 2) {
$self->{NEXTST} = 'LowPunched';
} else {
$self->{NEXTST} = 'Swept';
}
$self->HitPush( - $damage * 20 * $self->{DIR} );
# $self->{PUSHX} = - $damage * 20 * $self->{DIR};
}
elsif ( $event eq 'Groinhit' )
{
$self->{NEXTST} = 'GroinKicked';
$self->HitPush( - $damage * 20 * $self->{DIR} );
# $self->{PUSHX} = - $damage * 20 * $self->{DIR};
}
elsif ( $event eq 'Leghit' )
{
$self->{NEXTST} = 'Swept';
$self->HitPush( - $damage * 20 * $self->{DIR} );
# $self->{PUSHX} = - $damage * 20 * $self->{DIR};
}
elsif ( $event eq 'Uppercut' or $event eq 'Fall' )
{
$self->{NEXTST} = 'Falling';
$self->{PUSHX} = -48 * 3 * $self->{DIR};
$self->{PUSHY} = -100;
$self->{Y} -= 10;
}
else
{
die "Unknown event: $event, $eventpar";
}
}
sub GetCurrentState
{
my ($self, $statename) = @_;
my ($stateref);
die unless defined $self;
$statename = $self->{ST} unless defined $statename;
$stateref = $self->{STATES}->{$statename};
return $stateref;
}
sub ComboEnds
{
my ($self) = @_;
my ($combo, $ismaxcombo);
$combo = $self->{COMBO};
$ismaxcombo = $combo >= $::MAXCOMBO;
return unless $combo;
if ( $self->{COMBO} > 1 )
{
my ( $head, $doodad, $x, $y, $combotext );
- $combotext = $ismaxcombo ? "MAX COMBO!!!" : ($self->{COMBO} . "-hit combo!");
+ $combotext = $ismaxcombo ? ::Translate("MAX COMBO!!!") : sprintf( ::Translate('%d-hit combo!'), $self->{COMBO} );
$head = $self->{FRAMES}->[$self->{FR}]->{head};
$x = $self->{X} + $head->[0] * $::GAMEBITS2 * $self->{DIR};
$y = $self->{Y} + $head->[1] * $::GAMEBITS2;
$doodad = Doodad::CreateTextDoodad( $x, $y - 30 * $::GAMEBITS2,
$self->{NUMBER},
$combotext );
$doodad->{LIFETIME} = $ismaxcombo ? 120 : 80;
$doodad->{SPEED} = [-3,-3];
$doodad = Doodad::CreateTextDoodad( $x, $y - 10 * $::GAMEBITS2,
$self->{NUMBER},
- int($self->{COMBOHP}*$::HitPointScale/10) . "% damage" );
+ sprintf( ::Translate('%d%% damage'), int($self->{COMBOHP}*$::HitPointScale/10) ) );
$doodad->{LIFETIME} = 80;
$doodad->{SPEED} = [+3,-3];
print $self->{COMBO}, "-hit combo for ", $self->{COMBOHP}, " damage.\n";
push @::Sounds, ( $ismaxcombo ? 'crashhh.voc' : 'ba_gooock.voc');
}
$self->{COMBO} = 0;
$self->{COMBOHP} = 0;
}
=comment
Update moves the fighter to his next state, if there is a NEXTST set.
NEXTST should be calculated before calling this method. No further
branching or CON checking is done.
If the next state has JUMP, the character is set aflying.
=cut
sub Update
{
my ($self) = @_;
my ($nextst, # The name of the next state
$st); # The descriptor of the next state.
# Is there a next state defined?
$nextst = $self->{'NEXTST'};
# If there isn't, no updating is necessary.
return unless $nextst;
# ADMINISTER THE MOVING TO THE NEXT STATE
$st = $self->GetCurrentState( $nextst );
$self->{'ST'} = $nextst;
$self->{'FR'} = $st->{'F'};
die "ERROR IN STATE $nextst" unless defined $st->{DEL};
$self->{'DEL'} = $st->{'DEL'} * $::DELMULTIPLIER;
# HANDLE THE JUMP and PUSH ATTRIBUTE
if ( defined ($st->{'JUMP'}) )
{
$self->{'PUSHY'} = -($st->{'JUMP'});
$self->{'Y'} += $self->{'PUSHY'};
}
if ( defined ($st->{'PUSHX'}) )
{
$self->{'PUSHX'} += $st->{'PUSHX'} * $self->{DIR};
}
# HANDLE THE HIT ATTRIBUTE
if ( defined ($st->{HIT}) )
{
$self->{CHECKHIT} = 1 unless $self->{DELIVERED};
}
else
{
$self->{DELIVERED} = 0;
}
# HANDLE THE SOUND ATTRIBUTE
if ( defined $st->{SOUND} )
{
push @::Sounds, ($st->{SOUND});
}
# HANDLE THE CODE ATTRIBUTE
if ( defined ($st->{CODE}) )
{
eval ($st->{CODE}); print $@ if $@;
}
# HANDLE DOODADS
if ( defined ($st->{DOODAD}) )
{
# Create a doodad (probably a shot)
my ($frame, $hit, $doodad, $doodadname);
$frame = $self->{FRAMES}->[$self->{FR}];
$hit = $frame->{hit};
if ( defined $hit )
{
$doodadname = $st->{DOODAD};
$doodad = Doodad::CreateDoodad(
$self->{X} + $hit->[0] * $::GAMEBITS2 * $self->{DIR},
$self->{Y} + $hit->[1] * $::GAMEBITS2,
$doodadname,
$self->{DIR},
$self->{NUMBER} );
}
}
}
=comment
Pushes the fighter back due to being hit. If the fighter is cornered,
the other fighter will be pushed back instead.
=cut
sub HitPush
{
my ($self, $pushforce) = @_;
if ( $self->IsCornered )
{
$self->{OTHER}->{PUSHX} -= $pushforce;
}
else
{
$self->{PUSHX} += $pushforce;
}
}
=comment
Returns the characters 'centerline' in physical coordinates.
=cut
sub GetCenterX
{
my ($self) = @_;
my ($body, $x);
$body = $self->{FRAMES}->[$self->{FR}]->{body};
$x = $body->[0] + $body->[2] + $body->[4] + $body->[6];
return $self->{X} / $::GAMEBITS2 + $x / 4 * $self->{DIR};
}
=comment
Is my back turned to my opponent? Returns true if it is.
=cut
sub IsBackTurned
{
my ($self) = @_;
return ( ($self->{X} - $self->{OTHER}->{X}) * ($self->{DIR}) > 0 );
}
=comment
Returns true if the character is at either end of the arena.
=cut
sub IsCornered
{
my ($self) = @_;
return (($self->{X} <= $::MOVEMARGIN2 + 16)
or ($self->{X} >= $::BGWIDTH2 - $::MOVEMARGIN2 - 16));
}
return 1;
diff --git a/data/script/Translate.pl b/data/script/Translate.pl
index 5f4d81d..0f9f4a7 100644
--- a/data/script/Translate.pl
+++ b/data/script/Translate.pl
@@ -1,825 +1,818 @@
use strict;
=comment
Translate.pl attempts to load all of the translations into one file. A
translation is simply a hash from English to the other language.
=cut
$::English = { 'LanguageCode' => 0,
# In-game text
'MAX COMBO!!!' => undef,
'%d-hit combo!' => undef, # e.g. 3-hit combo!
'%d%% damage' => undef, # e.g. 30% damage
'Round %d' => undef,
'REW' => undef,
'REPLAY' => undef,
'DEMO' => undef,
'Press F1 to skip...'=> undef,
'HURRY UP!' => undef,
'TIME IS UP!' => undef,
'Final Judgement' => undef,
'Continue?' => undef,
'SPLAT!' => undef,
'Choose A Fighter Dammit' => undef,
# Menu items
"Main Menu" => undef,
"~SINGLE PLAYER GAME"=> undef,
"~MULTI PLAYER GAME"=> undef,
"~SURRENDER GAME" => undef,
"~OPTIONS" => undef,
"~INFO" => undef,
"QUIT" => undef,
"~OK" => undef,
"~LANGUAGE: " => undef,
"Options" => undef,
"~FULLSCREEN ON" => undef,
"~FULLSCREEN OFF" => undef,
"GAME SPEED: " => undef,
"GAME TIME: " => undef,
"STAMINA: " => undef,
"~SOUND" => undef,
"~RIGHT PLAYER KEYS"=> undef,
"~LEFT PLAYER KEYS" => undef,
"Sound" => undef,
"CHANNELS: " => undef, # Mono / Stereo
"SOUND QUALITY: " => undef, # KHz of playback rate
"SOUND FIDELITY: " => undef, # 8 bit or 16 bit
"MUSIC VOLUME: " => undef, # OFF or numeric
"EFFECTS VOLUME: " => undef, # OFF or numeric
# Menu options
"BABY" => undef,
"VERY LOW" => undef,
"LOW" => undef,
"NORMAL" => undef,
"HIGH" => undef,
"VERY HIGH" => undef,
"NEAR IMMORTAL" => undef,
"SNAIL RACE" => undef,
"SLOW" => undef,
"NORMAL" => undef,
"TURBO" => undef,
"KUNG-FU MOVIE" => undef,
# Sound / Channels
"MONO" => undef,
"STEREO" => undef,
# Sound / Mixing rate settings
"LOW" => undef,
"MEDIUM" => undef,
"HIGH" => undef,
# Sound volume
"OFF" => undef,
# Key configuration
'%s player-\'%s\'?' => undef, # The first %s becomes Left or Right. The second %s is up/down/high punch/...
'Left' => undef,
'Right' => undef,
"up", => undef,
"down", => undef,
"left", => undef,
"right", => undef,
"block", => undef,
"low punch", => undef,
"high punch", => undef,
"low kick", => undef,
"high kick" => undef,
'Thanks!' => undef,
# Demo screens,
'Fighter Stats' => undef,
'Unfortunately this fighter is not yet playable.' => undef,
'Name: ' => undef,
'Team: ' => undef,
'Style: ' => undef,
'Age: ' => undef,
'Weight: ' => undef,
'Height: ' => undef,
'Shoe size: ' => undef,
"Credits" => undef,
"CreditsText1" =>
"OPENMORTAL CREDITS
-- THE OPENMORTAL TEAM ARE --
CODING - UPi
MUSIC - Oedipus
GRAPHICS - UPi
German translation - ??
French translation - ??
Spanish translation - ??
-- CAST --
Boxer - Zoli
Cumi - As himself
Descant - As himself
Fureszes Orult - Ambrus
Grizli - As himself
Kinga - As herself
Macy - As herself
Misi - As himself
Rising-san - Surba
Sirpi - As himself
Taka Ito - Bence
Tokeletlen Katona - Dani
Watasiwa Baka Janajo - Ulmar
Black Dark Evil Mage - UPi
-- HOSTING --
sourceforge.net
apocalypse.rulez.org
freshmeat.net
OpenMortal is Copyright 2003 of the OpenMortal Team
Distributed under the GNU General Public Licence Version 2\n\n",
'CreditsText2' =>
'Thanks to Midway for not harrassing us with legal stuff so far, even though '.
'we must surely violate at least 50 of their patents, international copyrights and registered trademarks.
OpenMortal needs your help! If you can contribute music, graphics, improved code, '.
'additional characters, cash, beer, pizza or any other consumable, please mail us '.
'at upi@apocalypse.rulez.org! The same address is currently accepting comments and '.
"fanmail too (hint, hint!).\n\n",
'CreditsText3' =>
"Be sure to check out other stuff from
Apocalypse Production
and
Degec Entertainment\n\n",
'Story1Text' =>
"We, the Gods of the Evil Killer Black Antipathic Dim (witted) Fire Mages no longer tolerate the lack of evildoing.
We send them out on a mission so diabolical, so evil that the world will never be the same again!
We order our unworthy followers to
DESTROY THE SATURDAY
and plunge humanity into a dark age of 5 working days and 1 holiday per week... FOREVER!\n\n\n\n\n\n\n\n\n",
'Story2Text', =>
"Whenever EVIL looms on the horizon, the good guys are there to save the day. Son Goku, the protector of Earth and Humanity went to the rescue...
Only to become ROADKILL on his way to the Mortal Szombat tournament! It was Cumi's first time behind the wheel, after all...\n\n\n\n\n\n\n\n\n",
};
$::Hungarian = { 'LanguageCode' => 3,
# In-game text
'MAX COMBO!!!' => "MAX KOMBÓ!!!",
'%d-hit combo!' => '%dX kombó',
'%d%% damage' => '%d%% sebzés',
'Round %d' => '%d. menet',
'REW' => 'VISSZA',
'REPLAY' => undef,
'DEMO' => 'DEMÓ',
'Press F1 to skip...'=> 'F1 gomb: tovább',
'HURRY UP!' => 'GYERÜNK MÁR!',
'TIME IS UP!' => 'NA ENNYI!',
'Final Judgement' => 'Végsõ Ítélet',
'Continue?' => 'Tovább?',
'SPLAT!' => 'FRÖCCS!',
'Choose A Fighter Dammit' => 'Válassz Játékost, Baszki',
# Menu items
"Main Menu" => 'FÕMENÜ',
"~SINGLE PLAYER GAME"=> '~EGYSZEMÉLYES JÁTÉK',
"~MULTI PLAYER GAME"=> '~KÉTSZEMÉLYES JÁTÉK',
"~SURRENDER GAME" => '~JÁTÉK FELADÁSA',
"~OPTIONS" => '~BEÁLLÍTÁSOK',
"~INFO" => '~INFORMÁCIÓK',
"QUIT" => 'QUIT',
"~OK" => '~OKÉ',
"~LANGUAGE: " => '~NYELV: ',
"Options" => 'Beállítások',
"~FULLSCREEN ON" => 'Teljes képernyõ',
"~FULLSCREEN OFF" => 'Ablakos megjelenítés',
"GAME SPEED: " => 'Játék sebesség: ',
"GAME TIME: " => 'Játékidõ: ',
"STAMINA: " => 'Állóképesség: ',
"~SOUND" => '~HANG',
"~RIGHT PLAYER KEYS"=> '~Jobb játékos gombjai',
"~LEFT PLAYER KEYS" => '~Bal játékos gombjai',
"Sound" => 'Hangok',
"CHANNELS: " => 'Csatornák: ',
"SOUND QUALITY: " => 'Hangminõség: ',
"SOUND FIDELITY: " => 'Hangpontosság: ',
"MUSIC VOLUME: " => 'Zene hangereje: ',
"EFFECTS VOLUME: " => 'Zajok hangereje: ',
# Menu options
"BABY" => 'CSECSEMÕ',
"VERY LOW" => 'NAGYON GYÉR',
"LOW" => 'GYÉR',
"NORMAL" => 'NORMÁLIS',
"HIGH" => 'KEMÉNY',
"VERY HIGH" => 'NAGYON KEMÉNY',
"NEAR IMMORTAL" => 'TERMINÁTOR',
"SNAIL RACE" => 'CSIGAVERSENY',
"SLOW" => 'LASSÚ',
"NORMAL" => 'NORMÁL',
"TURBO" => 'TURBÓ',
"KUNG-FU MOVIE" => 'KUNG-FU FILM',
"MONO" => 'MONÓ',
"STEREO" => 'SZTEREÓ',
"LOW" => 'ALACSONY',
"MEDIUM" => 'KÖZEPES',
"HIGH" => 'MAGAS',
"OFF" => 'NINCS',
# Key configuration
'%s player-\'%s\'?' => '%s játékos - \'%s\?',
'Left' => 'Bal',
'Right' => 'Jobb',
"up", => 'fel',
"down", => 'le',
"left", => 'balra',
"right", => 'jobbra',
"block", => 'védés',
"low punch", => 'alsó ütés',
"high punch", => 'felsõ ütés',
"low kick", => 'alsó rúgás',
"high kick" => 'felsõ rúgás',
'Thanks!' => 'Köszi!',
# Demo screens,
'Fighter Stats' => 'Harcos Adatai',
'Unfortunately this fighter is not yet playable.' => 'Sajnos õ még nem játszható.',
'KEYS' => 'GOMBOK',
'Name: ' => 'Név: ',
'Team: ' => 'Csapat: ',
'Style: ' => 'Stílus: ',
'Age: ' => 'Kor: ',
'Weight: ' => 'Súly: ',
'Height: ' => 'Magasság: ',
'Shoe size: ' => 'Cipõméret: ',
"Credits" => 'Készítették',
"CreditsText1" =>
-"
-. .   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½
-¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý
-Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
-
-
-
-A Mortál Szombat Elkövetõi
+"A Mortál Szombat Elkövetõi
-- A MORTÁL SZOMBAT CSAPAT --
PROGRAM - UPi
ZENE - Oedipus
GRAFIKA - UPi
Német fordítás - ??
Francia fordítás - ??
Spanyol fordítás - ??
-- SZEREPLÕK --
Boxer - Zoli
Cumi - Mint önmaga
Descant - Mint önmaga
Fûrészes Õrült - Ambrus
Grizli - Mint önmaga
Kinga - Mint önmaga
Macy - Mint önmaga
Misi - Mint önmaga
Rising-san - Surba
Sirpi - Mint önmaga
Taka Ito - Bence
Tökéletlen Katona - Dani
Watasiwa Baka Janajo - Ulmar
Black Dark Evil Mage - UPi
-- SZERVEREINK --
sourceforge.net
apocalypse.rulez.org
freshmeat.net
A Mortál Szombat Copyright 2003, A Mortál Szombat Csapat
Distributed under the GNU General Public Licence Version 2\n\n",
'CreditsText2' =>
'Thanks to Midway for not harrassing us with legal stuff so far, even though '.
'we must surely violate at least 50 of their patents, international copyrights and registered trademarks.
OpenMortal needs your help! If you can contribute music, graphics, improved code, '.
'additional characters, cash, beer, pizza or any other consumable, please mail us '.
'at upi@apocalypse.rulez.org! The same address is currently accepting comments and '.
"fanmail too (hint, hint!).\n\n",
'CreditsText3' =>
"Be sure to check out other stuff from
Apocalypse Production
and
Degec Entertainment\n\n",
'Story1Text' =>
"Mi, a Gonosz Gyilkos Fekete Ellenszenves Sötét(elméjû) Tûzmágusok istenei nem tûrhetjük tovább a gonosztevés hiányát.
Egy küldetést adunk nekik amelyik olyan ördögien gonosz, amilyet a világ még sosem látott!
Méltatlan alattvalóink parancsa:
ELPUSZTÍTANI
A SZOMBATOT
hogy az emberiség az 5 munkanap és egy szünnapos hét sötét korába süllyedjen... ÖRÖKRE!\n\n\n\n\n\n\n\n\n",
'Story2Text', =>
"Whenever EVIL looms on the horizon, the good guys are there to save the day. Son Goku, the protector of Earth and Humanity went to the rescue...
Only to become ROADKILL on his way to the Mortal Szombat tournament! It was Cumi's first time behind the wheel, after all...\n\n\n\n\n\n\n\n\n",
};
$::French = { 'LanguageCode' => 2,
# In-game text
'MAX COMBO!!!' => 'MAX COMBO!!!',
'%d-hit combo!' => '%d-coups combo!', # e.g. 3-hit combo!
'%d%% damage' => '%d%% degats', # e.g. 30% damage
'Round %d' => 'Round %d',
'REW' => 'REMB',
'REPLAY' => 'RALENTI',
'DEMO' => 'DEMO',
'Press F1 to skip...'=> 'Appuyez sur F1 pour annuler',
'HURRY UP!' => 'DEPECHEZ-VOUS !',
'TIME IS UP!' => 'LE TEMPS EST ECOULE',
'Final Judgement' => 'Jugement Final',
'Continue?' => 'Continuer ?',
'SPLAT!' => 'SPLAT',
'Choose A Fighter Dammit' => 'Choisis un combattant Mildiou !',
# Menu items
"Main Menu" => "Menu Principal",
"~SINGLE PLAYER GAME"=> "JEU SOLO",
"~MULTI PLAYER GAME"=> "JEU MULTI",
"~SURRENDER GAME" => "Jeu JeMeRends",
"~OPTIONS" => "OPTIONS",
"~INFO" => "INFO",
"QUIT" => "QUITTER",
"~OK" => "OK",
"~LANGUAGE: " => "LANGUE: ",
"Options" => "Options",
"~FULLSCREEN ON" => "Plein écran ON",
"~FULLSCREEN OFF" => "Plein écran OFF",
"GAME SPEED: " => "Vitesse de jeu: ",
"GAME TIME: " => "Temps de jeu: ",
"STAMINA: " => "Vitalité: ",
"~SOUND" => "SON",
"~RIGHT PLAYER KEYS"=> "Touches joueur droite",
"~LEFT PLAYER KEYS" => "Touches joueur gauche",
"Sound" => 'Son',
"CHANNELS: " => "CANAUX: ", # Mono / Stereo
"SOUND QUALITY: " => "Echantillonage: ", # KHz of playback rate
"SOUND FIDELITY: " => "Qualité sonore: ", # 8 bit or 16 bit
"MUSIC VOLUME: " => "Volume musical: ", # OFF or numeric
"EFFECTS VOLUME: " => "Volume effets : ", # OFF or numeric
# Menu options
"BABY" => "BEBE",
"VERY LOW" => "TRES BAS",
"LOW" => "BAS",
"NORMAL" => "NORMAL",
"HIGH" => "ELEVE",
"VERY HIGH" => "TRES ELEVE",
"NEAR IMMORTAL" => "PRESQUE IMMORTEL",
"SNAIL RACE" => "COURSE D'ESCARGOT",
"SLOW" => "LENT",
"NORMAL" => "NORMAL",
"TURBO" => "TURBO",
"KUNG-FU MOVIE" => "FILM DE KUNG-FU",
# Sound / Channels
"MONO" => "MONO",
"STEREO" => "STEREO",
# Sound / Mixing rate settings
"LOW" => "BAS",
"MEDIUM" => "MOYEN",
"HIGH" => "HAUT",
# Sound volume
"OFF" => "OFF",
# Key configuration
'%s player-\'%s\'?' => '%s joueur-\'%s\'?', # The first %s becomes Left or Right. The second %s is up/down/high punch/...
'Left' => 'Gauche',
'Right' => 'Droite',
"up", => "haut",
"down", => "bas",
"left", => "gauche",
"right", => "droite",
"block", => "bloquer",
"low punch", => "poing bas",
"high punch", => "poing haut",
"low kick", => "Coup de pied bas",
"high kick" => "Coup de pied haut",
'Thanks!' => "Merci !",
# Demo screens,
'Fighter Stats' => 'Statistiques Combattant',
'Unfortunately this fighter is not yet playable.' => 'Malheureusement ce combattant n\'est pas encore jouable',
'Name: ' => 'Nom: ',
'Team: ' => 'Equipe: ',
'Style: ' => 'Style: ',
'Age: ' => 'Age: ',
'Weight: ' => 'Poids: ',
'Height: ' => 'Taille: ',
'Shoe size: ' => 'Pointure: ',
"Credits" => "Crédits",
"CreditsText1" =>
"OPENMORTAL CREDITS
-- L'EQUIPE D'OPENMORTAL EST --
Programmation - UPi
Musique - Oedipus
Graphiques - UPi
German translation - ??
French translation - Vampyre
Spanish translation - ??
-- Acteurs --
Boxer - Zoli
Cumi - Dans son rôle
Descant - Dans son rôle
Fureszes Orult - Ambrus
Grizli - Dans son rôle
Kinga - Dans son rôle
Macy - Dans son rôle
Misi - Dans son rôle
Rising-san - Surba
Sirpi - Dans son rôle
Taka Ito - Bence
Tokeletlen Katona - Dani
Watasiwa Baka Janajo - Ulmar
Black Dark Evil Mage - UPi
-- HEBERGEMENT --
sourceforge.net
apocalypse.rulez.org
freshmeat.net
OpenMortal est un Copyright 2003 de l'Equipe OpenMortal \
Distribué sous Licence GNU General Public Licence Version 2\n\n",
'CreditsText2' =>
'Merci à Midway de ne pas nous harceler avec des trucs légaux (jusqu\'ici), bien que '.
'nous avons sûrement violé au moins 50 de leurs brevets, copyrights internationaux, et marques déposées.
OpenMortal a besoin de votre aide ! Si vous pouvez contribuer à la musique, graphiques, programmation améliorée, '.
'personnages supplémentaires, du fric, de la bière, des pizzas, ou toute autre forme de nourriture, SVP, envoyez-nous un email '.
'à upi@apocalypse.rulez.org! La même adresse accepte actuellement les commentaires et '.
"les emails de fans aussi (astuce, astuce !).\n\n",
'CreditsText3' =>
"Soyez certains de vérifier les autres programmes de
Apocalypse Production
et
Degec Entertainment\n\n",
'Story1Text' =>
"Nous, les Dieux des Diaboliques Tueurs Noirs Antipathiques Faibles (humour) Mages de Feu, ne tolérons plus longtemps le manque de faiseurs de mal.
Nous les avons une fois de plus envoyés dans un mission si diabolique, si Luciferatique que le monde ne sera plus jamais le même!
Nous ordonnons à nos disciples indignes de
DETRUIRE LE SAMEDI
et de plonger l'humanité dans un Moyen-Age de 5 jours de travail et 1 jour de vacances par semaine... A TOUT JAMAIS!\n\n\n\n\n\n\n\n\n",
'Story2Text', =>
"Bien que le Mal lorgne l'horizon, les gentils doivent sauver le jour ! Son Goku, le protecteur de la Terre et de l'Humanité viennent à la rescousse...
Seulement afin de devenir le TUEUR IMPITOYABLE sur le long chemin du tournoi Mortal Szombat ! C'était la première apparition de Cumi, après tout...\n\n\n\n\n\n\n\n\n",
};
-$::Spanish = { 'LanguageCode' => 2,
+$::Spanish = { 'LanguageCode' => 1,
# In-game text
'MAX COMBO!!!' => 'MAX COMBO!!!',
'%d-hit combo!' => '%d-hit combo!', # e.g. 3-hit combo!
'%d%% damage' => '%d%% daño', # e.g. 30% damage
'Round %d' => 'Round %d',
'REW' => 'RETROCEDER',
'REPLAY' => 'REPRODUCIR',
'DEMO' => 'DEMO',
'Press F1 to skip...'=>'Presiona F1 para saltar...',
'HURRY UP!' => 'APURATE!',
'TIME IS UP!' => 'SE ACABO EL TIEMPO!',
'Final Judgement' => 'Juicio Final',
'Continue?' => 'Continuar?',
'SPLAT!' => 'SPLAT!',
'Choose A Fighter Dammit' => 'Escoge un Peleador',
# Menu items
"Main Menu" => "Menu Principal",
"~SINGLE PLAYER GAME"=>"~1 SOLO JUGADOR ",
"~MULTI PLAYER GAME"=> "~MULTIJUGADOR ",
"~SURRENDER GAME" => "~ENTREGA ",
"~OPTIONS" => "~OPCIONES",
"~INFO" => "~INFO",
"QUIT" => "SALIR",
"~OK" => "~OK",
"~LANGUAGE: " => "~LENGUAJE: ",
"Options" => "Opciones",
"~FULLSCREEN ON" => "~PANTALLA COMPLETA ON",
"~FULLSCREEN OFF" => "~PANTALLA COMPLETA OFF",
"GAME SPEED: " => "VELOCIDAD DEL JUEGO: ",
"GAME TIME: " => "TIEMPO DEL JUEGO: ",
"STAMINA: " => "STAMINA: ",
"~SOUND" => "~SONIDO",
"~RIGHT PLAYER KEYS"=> "~TECLAS JUGADOR DERECHO",
"~LEFT PLAYER KEYS" => "~TECLAS JUGADOR IZQUIERDO",
"Sound" => "Sonido",
"CHANNELS: " => "CANALES: ", # Mono / Stereo
"SOUND QUALITY: " => "CALIDAD DEL SONIDO: ", # KHz of playback rate
"SOUND FIDELITY: " => "FIDELIDAD DEL SONIDO: ", # 8 bit or 16 bit
"MUSIC VOLUME: " => "VOLUMEN DE LA MUSICA: ", # OFF or numeric
"EFFECTS VOLUME: " => "VOLUMEN DE LOS EFECTOS: ", # OFF or numeric
# Menu options
"BABY" => "BEBE",
"VERY LOW" => "MUY LENTO",
"LOW" => "LENTO",
"NORMAL" => "NORMAL",
"HIGH" => "ALTO",
"VERY HIGH" => "MUY ALTO",
"NEAR IMMORTAL" => "CERCA DE LA INMORTALIDAD",
"SNAIL RACE" => "CARRERA DE CARACOL",
"SLOW" => "LENTO",
"NORMAL" => "NORMAL",
"TURBO" => "TURBO",
"KUNG-FU MOVIE" => "PELICULA DE KUNG-FU",
# Sound / Channels
"MONO" => "MONO",
"STEREO" => "STEREO",
# Sound / Mixing rate settings
"LOW" => "BAJO",
"MEDIUM" => "MEDIO",
"HIGH" => "ALTO",
# Sound volume
"OFF" => "OFF",
# Key configuration
'%s player-\'%s\'?' => '%s jugador-\'%s\'?', # The first %s becomes Left or Right. The second %s is up/down/high punch/...
'Left' => 'Izquierda',
'Right' => 'Derecha',
"up", => "arriba",
"down", => "abajo",
"left", => "izquierda",
"right", => "derecha",
"block", => "bloquear",
"low punch", => "puño bajo",
"high punch", => "puño alto",
"low kick", => "patada baja",
"high kick" => "patada alta",
'Thanks!' => 'Gracias!',
# Demo screens,
'Fighter Stats' => 'Estadísticas del Peleador',
'Unfortunately this fighter is not yet playable.' => 'Desafortunadamente este jugador no esta habilitado.',
'Name: ' => 'Nombre: ',
'Team: ' => 'Equipo: ',
'Style: ' => 'Estilo: ',
'Age: ' => 'Edad: ',
'Weight: ' => 'Peso: ',
'Height: ' => 'Altura: ',
'Shoe size: ' => 'Tamaño de zapato: ',
"Credits" => "Creditos",
"CreditsText1" =>
"CREDITOS
-- EL EQUIPO DE OPENMORTAL ES --
CODING - UPi
MUSIC - Oedipus
GRAPHICS - UPi
German translation - ??
French translation - ??
Spanish translation - EdsipeR
-- CAST --
Boxer - Zoli
Cumi - como el mismo
Descant - como el mismo
Fureszes Orult - Ambrus
Grizli - como el mismo
Kinga - como ella misma
Macy - como ella misma
Misi - como el mismo
Rising-san - Surba
Sirpi - como el mismo
Taka Ito - Bence
Tokeletlen Katona - Dani
Watasiwa Baka Janajo - Ulmar
Black Dark Evil Mage - UPi
-- HOSTING --
sourceforge.net
apocalypse.rulez.org
freshmeat.net
OpenMortal es Marca registrada 2003 de OpenMortal Team\
Distribuido bajo la GNU General Public Licence Version 2\n\n",
'CreditsText2' =>
'Gracias a Midway por no aplastarnos con su equipo legal'.
'Seguramente nosotros violamos al menos 50 de sus patentes, marcas registradas internacionales y trademarks registradas .
OpenMortal necesita de tu ayuda! Si tu puedes contribuir con musica, imagenes, improvisación de codigo, '.
'caracteres adicionales, dinero, cerveza, pizza o cualquier otra cosa consumible, por favor escribenos '.
'a upi@apocalypse.rulez.org! La misma dirección esta actualmente aceptando comentarios y '.
"tambien emails de fans (hint, hint!).\n\n",
'CreditsText3' =>
"Estate atento para verificar otro stuff desde
Apocalypse Production
y
Degec Entertainment\n\n",
'Story1Text' =>
"Nosotros, los Dioses del Endemoniado Negro Antipatico Asesino Dim no tolero mas lo endemoniado.
Enviamos a ellos en una misión tan diabólica, tan endemoniada que el mundo nunca será el mismo de nuevo!
Ordenamos a nuestros indignos seguidores a
DESTRUIR EL SABADO
y plagar la humanidad en una epoca oscura de 5 dias de trabajo y uno de descanso por semana.... POR SIEMPRE!\n\n\n\n\n\n\n\n\n",
'Story2Text', =>
"Whenever EVIL looms on the horizon, the good guys are there to save the day. Son Goku, the protector of Earth and Humanity went to the rescue...
Only to become ROADKILL on his way to the Mortal Szombat tournament! It was Cumi's first time behind the wheel, after all...\n\n\n\n\n\n\n\n\n",
};
%::LanguageCodes =
(
'en' => $::English,
'hu' => $::Hungarian,
'fr' => $::French,
'es' => $::Spanish,
);
=comment
SetLanguage sets the two-character language code.
=cut
$::Language = $::English;
$::Language = $::Hungarian;
$::Language = $::French;
$::Language = $::Spanish;
sub SetLanguage($)
{
my ($NewLanguageCode) = @_;
$::LanguageCode = $NewLanguageCode;
if ( defined $::LanguageCodes{$::LanguageCode} )
{
$::Language = $::LanguageCodes{$::LanguageCode};
}
else
{
print "Language $::LanguageCode is not available. Reverting to English.\n";
$::Language = $::English;
$::LanguageCode = 'en';
}
$::LanguageNumber = $::Language->{'LanguageCode'};
}
sub Translate($)
{
my $text = shift;
- print "The translation of '$text' is ";
+ # print "The translation of '$text' is ";
$text = $::Language->{$text} if defined $::Language->{$text};
- print "'$text'.\n";
+ # print "'$text'.\n";
$::Translated = $text;
}
1;
# "Connect to game", "Create game"
# "Network mode: ", "Connect to: ", "Start Network Play!", "Cancel"
# "Connection closed."
\ No newline at end of file

File Metadata

Mime Type
text/x-diff
Expires
Wed, Feb 4, 2:11 PM (2 h, 2 m ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
55624
Default Alt Text
(40 KB)

Event Timeline