# Signal - define the signal names and constants package Games::3D::Signal; # (C) by Tels use strict; use Exporter; use vars qw/@ISA @EXPORT_OK $VERSION/; @ISA = qw/Exporter/; @EXPORT_OK = qw/ SIG_ON SIG_UP SIG_OPEN SIG_OFF SIG_CLOSE SIG_DOWN SIG_FLIP SIG_DIE SIG_ACTIVATE SIG_DEACTIVATE SIG_KILLED SIG_UNKNOWN SIG_LEFT SIG_RIGHT STATE_FLIP STATE_ON STATE_UP STATE_OPEN STATE_OFF STATE_CLOSED STATE_DOWN SIG_LEVEL_WON SIG_LEVEL_LOST invert state_from_signal signal_from_state signal_name STATE_0 STATE_1 STATE_2 STATE_3 STATE_4 STATE_5 STATE_6 STATE_7 STATE_8 STATE_9 STATE_10 STATE_11 STATE_12 STATE_13 STATE_14 STATE_15 SIG_STATE_0 SIG_STATE_1 SIG_STATE_2 SIG_STATE_3 SIG_STATE_4 SIG_STATE_5 SIG_STATE_6 SIG_STATE_7 SIG_STATE_8 SIG_STATE_9 SIG_STATE_10 SIG_STATE_11 SIG_STATE_12 SIG_STATE_13 SIG_STATE_14 SIG_STATE_15 SIG_NOW_0 SIG_NOW_1 SIG_NOW_2 SIG_NOW_3 SIG_NOW_4 SIG_NOW_5 SIG_NOW_6 SIG_NOW_7 SIG_NOW_8 SIG_NOW_9 SIG_NOW_10 SIG_NOW_11 SIG_NOW_12 SIG_NOW_13 SIG_NOW_14 SIG_NOW_15 /; $VERSION = '0.02'; ############################################################################## # constants # todo: make SIG_ON == SIG_STATE_0 and SIG_OFF == SIG_STATE_1 sub SIG_ON () { 1; } sub SIG_OPEN () { 1; } sub SIG_UP () { 1; } sub SIG_RIGHT () { 1; } sub SIG_OFF () { -1; } sub SIG_CLOSE () { -1; } sub SIG_DOWN () { -1; } sub SIG_LEFT () { -1; } sub SIG_FLIP () { 0; } # these don't need a state since they are not passed along sub SIG_ACTIVATE () { 2; } sub SIG_DEACTIVATE () { -2; } sub STATE_0 () { 0; } sub STATE_1 () { 1; } sub STATE_2 () { 2; } sub STATE_3 () { 3; } sub STATE_4 () { 4; } sub STATE_5 () { 5; } sub STATE_6 () { 6; } sub STATE_7 () { 7; } sub STATE_8 () { 8; } sub STATE_9 () { 9; } sub STATE_10 () { 10; } sub STATE_11 () { 11; } sub STATE_12 () { 12; } sub STATE_13 () { 13; } sub STATE_14 () { 14; } sub STATE_15 () { 15; } sub SIG_STATE_0 () { 100; } sub SIG_STATE_1 () { 101; } sub SIG_STATE_2 () { 102; } sub SIG_STATE_3 () { 103; } sub SIG_STATE_4 () { 104; } sub SIG_STATE_5 () { 105; } sub SIG_STATE_6 () { 106; } sub SIG_STATE_7 () { 107; } sub SIG_STATE_8 () { 108; } sub SIG_STATE_9 () { 109; } sub SIG_STATE_10 () { 110; } sub SIG_STATE_11 () { 111; } sub SIG_STATE_12 () { 112; } sub SIG_STATE_13 () { 113; } sub SIG_STATE_14 () { 114; } sub SIG_STATE_15 () { 115; } sub SIG_NOW_0 () { 200; } sub SIG_NOW_1 () { 201; } sub SIG_NOW_2 () { 202; } sub SIG_NOW_3 () { 203; } sub SIG_NOW_4 () { 204; } sub SIG_NOW_5 () { 205; } sub SIG_NOW_6 () { 206; } sub SIG_NOW_7 () { 207; } sub SIG_NOW_8 () { 208; } sub SIG_NOW_9 () { 209; } sub SIG_NOW_10 () { 210; } sub SIG_NOW_11 () { 211; } sub SIG_NOW_12 () { 212; } sub SIG_NOW_13 () { 213; } sub SIG_NOW_14 () { 214; } sub SIG_NOW_15 () { 215; } sub SIG_DIE () { 1000; } sub SIG_KILLED () { 1001; } sub STATE_ON () { 1; } sub STATE_OPEN () { 1; } sub STATE_UP () { 1; } sub STATE_RIGHT () { 1; } sub STATE_OFF () { 0; } sub STATE_CLOSED () { 0; } sub STATE_DOWN () { 0; } sub STATE_LEFT () { 0; } sub SIG_UNKNOWN () { 99999; } sub STATE_FLIP () { -1; } sub SIG_LEVEL_WON () { 10; } sub SIG_LEVEL_LOST () { -10; } use vars qw/$sig_names $sig_codes/; BEGIN { $sig_names = { SIG_LEVEL_WON() => 'SIG_LEVEL_WON', SIG_LEVEL_LOST() => 'SIG_LEVEL_LOST', SIG_FLIP() => 'SIG_FLIP', SIG_DIE() => 'SIG_DIE', SIG_KILLED() => 'SIG_KILLED', SIG_ACTIVATE() => 'SIG_ACTIVATE', SIG_DEACTIVATE() => 'SIG_DEACTIVATE', SIG_ON() => 'SIG_ON', SIG_OFF() => 'SIG_OFF', SIG_STATE_0() => 'SIG_STATE_0', SIG_STATE_1() => 'SIG_STATE_1', SIG_STATE_2() => 'SIG_STATE_2', SIG_STATE_3() => 'SIG_STATE_3', SIG_STATE_4() => 'SIG_STATE_4', SIG_STATE_5() => 'SIG_STATE_5', SIG_STATE_6() => 'SIG_STATE_6', SIG_STATE_7() => 'SIG_STATE_7', SIG_STATE_8() => 'SIG_STATE_8', SIG_STATE_9() => 'SIG_STATE_9', SIG_STATE_10() => 'SIG_STATE_10', SIG_STATE_11() => 'SIG_STATE_11', SIG_STATE_12() => 'SIG_STATE_12', SIG_STATE_13() => 'SIG_STATE_13', SIG_STATE_14() => 'SIG_STATE_14', SIG_STATE_15() => 'SIG_STATE_15', SIG_NOW_0() => 'SIG_NOW_0', SIG_NOW_1() => 'SIG_NOW_1', SIG_NOW_2() => 'SIG_NOW_2', SIG_NOW_3() => 'SIG_NOW_3', SIG_NOW_4() => 'SIG_NOW_4', SIG_NOW_5() => 'SIG_NOW_5', SIG_NOW_6() => 'SIG_NOW_6', SIG_NOW_7() => 'SIG_NOW_7', SIG_NOW_8() => 'SIG_NOW_8', SIG_NOW_9() => 'SIG_NOW_9', SIG_NOW_10() => 'SIG_NOW_10', SIG_NOW_11() => 'SIG_NOW_11', SIG_NOW_12() => 'SIG_NOW_12', SIG_NOW_13() => 'SIG_NOW_13', SIG_NOW_14() => 'SIG_NOW_14', SIG_NOW_15() => 'SIG_NOW_15', }; $sig_codes = {}; # reverse map foreach my $key (keys %$sig_names) { $sig_codes->{ $sig_names->{$key} } = $key; } } ############################################################################## # methods sub invert { shift if ref($_[0]) || $_[0] eq 'Games::3D::Signal'; my $signal = shift; $signal = -$signal if abs($signal < SIG_STATE_0); $signal; } sub signal_from_state { my $state = shift; SIG_NOW_0 + $state; # 0 => 100, 1 => 101 etc } sub signal_name { my $sig = shift; my $s = $sig_names->{$sig} || 'SIG_UNKNOWN'; $s ."($sig)"; } sub signal_by_name { my $sig = shift; $sig_codes->{$sig} || SIG_UNKNOWN; } sub state_from_signal { my $sig = shift; if ($sig == SIG_ON) { $sig = STATE_ON; } elsif ($sig == SIG_OFF) { $sig = STATE_OFF; } elsif ($sig == SIG_FLIP) { $sig = STATE_FLIP; } else { $sig -= SIG_STATE_0; } $sig; } 1; __END__ =pod =head1 NAME Games::3D::Signal - export the signal and state names =head1 SYNOPSIS use Games::3D::Signal qw/SIG_ON SIG_OFF/; $signal = Games::3D::Signal->invert($signal) if $signal == SIG_ON; =head1 EXPORTS Exports nothing on default. Can export signal and state names like: SIG_ON SIG_UP SIG_OPEN SIG_OFF SIG_CLOSE SIG_DOWN SIG_FLIP SIG_DIE SIG_ACTIVATE SIG_DEACTIVATE SIG_LEFT SIG_RIGHT STATE_ON STATE_UP STATE_OPEN STATE_OFF STATE_CLOSED STATE_DOWN SIG_KILLED SIG_LEVEL_WON SIG_LEVEL_LOST invert STATE_0 STATE_1 STATE_2 STATE_3 STATE_4 STATE_5 STATE_6 STATE_7 STATE_8 STATE_9 STATE_10 STATE_11 STATE_12 STATE_13 STATE_14 STATE_15 SIG_STATE_0 SIG_STATE_1 SIG_STATE_2 SIG_STATE_3 SIG_STATE_4 SIG_STATE_5 SIG_STATE_6 SIG_STATE_7 SIG_STATE_8 SIG_STATE_9 SIG_STATE_10 SIG_STATE_11 SIG_STATE_12 SIG_STATE_13 SIG_STATE_14 SIG_STATE_15 SIG_NOW_0 SIG_NOW_1 SIG_NOW_2 SIG_NOW_3 SIG_NOW_4 SIG_NOW_5 SIG_NOW_6 SIG_NOW_7 SIG_NOW_8 SIG_NOW_9 SIG_NOW_10 SIG_NOW_11 SIG_NOW_12 SIG_NOW_13 SIG_NOW_14 SIG_NOW_15 =head1 DESCRIPTION This package just exports the signal and state names on request. =head1 METHODS =over 2 =item invert() $signal = Games::3D::Signal::invert($signal); Invert a signal when the signal is SIG_ON or SIG_OFF (or one of it's aliases like RIGHT, LEFT, UP, DOWN, CLOSE, or OPEN), =item signal_name() print Games::3D::Signal::signal_name($signal); Return the name of the signal. =item signal_from_state() print Games::3D::Signal::signal_from_state($state); Return the signal that should be send out when the C<$state> is reached. =item state_from_signal() print Games::3D::Signal::state_from_signal($signal); Given a signal like C, C or C, will return the new state that will result from receiving this signal. =item signal_by_name() my $signal = Games::3D::Signal::signal_by_name('SIG_FLIP'); Converts a signal name to the signal number. =back =head1 AUTHORS (c) 2002 - 2004, 2006 Tels =head1 SEE ALSO L, L. =cut