2013-10-28 20:00:20 +00:00
// Copyright (C) 2013 Massachusetts Institute of Technology
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 2,
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
'use strict' ;
2013-11-01 22:44:51 -04:00
var LooksPrims = function ( ) { } ;
2013-10-28 20:00:20 +00:00
LooksPrims . prototype . addPrimsTo = function ( primTable ) {
2013-11-14 22:21:49 -05:00
primTable [ 'show' ] = this . primShow ;
primTable [ 'hide' ] = this . primHide ;
2013-10-28 20:00:20 +00:00
2013-11-14 22:21:49 -05:00
primTable [ 'nextCostume' ] = this . primNextCostume ;
primTable [ 'lookLike:' ] = this . primShowCostume ;
primTable [ 'costumeIndex' ] = this . primCostumeNum ;
2013-10-28 20:00:20 +00:00
2013-11-14 22:21:49 -05:00
primTable [ 'nextScene' ] = this . primNextCostume ;
primTable [ 'showBackground:' ] = this . primShowCostume ;
primTable [ 'backgroundIndex' ] = this . primCostumeNum ;
2013-10-28 20:00:20 +00:00
2013-11-14 22:21:49 -05:00
primTable [ 'startScene' ] = this . primStartScene ;
primTable [ 'backgroundIndex' ] = this . primCostumeNum ;
2013-10-28 20:00:20 +00:00
2013-11-14 22:21:49 -05:00
primTable [ 'changeSizeBy:' ] = this . primChangeSize ;
primTable [ 'setSizeTo:' ] = this . primSetSize ;
primTable [ 'scale' ] = this . primSize ;
2013-10-28 20:00:20 +00:00
2013-11-14 22:21:49 -05:00
primTable [ 'comeToFront' ] = this . primGoFront ;
primTable [ 'goBackByLayers:' ] = this . primGoBack ;
2013-10-28 20:00:20 +00:00
2013-11-14 22:21:49 -05:00
primTable [ 'changeGraphicEffect:by:' ] = this . primChangeEffect ;
primTable [ 'setGraphicEffect:to:' ] = this . primSetEffect ;
primTable [ 'filterReset' ] = this . primClearEffects ;
2013-11-01 22:44:51 -04:00
2013-11-14 22:21:49 -05:00
primTable [ 'say:' ] = function ( b ) { showBubble ( b , 'say' ) ; } ;
primTable [ 'say:duration:elapsed:from:' ] = function ( b ) { showBubbleAndWait ( b , 'say' ) ; } ;
primTable [ 'think:' ] = function ( b ) { showBubble ( b , 'think' ) ; } ;
primTable [ 'think:duration:elapsed:from:' ] = function ( b ) { showBubbleAndWait ( b , 'think' ) ; } ;
2013-11-01 22:44:51 -04:00
} ;
2013-10-28 20:00:20 +00:00
LooksPrims . prototype . primShow = function ( b ) {
interp . targetSprite ( ) . setVisible ( true ) ;
interp . redraw ( ) ;
2013-11-01 22:44:51 -04:00
} ;
2013-10-28 20:00:20 +00:00
LooksPrims . prototype . primHide = function ( b ) {
2013-11-01 22:44:51 -04:00
interp . targetSprite ( ) . setVisible ( false ) ;
2013-10-28 20:00:20 +00:00
interp . redraw ( ) ;
2013-11-01 22:44:51 -04:00
} ;
2013-10-28 20:00:20 +00:00
LooksPrims . prototype . primNextCostume = function ( b ) {
interp . targetSprite ( ) . showCostume ( interp . targetSprite ( ) . currentCostumeIndex + 1 ) ;
interp . redraw ( ) ;
2013-11-01 22:44:51 -04:00
} ;
2013-10-28 20:00:20 +00:00
LooksPrims . prototype . primShowCostume = function ( b ) {
var s = interp . targetSprite ( ) ;
if ( s == null ) return ;
var arg = interp . arg ( b , 0 ) ;
if ( typeof ( arg ) == 'number' ) {
s . showCostume ( arg - 1 ) ;
} else {
2013-11-14 22:21:49 -05:00
if ( ( arg == 'CAMERA' ) || ( arg == 'CAMERA - MIRROR' ) ) {
2013-10-28 20:00:20 +00:00
s . showCostumeNamed ( arg ) ;
return ;
}
var i = s . indexOfCostumeNamed ( arg ) ;
if ( i >= 0 ) {
s . showCostume ( i ) ;
} else {
2013-11-02 00:38:29 -05:00
var n = parseInt ( arg , 10 ) ;
if ( n === n ) { // if n is not NaN
2013-10-28 20:00:20 +00:00
s . showCostume ( n - 1 ) ;
} else {
return ; // arg did not match a costume name nor is a valid number
}
}
}
if ( s . visible ) interp . redraw ( ) ;
2013-11-01 22:44:51 -04:00
} ;
2013-10-28 20:00:20 +00:00
LooksPrims . prototype . primStartScene = function ( b ) {
var s = runtime . stage ;
var arg = interp . arg ( b , 0 ) ;
if ( typeof ( arg ) == 'number' ) {
s . showCostume ( arg - 1 ) ;
} else {
2013-11-14 22:21:49 -05:00
if ( ( arg == 'CAMERA' ) || ( arg == 'CAMERA - MIRROR' ) ) {
2013-10-28 20:00:20 +00:00
s . showCostumeNamed ( arg ) ;
return ;
}
var i = s . indexOfCostumeNamed ( arg ) ;
if ( i >= 0 ) {
s . showCostume ( i ) ;
} else {
2013-11-02 00:38:29 -05:00
var n = parseInt ( arg , 10 ) ;
if ( n === n ) { // fast !isNaN check
2013-10-28 20:00:20 +00:00
s . showCostume ( n - 1 ) ;
} else {
return ; // arg did not match a costume name nor is a valid number
}
}
}
if ( s . visible ) interp . redraw ( ) ;
2013-11-01 22:44:51 -04:00
} ;
2013-10-28 20:00:20 +00:00
LooksPrims . prototype . primCostumeNum = function ( b ) {
var s = interp . targetSprite ( ) ;
2013-11-01 22:44:51 -04:00
return s == null ? 1 : s . currentCostumeIndex + 1 ;
} ;
2013-10-28 20:00:20 +00:00
LooksPrims . prototype . primChangeSize = function ( b ) {
var s = interp . targetSprite ( ) ;
if ( s == null ) return ;
2013-11-02 00:38:29 -05:00
s . setSize ( s . getSize ( ) + interp . numarg ( b , 0 ) ) ;
2013-10-28 20:00:20 +00:00
if ( s . visible ) interp . redraw ( ) ;
2013-11-01 22:44:51 -04:00
} ;
2013-10-28 20:00:20 +00:00
LooksPrims . prototype . primSetSize = function ( b ) {
var s = interp . targetSprite ( ) ;
if ( s == null ) return ;
2013-11-02 00:38:29 -05:00
s . setSize ( interp . numarg ( b , 0 ) ) ;
2013-10-28 20:00:20 +00:00
if ( s . visible ) interp . redraw ( ) ;
2013-11-01 22:44:51 -04:00
} ;
2013-10-28 20:00:20 +00:00
LooksPrims . prototype . primSize = function ( b ) {
var s = interp . targetSprite ( ) ;
if ( s == null ) return 100 ;
return s . getSize ( ) ;
2013-11-01 22:44:51 -04:00
} ;
2013-10-28 20:00:20 +00:00
LooksPrims . prototype . primGoFront = function ( b ) {
var s = interp . targetSprite ( ) ;
runtime . reassignZ ( s , null ) ;
2013-11-01 22:44:51 -04:00
if ( s . visible ) interp . redraw ( ) ;
} ;
2013-10-28 20:00:20 +00:00
LooksPrims . prototype . primGoBack = function ( b ) {
var s = interp . targetSprite ( ) ;
2013-11-02 00:38:29 -05:00
runtime . reassignZ ( s , interp . numarg ( b , 0 ) ) ;
2013-10-28 20:00:20 +00:00
if ( s . visible ) interp . redraw ( ) ;
2013-11-01 22:44:51 -04:00
} ;
2013-11-02 10:19:44 -04:00
LooksPrims . prototype . primChangeEffect = function ( b ) {
var s = interp . targetSprite ( ) ;
2013-11-14 23:44:00 -05:00
s . filters [ interp . arg ( b , 0 ) ] += interp . numarg ( b , 1 ) ;
s . updateFilters ( ) ;
} ;
2013-10-28 20:00:20 +00:00
2013-11-02 10:19:44 -04:00
LooksPrims . prototype . primSetEffect = function ( b ) {
var s = interp . targetSprite ( ) ;
2013-11-14 23:44:00 -05:00
s . filters [ interp . arg ( b , 0 ) ] = interp . numarg ( b , 1 ) ;
s . updateFilters ( ) ;
} ;
2013-10-28 20:00:20 +00:00
2013-11-02 10:19:44 -04:00
LooksPrims . prototype . primClearEffects = function ( b ) {
2013-11-14 23:44:00 -05:00
var s = interp . targetSprite ( ) ;
s . resetFilters ( ) ;
s . updateFilters ( ) ;
} ;
2013-10-28 20:00:20 +00:00
var showBubble = function ( b , type ) {
var s = interp . targetSprite ( ) ;
2014-03-09 11:59:38 -06:00
if ( s !== null ) s . showBubble ( interp . arg ( b , 0 ) , type ) ;
2013-11-01 22:44:51 -04:00
} ;
2013-10-28 20:00:20 +00:00
var showBubbleAndWait = function ( b , type ) {
var s = interp . targetSprite ( ) ;
2014-03-09 11:59:38 -06:00
if ( s === null ) return ;
2013-10-28 20:00:20 +00:00
if ( interp . activeThread . firstTime ) {
var text = interp . arg ( b , 0 ) ;
2013-11-02 00:38:29 -05:00
var secs = interp . numarg ( b , 1 ) ;
2013-10-28 20:00:20 +00:00
s . showBubble ( text , type ) ;
if ( s . visible ) interp . redraw ( ) ;
interp . startTimer ( secs ) ;
} else {
if ( interp . checkTimer ( ) ) s . hideBubble ( ) ;
}
2013-11-01 22:44:51 -04:00
} ;