!---------------------------------------------------------------------------
!  Movie.H              An Inform 6.0 library to put non-interactive
!   Version 3           "cut scenes" into a game.  By L. Ross Raszewski
!                       Requires utility.h and the altmenu suite
!                       (altmenu.h, domenu.h)
!
! (major revision, with object-orientation, v6 friendliness, no globals,
!  and use of new domenu features)
!
! I know what you're thinking.  You're thinking, "non-interactive cut scenes"?
! What would I want a thing like that for?  Well, It may at times be useful,
! or at least novel, to have the player suddenly be stopped and watch a sort
! of anecdote.  It could be used for an introduction, and endgame, or a
! flashback.  The player may, if they wish, choose not to view movies
! automatically.  This library allows players to review movies they have
! already seen.
!
! Usage:
! Moviesystem.play(movie name);
! Call moviesystem.Play(movie,1) if you want the movie to play regardless of
! autoplay and replay settings!)
!
! Movies are provided as members of the "movie" class.  these will be moved
! into the moviesystem object when they are played. movies in the "moviesystem"
! object will appear on the movie menu. (you can move separators to the menu,
! for example, to denote section breaks)
! The first time a call to Play a Movie is made, if you have a footnote
! library installed (especially mine) define the constant MovieNote with a
! value equal to one of your footnotes, and that footnote will be called.
! (To alert players to the fact that they can watch movies later).
! If the moviesystem does not have the "on" attribute, movies will not
! be shown, but
! a message will alert players to the fact that one is being played.
! If the propery .replay of the system is set to 0, the movie will
! only play the first
! time it is callled, and the alert message will be shown all subsequent
! times.
!
! The "movie" proper should be handled by the description property of the
! movie-class item.
!
! Typing "Movie" will bring up the movie menu.  The names of viewed movies will
! appear in the same order as the player saw them, and the player can view his
! choice of movie.  "Movie On" and "Movie Off" will enable and disable movie
! autoplaying. (A verb to change the replay mode is "left as an exercise to the
! reader")
!
!
! Questions, Comments, bugs, e-mail me at [email protected]



Class movie
       class Option,
       with play [; self.description(); ];

Menu MovieSystem "Movies"
with play [ movie flag flg i;
             self.mtbp=movie;
             #IFDEF MovieNote;
              if (self hasnt general) { Note(MovieNote);
                       new_line; give self general;}
             #ENDIF;

             if (flag ~= 1 &&(self hasnt on || (movie in self && self.replay==0)))
             {
              style underline; print "^^[Movie: ", (name) Movie, "]^^";
              style roman;
              if (movie notin self) pmove(movie, self);
             rtrue;
             }
             if (flg==0) {
               WaitForKey("^^^Press [SPACE]");
               @erase_window -1;
              }

   #ifdef V6DEFS_H;
   i = StatusWin.GetCharHeight();
   @split_window i;
   #ifnot;
   @split_window 1;
   #endif;
   i = 0->33; if (i==0) i=80;
   #ifndef V6DEFS_H;
   @set_window 1;
   LocateCursor(1,1);
   style reverse; spaces(i);
   #ifnot;
   StatusWin.Activate();
   LocateCursor(1,1);
   StatusWin.SetColours(MainWin.GetBGColour(),
                        MainWin.GetFGColour());
   StatusWin.Erase();
   #endif;
             CenterU(self.pmtitle,1);
             style roman;
             #ifdef V6DEFS_H;
             Mainwin.activate();
             #ifnot;
             @set_window 0;
             #endif;
             new_line; new_line;
             movie.play();
             if (flg==0){
               WaitForKey("^^^Press [SPACE]");
               @erase_window -1;
               Drawstatusline();
             }
             if (movie notin self) Pmove(movie, self);
             new_line; new_line; new_line;
           ],
           mtbp 0,
           banner_tags "N=Next" PKEY__TX RKEY__TX QKEY1__TX QKEY2__TX 12 17,
           pmtitle [; print (name) self.mtbp;],
           replay 1,
           has on;

[ MovieMenuSub;
       MovieSystem.select();
];
[ TurnOffMSub;
 give MovieSystem ~on;
 "[Movie autoplay disabled.]";
];
[ TurnOnMSub;
 give MovieSystem on;
 "[Movie autoplay enabled.]";
];

verb meta "movies" "movie" *            -> MovieMenu
                       * "off"         -> TurnOffM
                       * "on"          -> TurnOnM;

#Ifdef DEBUG;
[ PlayFilmSub;
       if (noun ofclass movie)
       MovieSystem.play(noun);
       ];
[ Films x;
       objectloop (x ofclass Movie) { PlaceInScope(x);};
];
Extend "movie"          * scope=Films -> PlayFilm;
#EndIf;